【问题标题】:bootstrap accordions with inner accordion with different shown.bs.collapse events带有内部手风琴的引导手风琴,具有不同的显示.bs.collapse 事件
【发布时间】:2015-09-18 07:22:09
【问题描述】:

我有一个带有内部手风琴的 bootstrap 手风琴。我遇到的问题是,当我点击内部手风琴时,外部手风琴绑定到的“shown.bs.collapse”事件被触发,这不应该是这种情况,我想绑定内部面板如果可能的话,到它自己的 shown.bs.collapse 事件?

为了给你一个更好的主意,我有以下几点:-

$('#accordion').on('shown.bs.collapse', function (e) {

    GetData(param1, param2);
})

GetData 是一个执行 ajax 调用并将内部手风琴附加到外部手风琴的函数。外部手风琴ID 是#accordion。这很好用,但是当我点击我给它的 ID 为#accordion2 的内部手风琴时,上面的代码再次被调用。有人可以指出我正确的方向吗?

为了更好地理解手风琴的结构...我有一个 mvc 视图,其中包含以下内容:-

    <div id="accordion" class="panel-group accordion" style="margin-top:20px">

    </div>

然后我通过 javascript 函数动态构建其余部分。以下函数创建外部手风琴面板:

函数 GetGroups() {

$.ajax({
    url: url,
    dataType: "JSON",
    contentType: "application/json; charset=utf-8",
    success: function (data) {

        $.each(data.data, function (index, item) {

            var collapseContainer = 'collapse' + accordingIndexes[index];
            var mkContainer = 'testContainer' + index;

            $("#accordion").append('<div class="panel panel-default">\
        <div class="panel-heading ">\
            <h4 class="panel-title">\
                <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion"  href="#' + collapseContainer + '">'
                   + item.Name + ' - ' + item.Value +
                '</a>\
            </h4>\
        </div>\
        <div id="' + collapseContainer + '" class="panel-collapse collapse">\
            <div id="' + mkContainer + '" class="panel-body border-red" data-source-id="' + item.Id + '">\
            </div>\
        </div>\
    </div>');

        });
    }
});

}

'shown.bs.collapse' 中调用的 GetData 函数如下所示:

函数GetData(testContainer) {

$.ajax({
    url: url,
    dataType: "JSON",
    contentType: "application/json; charset=utf-8",
    success: function (data) {

        $.each(data.data, function (index, item) {

            var collapseContainer = 'collapseInner' + accordingIndexes[index];

            $("#" + testContainer).append('<div class="accordion-inner">\
                <div class="accordion" id="accordion2">\
                <div class="panel panel-default">\
        <div class="panel-heading ">\
            <h4 class="panel-title">\
                <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" data-source-id="' + item.Id + '" href="#' + collapseContainer + '">'
                   + item.SourceName + 
                '</a>\
            </h4>\
        </div>\
        <div id="' + collapseContainer + '" class="panel-collapse collapse">\
            <div class="panel-body border-red">\
                    TEST\
            </div>\
        </div>\
    </div>\
    </div>\
    </div>');

        });
    }
});

}

现在,当我尝试将#accordion2 绑定到它自己的事件时,它没有被触发,#accordion 的一个被触发了。请问有什么想法吗?

$('#accordion2').on('shown.bs.collapse', function (e) {

    console.log('test2');
})

【问题讨论】:

    标签: javascript jquery twitter-bootstrap jquery-ui accordion


    【解决方案1】:

    由于您的 #accordion2 是动态添加的,因此您需要在此处使用名为 event delegation 的内容,因此您可能需要使用以下代码:

    $(document).on('shown.bs.collapse', '#accordion2', function (e) {
      console.log('test2');
    })
    

    您可以将$(document) 替换为#accordion2 的某个最近的父级element,该父级存在于page load 上,并且不通过ajax 加载

    【讨论】:

    • 感谢您的回复,我将#accordion2 的showed.bs.collapse 放入ajax 成功,console.log 成功触发。但是另一个问题仍然存在,#accordion shown.bs.collapse 仍然被触发
    • 您将accordion 附加到另一个accordion 中,这也可能触发您的父母event,所以您只需要在上述事件中添加e.stopPropagation() 我可能会停止event 正在遍历到 parent。试一次..
    • 你刚刚让我的一天像魅力一样工作!非常感谢!!
    • 任何时候..快乐编码..:)
    猜你喜欢
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多