Вы можете повторно вызвать такой же объект события на родительском узле, 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/
EDIT
Основываясь на ваш комментарий, я думаю, что вы ищете что-то вроде:
$.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 к БД) не успевает выполнить. Я думаю, что его необходимо остановитьPropagation на старте. –
. Вы должны учитывать возможный вред пользователю: пользователь нажимает на что-то, и ничего не происходит до тех пор, пока вызов базы данных не завершится. Хуже того, это может быть долгое время невосприимчивым. – ehdv
Это плохой ответ, потому что остановка распространения часто необходима, когда у вас есть несколько событий, пузырящихся на одном элементе. Именно по этой причине метод существует. – kjdion84