3

在以下情况下遇到问题:

$(document).on("click", ".element", function () {do something}

<div class="element"></div>
<div class="element"></div>
<div class="element" attribute="different"></div> //do something different
<div class="element"></div>

$('.element[attribute="different"]').off();
$(document).on("click", ".element[attribute="different", 
  function () {do something unique}

在这种情况下, .off() 不起作用。有没有办法实现我在这里尝试做的事情?

{{笔记}}

在这种情况下,我无法修改原始的 .on 事件。它内置在我们正在处理的特定事件的系统中。

http://jsfiddle.net/KMrVY/

4

3 回答 3

4

您可以只使用on相关属性开始。有了这个,你不需要使用off. 这是一个JSFiddle ,它准确地展示了如何使用这个东西。

$(document).on('click', '.element[attribute!="different"]', function() {});

这个答案对正在发生的事情提供了一些见解。这是一段摘录:

当使用 .on() 的动态形式(将选择器作为参数传递给 .on())时,不能只删除部分项目。那是因为根元素上只安装了一个事件处理程序,而 jQuery 只能删除整个事件,或者根本不删除。所以,你不能只 .off() 一些动态项目。

他建议的一种方法是针对off整个事件(在您的情况下,在所有事件上.element),然后使用您需要的特定选择器重新创建它。我已经更新了 JSFiddle以显示这一点(尽管获取您需要的处理程序函数并不漂亮)。

如果您有对原始处理函数的引用,它会变得容易得多。

于 2013-06-06T22:45:18.603 回答
2

如果您无法修改原始事件,那么应该可以在文档的某个中间点安装您自己的委托点击处理程序,并通过阻止事件传播来过滤调用:

<div id="whatever">
  <div class="element"></div>
  <div class="element"></div>
  <div class="element" attribute="different"></div>
  <div class="element"></div>
</div>

$(document).on("click", ".element", function () { alert("I 'm untouchable");});

$("#whatever").on("click", ".element", function (event) {
    if ($(this).is("[attribute='different']")) {
        // do something else
        alert("Stop right there!");
        // and stop event propagation
        event.stopPropagation();
    }
});

看到它在行动

您自己的标记可能没有div#whatever,但由于您可以自由地将处理程序附加到文档正文下方的任何位置,只要它是您所针对的元素的祖先,就不应该缺少替代品。

于 2013-06-06T23:22:16.137 回答
1

如果我知道一个或多个会有所不同,我想我会遍历它们。

也许这仅对几个元素效率不高,但如果您有很多元素或不同的元素,它将允许您从 .bind()/.on() 中选择元素。

在这种情况下,对于您想要的东西来说,这可能是矫枉过正。

$('.element').each(function() {
    if ($(this).attr('attribute') === 'whatever') {
        $(this).on('click', function() {/*Do something here*/});
    } else {
        $(this).on('click', function() {/*Do something else for all the others*/});
    }
});
于 2013-06-06T22:58:03.000 回答