Bootstrap TabPanel Tab - 禁用页面滚动到元素的 ID

Posted

技术标签:

【中文标题】Bootstrap TabPanel Tab - 禁用页面滚动到元素的 ID【英文标题】:Bootstrap TabPanel Tab - Disable Page Scrolling To Element's ID 【发布时间】:2014-09-20 19:26:08 【问题描述】:

我的 TabPanel 选项卡的标题由两部分组成:

    复选框 标签的标题

为了显示标签,我使用 jQuery 代码:

$('#myTab a').click(function (e) 
  $(this).tab('show');
);

使用这种代码,每次单击选项卡时页面都会滚动到每个 div。如果我在禁用滚动的$(this).tab('show'); 行之前添加jQuery 代码行e.preventDefault();,那么就会出现第二个问题 - 复选框不再选中/取消选中。

任何想法,如何摆脱这两个问题?

滚动问题示例: http://jsfiddle.net/K9LpL/717/

复选框选中/取消选中问题的示例: http://jsfiddle.net/K9LpL/718/

【问题讨论】:

什么是滚动问题。我找不到它。你能解释一下吗 尝试点击任何标签。如您所见 - 每次单击任何选项卡时页面都会向下滚动。我不希望该页面滚动到锚点 ID,因为每次我单击选项卡时页面都会滚动到确切的 ID,这很烦人。 这方面有什么帮助吗?没人能解决吗? 看看这个。我也更新了你的 html。如果你觉得可行,那就说jsfiddle.net/Amit12x/K9LpL/720 你的复选框有问题。 【参考方案1】:

你可以使用 <a data-target="#home"> 而不是<a href="#home">

查看 jsfiddle 示例 here。

【讨论】:

这应该是公认的答案。连一行代码都没有! @IanBrindley 是的,这绝对是比我更好的解决方案。我想自从一年多之后,OP 就再也没有回来打扰它了。 惊人的答案,希望我可以选择给予双拇指! 即使到 2020 年的 Bootstrap 4,这仍然是这个问题的最佳答案!【参考方案2】:

我的方法(用于nav-pills,但您可以轻松地将pill 替换为tab,稍微修改了@Tricky12 的答案,因为我不喜欢setTimeout 使用褪色选项卡开关:

$(document).ready(function()
    // buffer the last scroll position
    var lastScrollPosition = $(window).scrollTop();

    $('a[data-toggle="pill"]').on('shown.bs.tab', function (e) 
        location.replace($(e.target).attr("href"));
        // revert back to last scroll position
        $(window).scrollTop(lastScrollPosition);
    );

    // switch to the currently selected tab when loading the page
    $('.nav-pills a[href="' + window.location.hash + '"]').tab("show");

    $('a[data-toggle="pill"]').on("click", function(e)
        // buffer the scroll position again
        lastScrollPosition = $(window).scrollTop();
        // show the tab
        $(this).tab('show');
        // prevent default actions
        return false;
    );
);

注意:在 Bootstrap 4.3 上编码,但我想它也适用于旧版本。

【讨论】:

【参考方案3】:

编辑 - 下面罗曼的回答是比这个更好的解决方案。

使用preventDefault(),您可以添加代码来手动切换复选框。

var checked = $(this).find('input').prop('checked');
$(this).find('input').prop('checked', !checked);

Updated Fiddle

编辑:

我决定以另一种方式处理这个问题。不要使用preventDefault(),而是修复滚动问题。我能够通过$(window).scrollTop(0) 和非常非常小的延迟/超时来做到这一点。

$('#myTab a').click(function (e) 
    var scrollHeight = $(document).scrollTop();

    $(this).tab('show');

    setTimeout(function() 
        $(window).scrollTop(scrollHeight );
    , 5);
);

Demo

【讨论】:

这可能是解决方案的一半。我希望仅在单击复选框时复选框也可以工作。 我希望复选框仅在单击复选框时选中和取消选中。当我单击选项卡的标题名称时,我不希望复选框选中和取消选中。 @TomsBugna 我会看看是否能找到解决方法,但问题是当您单击复选框时,锚标记的事件正在触发。这使得在复选框本身上获得点击事件变得困难。 是的,我也注意到了这个。我也尝试过解决它,但我失败了。但我觉得附近的某个地方是这个解决方案,但仍然需要争取并尝试其他一些解决方法。如果您能找到解决方案,我将不胜感激。 @TomsBugna 到目前为止我没有任何运气。看起来复选框不会在锚标记内工作。我们可能不得不切换您的 HTML 以获得您想要的工作。如果我能找到好的解决方案,我会尽快与您联系。【参考方案4】:

我通过添加 e.stopImmediatePropagation(); 解决了这个问题。到事件处理程序:

$('.nav-tabs li a').click(function(e)
  e.preventDefault();
  e.stopImmediatePropagation();
  $(this).tab('show');
);

编辑:根据评论固定类选择器。

【讨论】:

你忘了。在您选择的 .nav-tabs 中 谢谢,乔尔!不敢相信我以前没有注意到那个错字。

以上是关于Bootstrap TabPanel Tab - 禁用页面滚动到元素的 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ExtJs 中单击 TabPanel 中的 Tab 菜单时初始化各个选项卡数据?

bootstrap怎么实现tabpanel切换 关闭 刷新

在Extjs 的 TabPanel在 title标题栏上加按扭button

easyui tab标签页拖拽排序

如何将tabpanel的键从视图传递到控制器asp mvc

extjs 3 - 卡片布局在 tabpanel 中不起作用