对于尚未创建的某些元素使用.one()(如.live())

时间:2012-05-08 14:39:40

标签: jquery

有没有办法将one()用于事件委托?比如on()live(),以便它将应用于未在绑定时创建的DOM元素?

3 个答案:

答案 0 :(得分:4)

是的,有:

// added in jQuery 1.7
// .one( events [, selector] [, data], handler(eventObject) )
$("div").one("click", "span", function (e) {
   $(this).hide(); 
});

答案 1 :(得分:1)

.on

完全相同
$("#to-bind-to").one('event-type', 'delegated-selector', eventFunction);

答案 2 :(得分:1)

是。来自jQuery .one() docs

  

jQuery 1.7中引入的后两种形式与.on()完​​全相同,只是在委托元素第一次发生事件后删除处理程序,无论选择器是否匹配。例如:

    $("#foo").one("click", function() {
      alert("This will be displayed only once.");
    });
    $("body").one("click", "#foo", function() {
      alert("This displays if #foo is the first thing clicked in the body.");
    });
  

执行代码后,单击ID为foo的元素将显示警告。后续点击将无效。

这意味着,当您使用表单$(el).one('click', '.selector', handler)时,它将像live一样工作 - 事件处理程序绑定到el(必须存在于DOM中),但是事件处理程序仅在.selector点击时执行,无论您在调用.one()期间是否存在该元素。

编辑:似乎jQuery的文档是错误的 - 至少,我解释它的方式。根据上面的alert

  

“如果#foo是在身体中点击的第一件事,则会显示。”

这让我觉得如果在主体中首先点击了其他任何内容,事件处理程序将被删除,并且不会再次触发。情况并非如此 - 事件处理程序将存在,直到单击#foo为止。

请参阅this fiddle进行演示。