有没有办法将one()
用于事件委托?比如on()
或live()
,以便它将应用于未在绑定时创建的DOM元素?
答案 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进行演示。