可以重新觸發相同的事件對象的父節點,f.ex(jQuery的)上。您需要先複製事件對象,並把它傳遞到觸發條件才能捕捉到氣球相同的事件屬性(f.ex e.pageX
):
var copy = $.extend(true, {}, e);
setTimeout(function() {
$(copy.target.parentNode).trigger(copy);
},500);
e.stopPropagation();
演示:http://jsfiddle.net/GKkth/
編輯
基於您的評論,我認爲你正在尋找的東西,如:
$.fn.bindFirst = function(type, handler) {
return this.each(function() {
var elm = this;
var evs = $._data(this).events;
if (type in evs) {
var handlers = evs[type].map(function(ev) {
return ev.handler;
});
$(elm).unbind(type).on(type, function(e) {
handler.call(elm, e, function() {
handlers.forEach(function(fn) {
fn.call(elm);
});
});
});
}
});
};
這個原型允許你綁定一個「高級處理程序」,它包含一個next
函數,它可以在你想要的時候執行所有以前的處理程序到同一個元素。 使用它像:
$('button').click(function() {
console.log('first');
}).click(function() {
console.log('second');
}).bindFirst('click', function(e, next) {
console.log('do something first');
setTimeout(next, 1000); // holds the other handlers for 1sec
});
DEMO:http://jsfiddle.net/BGuU3/1/
當我點擊錨,我的功能(GET到DB)還沒有時間來執行。我認爲它必須在開始時停止傳播 –
您應該考慮可能的用戶體驗傷害:用戶單擊某件事物,直到數據庫調用完成纔會發生任何事情。最糟糕的是,這可能是很長時間沒有反應。 – ehdv
這是一個不好的答案,因爲當在同一個元素上冒泡幾個事件時,停止傳播通常是必需的。這是該方法存在的全部原因。 – kjdion84