动态更改委托事件的事件选择器

时间:2013-11-30 10:39:56

标签: jquery

我想更改委派活动的“即时”选择器。

jsFiddle DEMO

例如,

我使用此HTML:

<div id="div1">DIV1</div>
<div id="div2">DIV2</div>    
<textarea id="result"></textarea>

我为所有DIV 委派点击事件:

$(document).on("click", "div", function () {
    $("#result").append(this.id + ' DIV click\r\n');
});

稍后,我需要 取消绑定特定的DIV 。我可以绑定一个新的委托事件,排除这个特定的DIV并取消绑定以前的委托事件。但是,在我的情况下,我想保留以前的事件,只是更改此事件的选择器,这意味着,即时更改委派事件的event.selector

这是 事件

var delegatedEvent = $._data(document, "events").click;

通过定位 ID属性 (类等等),尝试 排除DIV 有效,我可以使用例如排除#div2

delegatedEvent[0].selector += ":not(#div2)";  // => selector == 'div:not(#div2)'

出于某种原因,我无法使用特定属性定位元素,我需要 使用元素索引

var indexDiv2 = $(delegatedEvent[0].selector).index($("#div2")); // => 1

现在尝试使用 索引排除#div2不起作用

delegatedEvent[0].selector += ":not(:eq("+indexDiv2 +"))";  // => selector == 'div:not(:eq(1))'

看起来匹配的集重新评估(???),如果我使用#div1 index(0) ,这将 排除所有DIV

我被困在这里,需要使用索引来定位特定的DIV,但不能用它来修改委托的事件选择器。

知道如何解决此问题或任何已知原因造成这种意外行为吗?

PS:我可以使用自定义data-*属性(数据索引),但仍然想知道为什么使用:eq()不起作用...

1 个答案:

答案 0 :(得分:1)

为什么不用动态类来处理它?<​​/ p>

$(document).on("click", "div:not(.exclude)", function () {
    $("#result").append(this.id + ' DIV click\r\n');
});

只需将类exclude添加到您想要的元素中?如果你想要它。