拉莫斯之舞
不。一旦事件被取消,便被取消。不过,您可以稍后使用标志来确定您的自定义代码是否已经运行,从而重新触发该事件-像这样(请忽略公然的名称空间污染):var lots_of_stuff_already_done = false;$('.button').on('click', function(e) { if (lots_of_stuff_already_done) { lots_of_stuff_already_done = false; // reset flag return; // let the event bubble away } e.preventDefault(); // do lots of stuff lots_of_stuff_already_done = true; // set flag $(this).trigger('click');});更通用的变体(具有避免全局名称空间污染的附加好处)可以是:function onWithPrecondition(callback) { var isDone = false; return function(e) { if (isDone === true) { isDone = false; return; } e.preventDefault(); callback.apply(this, arguments); isDone = true; $(this).trigger(e.type); }}用法:var someThingsThatNeedToBeDoneFirst = function() { /* ... */ } // do whatever you need$('.button').on('click', onWithPrecondition(someThingsThatNeedToBeDoneFirst));额外的超简约jQuery插件,Promise支持:(function( $ ) { $.fn.onButFirst = function(eventName, /* the name of the event to bind to, e.g. 'click' */ workToBeDoneFirst, /* callback that must complete before the event is re-fired */ workDoneCallback /* optional callback to execute before the event is left to bubble away */) { var isDone = false; this.on(eventName, function(e) { if (isDone === true) { isDone = false; workDoneCallback && workDoneCallback.apply(this, arguments); return; } e.preventDefault(); // capture target to re-fire event at var $target = $(this); // set up callback for when workToBeDoneFirst has completed var successfullyCompleted = function() { isDone = true; $target.trigger(e.type); }; // execute workToBeDoneFirst callback var workResult = workToBeDoneFirst.apply(this, arguments); // check if workToBeDoneFirst returned a promise if (workResult && $.isFunction(workResult.then)) { workResult.then(successfullyCompleted); } else { successfullyCompleted(); } }); return this; };}(jQuery));用法:$('.button').onButFirst('click', function(){ console.log('doing lots of work!'); }, function(){ console.log('done lots of work!'); });