按钮点击时,Bootstrap手风琴移除面板

时间:2018-02-27 10:22:33

标签: jquery twitter-bootstrap-3 bootstrap-accordion

我正在使用Bootstrap手风琴,它是根据选择列表选项中的选择选项动态创建的,因此对于所选的每个选项,我都会在现有手风琴上附加一个手风琴组。

除了能够添加面板之外,我还希望能够删除面板。我确实考虑过关闭按钮,但我无法在关闭按钮(跨度)上定位点击事件。

以下是我创建手风琴时输出内容的示例

<div id="menu">
    <div class="panel list-group">
        <a href="#" class="list-group-item default" data-toggle="collapse" data-target="#sm" data-parent="#menu">MESSAGES <span class="label label-info">5</span> <span class="fa fa-close pull-right"></span></a>
        <div id="sm" class="sublinks collapse">
            <div class="list-group-item">
                TEST1
            </div>
            <div class="list-group-item">
                TEST2
            </div>
            <div class="list-group-item">
                TEST3
            </div>
        </div>
    </div>
</div>

我认为单击此元素<span class="fa fa-close pull-right">会导致事件触发,但它永远不会触发。它只是打开/关闭面板作为默认行为。

我确实考虑过尝试使用Jquery来处理手风琴,但这似乎需要付出额外的努力。

我是否需要将我的关闭按钮放在其他地方,或者我错过了任何可以使其工作的东西?

2 个答案:

答案 0 :(得分:0)

$(".fa-close").click(function(){
    $(this).parent().parent().parent().remove();
})

答案 1 :(得分:0)

你应该使用所谓的event delegation 单击事件侦听器/处理程序附加到共同的祖先(在这种情况下为div#menu)。

使用此技术,您通常必须在事件对象event.target属性的帮助下测试原始单击元素,以了解是否应用任何操作。 jQuery通过使on()函数在处理函数之前接受第二个参数(是与目标匹配的选择器)来简化此过程。然后,您只需实施实际操作:在这种情况下,关联的.panel删除。

主要优点是动态添加.panels(事件注册后)也会触发“删除”处理程序。内存中只保留一个功能。

您还必须将span.fa-close置于锚之外并使用一点CSS来防止手风琴折叠行为干扰关闭动作。

示例:

$(function(){
    // When a click happens in the menu and has been triggered
    // by an element having the '.fa-close' applied to it.
    $('#menu').on('click', '.fa-close', function(e){
       // Remove the associated '.panel' element
       $(this).closest('.panel').remove();
    });
});
#menu .panel{position: relative}
#menu .fa-close{position: absolute; right:15px; top:15px; cursor:pointer;}
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<div id="menu">
    <div class="panel list-group">
        <a href="#" class="list-group-item default" data-toggle="collapse" data-target="#sm1" data-parent="#menu">
            MESSAGES <span class="label label-info">5</span>
        </a>
        <div id="sm1" class="sublinks collapse">
            <div class="list-group-item">
                TEST1
            </div>
            <div class="list-group-item">
                TEST2
            </div>
            <div class="list-group-item">
                TEST3
            </div>
        </div>
        <span class="fa fa-close pull-right" title="Remove this entry"></span>
    </div>

    <div class="panel list-group">
        <a href="#" class="list-group-item default" data-toggle="collapse" data-target="#sm2" data-parent="#menu">
          MESSAGES <span class="label label-info">3</span>
        </a>
        <div id="sm2" class="sublinks collapse">
            <div class="list-group-item">
                TEST4
            </div>
            <div class="list-group-item">
                TEST5
            </div>
            <div class="list-group-item">
                TEST6
            </div>
        </div>
        <span class="fa fa-close pull-right"></span>
    </div>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

否则,您必须在每个span上附加一个点击事件处理程序,并且每次将新面板添加到DOM时都会这样做。