jQuery的One – Fire有多种事件类型
根据一个文件 :
如果第一个参数包含多个以空格分隔的事件类型, 则为每个事件类型调用一次事件处理程序。
有什么方法可以在引发任何事件时触发一个函数吗?
例:
$('input').one('mouseup keyup', function(e){ console.log(e.type); });
我想只调用一次该函数,无论哪个事件触发它。
目前,该function将针对每种事件类型触发一次。
小提琴演示
注意 :我不是在这里寻找
focus
事件……这只是一个例子。
而不是使用.one
,使用.on
并使用.on
手动删除绑定。
$('input').on('mouseup keyup', function(e){ console.log(e.type); $(this).off('mouseup keyup'); });
小提琴: http : //jsfiddle.net/23H7J/3/
这可以通过命名空间更优雅地完成:
$('input').on('mouseup.foo keyup.foo', function(e){ console.log(e.type); $(this).off('.foo'); });
这允许我们使用单个标识符(foo)来删除任意数量的绑定,并且我们不会影响该元素可能具有的任何其他mouseup或keyup绑定。
小提琴: http : //jsfiddle.net/23H7J/41/
很棒的答案! 要将它们包装到函数中,这里是基于当前答案的jQuery扩展:
//The handler is executed at most once per element for all event types. $.fn.once = function (events, callback) { return this.each(function () { $(this).on(events, myCallback); function myCallback(e) { $(this).off(events, myCallback); callback.call(this, e); } }); };
然后像这样打电话:
$('input').once('mouseup keyup', function(e){ console.log(e.type); });
小提琴演示
额外 :这样做的另一个好处是只需通过将原始处理程序传递给off函数来分离此特定函数的处理程序 。 否则,您将需要自定义命名空间。
此外 ,如果您希望处理程序只在任何元素触发任何事件后立即触发一次,然后立即分离自身,那么只需从扩展中删除each
元素,如下所示:
//The handler is executed at most once for all elements for all event types. $.fn.only = function (events, callback) { var $this = $(this).on(events, myCallback); function myCallback(e) { $this.off(events, myCallback); callback.call(this, e); } return this };
你可以添加$('input').off();
到你的function结束。
要开火并继续射击,可以使用以下代码段:
https://jsfiddle.net/wo0r785t/1/
$.fn.onSingle = function(events, callback){ if ("function" == typeof(callback)) { var t = this; var internalCallback = function(event){ $(t).off(events, internalCallback); callback.apply(t, [event]); setTimeout(function(){ $(t).on(events, internalCallback); }, 0); }; $(t).on(events, internalCallback); } return $(this); };
它的工作原理是使用internalCallback
函数暂时禁用事件,并异步( setTimeout
)再次启用它。
此线程中的大多数其他建议会禁用目标上的所有未来事件。 然而,虽然OP似乎对之前的答案感到满意,但他的问题并没有提到永久性的事件失效。