【问题标题】:jQuery nested click handerjQuery 嵌套点击处理程序
【发布时间】:2015-10-02 06:04:04
【问题描述】:

我有以下标记代表 bootstrap 选项卡元素:

<div id="someDivID">

    <!-- Nav tabs -->
    <ul class="nav nav-tabs" role="tablist">
        <li><a href="#">Tab 1</a></li>
        <li><a href="#">Tab 2</a></li>
        <li><a href="#">Tab 3</a></li>
    </ul>

    <div class="tab-content">
        <div role="tabpanel" class="tab-pane active" id="theTabContent">
        </div>
    </div>
</div>

我在javascript/jQuery中绑定click-event如下

var $theDiv = $("#someDivId");
$theDiv.on("click", "ul li a", handleClickEvent);

由于选项卡的内容是稍后动态呈现/添加的,因此我将拥有例如#theTabContent div 内的bootstrap 下拉菜单:(取自文档)

<div class="dropdown">
    <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">Dropdown</button>
    <ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
        <li>
            <a href="#">Action</a>
        </li>
        <li>
            <a href="#">Another action</a>
        </li>
        <li>
            <a href="#">Something else here</a>
        </li>
        <li>
            <a href="#">Separated link</a>
        </li>
    </ul>
</div>

由于嵌套的 ul>li>a 在更改下拉列表的值时调用handleClickEvent 函数(这显然不是故意的)。 我怎样才能避免这种行为?

两者之间的区别(如果有的话)是什么

$theDiv.on("click", "ul li a", handleClickEvent);

$theDiv.find("ul li a").on("click", handleClickEvent);

?

显然,第二个(查找)只会捕捉到选项卡锚点的有意点击。 不好意思问。但是,我不明白这里的意思。

【问题讨论】:

    标签: jquery performance events twitter-bootstrap-3


    【解决方案1】:

    您可以将点击事件限制为仅与选项卡相关的事件:

    var $theDiv = $("#someDivId");
    $theDiv.on("click", ".nav-tabs", handleClickEvent);
    

    在这种情况下,它不会对下拉菜单中的点击做出反应。

    【讨论】:

    • 好的。但是为什么$theDiv.find("ul li a").on("click", handleClickEvent); 也能正常工作?那么性能呢?有什么重要的区别吗?
    • $theDiv.find("ul li a").on("click", handleClickEvent) 有效,因为当您绑定点击事件时,&lt;ul class="nav nav-tabs" role="tablist"&gt; 在 DOM 中,但 dropdwon 还没有。 $theDiv.on("click", ".nav-tabs", handleClickEvent); 更有效,因为它只有一个事件处理程序,而在每个 ul li a 上都有处理程序的情况下是 3 个。
    • 知道了。现在这完全有道理。谢谢。将继续您的解决方案
    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多