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似乎对之前的答案感到满意,但他的问题并没有提到永久性的事件失效。