【问题标题】:Capturing 'shown' event from bootstrap tab从引导选项卡捕获“显示”事件
【发布时间】:2013-11-13 12:55:53
【问题描述】:

我的页面上有一些“静态”HTML:

<div id="DIVISIONS">
    <ul class="nav nav-tabs" id="DIVISIONTABS">
        @* <li> nodes will be injected here by javascript *@
    </ul>
    <div class="tab-content" id="DIVISIONTABPANES">
        @* <div class="tab-pane"> nodes will be injected here by javascript *@
    </div>
</div>

在页面加载时,我创建了一个选项卡“框架”,即创建引导选项卡和选项卡内容容器。

我通过以下方式触发该过程:

$(window).bind("load", prepareDivisionTabs);

而“prepareDivisionTabs”就是这样做的:

function prepareDivisionTabs() {
    // Retrieve basic data for creating tabs
    $.ajax({
        url: "@Url.Action("GetDivisionDataJson", "League")",
        cache: false
    }).done(function (data) {
        var $tabs = $('#DIVISIONTABS').empty();
        var $panes = $('#DIVISIONTABPANES').empty();
        for (var i = 0; i < data.length; i++) {
            var d = data[i];
            $tabs.append("<li><a href=\"#TABPANE" + d.DivisionId + "\" data-toggle=\"tab\">" + NMWhtmlEncode(d.Name) + "</a></li>");
            $panes.append("<div id=\"TABPANE" + d.DivisionId + "\" class=\"tab-pane\"></div>")
        }
        renderDivisionTabPaneContents(data);
    }).fail(function (err) {
        alert("AJAX error in request: " + JSON.stringify(err, null, 2));
    });
}

关于信息,上面的“renderDivisionTabPaneContents”是这样做的:

function renderDivisionTabPaneContents(data) {
    for (var i = 0; i < data.length; i++) {
        var d = data[i];
        renderDivisionTabPaneContent(d.DivisionId);
    }
}

function renderDivisionTabPaneContent(id) {
    var $tabPane = $('#TABPANE' + id);
    $tabPane.addClass("loader")
    $.ajax({
        url: "/League/GetDivisionPartialView?divisionId=" + id,
        cache: false
    }).done(function (html) {
        $tabPane.html(html);
    }).fail(function (err) {
        alert("AJAX error in request: " + JSON.stringify(err, null, 2));
    }).always(function () {
        $tabPane.removeClass("loader")
    });
}

到目前为止一切顺利。我的页面加载,我的标签内容被渲染,当我点击不同的标签时,相关的内容就会显示出来。

现在,我不想在开始时加载所有内容,而是想通过使用选项卡的“显示”事件即时加载选项卡内容。为了测试这一点,我只想确保在显示选项卡时可以收到一个 javascript 警报。因此,我创建以下内容来触发选项卡显示事件的附件:

$(function () {
    attachTabShownEvents();
})

调用:

function attachTabShownEvents() {
    $(document).on('shown', 'a[data-toggle="tab"]', function (e) {
        alert('TAB CHANGED');
    })
}

因此,我希望在更改选项卡后看到“TAB CHANGED”警报。但是......我没有看到任何警报。

有人可以帮我吗?

【问题讨论】:

  • 你试过用$(prepareDivisionTabs);替换$(window).bind("load", prepareDivisionTabs);吗?
  • 我会试一试并报告,但目前这部分过程似乎很好,因为在“prepareDivisionTabs”期间创建的选项卡工作正常。这只是我尝试添加的后续事件处理程序不起作用。更新:刚刚进行了建议的更改并且行为是相同的(即选项卡在屏幕行为方面起作用,但仍然不会触发“显示”事件)。
  • 哦,我相信事件绑定应该是shown.bs.tab,而不是shown
  • "shown.bs.tab" 破解了!非常感谢“风”。

标签: javascript jquery twitter-bootstrap tabs


【解决方案1】:

标签更改的正确事件绑定是shown.bs.tab

$(document).on('shown.bs.tab', 'a[data-toggle="tab"]', function (e) {
    alert('TAB CHANGED');
})

2020 年 11 月 1 日更新 --- Bootstrap 4.5

这仍然是正确的答案,但是,这是一些额外的有用信息,可以在官方引导文档页面的底部找到:https://getbootstrap.com/docs/4.5/components/navs/#tabs

$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
  e.target // newly activated tab
  e.relatedTarget // previous active tab
})

您可以确定每次使用e.target 触发代码时选择了哪个选项卡。

如果您的元素有唯一的 ID,那么您可以执行以下操作,以便代码仅在单击相应选项卡时运行。

$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
  switch (e.target.id){
      case "mainTab":{
           doMainTabStuff();
           break;
      }
      case "configTab":{
           doConfigTabStuff();
           break;
      }
  }
})

【讨论】:

  • 这是这样做的方法...忽略大多数其他关于 SO 他们不起作用的建议 ;)
  • 你会如何调整它以适用于一个特定的标签?
  • @Richard $(selector).on('shown.bs.tab', function (e) { alert('TAB CHANGED'); })
  • $(selector).on('shown.bs.tab', function (e) { alert('TAB CHANGED'); }) ,这个不适合我
  • $(selector) 是ul元素的父div
【解决方案2】:
<a data-toggle="tab" href="#some_special_tab_anchor">

<div id="some_special_tab_anchor" class="tab-pane fade">
    special tab content
</div>

            $( 'a[data-toggle="tab"]' ).on( 'shown.bs.tab', function( evt ) {

                var anchor = $( evt.target ).attr( 'href' );
                alert("TAB SHOWN = "+anchor);

                // take action based on what tab was shown
               if(anchor === "some_special_tab_anchor"){
                  // do my special thing :)
               }

            });

【讨论】:

  • 很高兴我能帮上忙 :)
【解决方案3】:

在这里使用我的 Nuget 包来延迟加载引导选项卡,非常简单, 只需将“lazyload”类添加到引导选项卡的“ul”元素,然后添加等于 url 的“data-url”以加载到任何选项卡的锚元素 (a)。就是这样。

https://www.nuget.org/packages/MT.BootstrapTabsLazyLoader.js/

【讨论】:

    【解决方案4】:

    'show' 和 'shown' 事件对我不起作用。我的解决方案不完全是 OP 的具体情况,但一般概念是有的。

    我遇到了与引导程序强制其自己的 onclick 事件相同的问题 在选项卡上(菜单按钮和内容面板)。我想根据单击的菜单按钮将内容延迟加载到面板中,并且一些按钮在当前页面上显示面板,其他按钮将页面加载到 iframe 中。

    起初,我将数据填充到隐藏的表单字段标签中,这也是同样的问题。诀窍是检测某种变化并采取行动。我通过强制更改并在按钮上使用备用事件来解决问题,而无需触摸引导程序。

    1) 将 iframe 目标作为数据属性存储在按钮中:

    $('#btn_for_iframe').attr('data-url',iframeurl);
    

    2) 将备用事件绑定到触发事物上, 在里面,换掉 iframe 源

    $('#btn_for_iframe').on('mouseup',function(){
       console.log(this+' was activated');
       $('#iframe').attr('src',$('#btn_for_iframe').attr('data-url'));
    });
    

    3) 在面板显示上强制“更改”事件,然后加载 iframe src

    $('#iframe_panel_wrapper').show().trigger('change');
    

    或者您可以将更改触发器放在上面的 mouseup 中。

    【讨论】:

      【解决方案5】:
      $(document).ready(function(){
          $(".nav-tabs a").click(function(){
              $(this).tab('show');
          });
          $('.nav-tabs a').on('shown.bs.tab', function(event){
              alert('tab shown');
          });
      });
      

      【讨论】:

        猜你喜欢
        • 2017-07-14
        • 1970-01-01
        • 2011-04-08
        • 1970-01-01
        • 2015-03-18
        • 1970-01-01
        • 2013-07-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多