stopPropagation и startPropagation

Я хочу сделать дополнительный обработчик клика (страница клиента, не могу изменить его js/html), и он должен работать следующим образом в моем скрипте:

1) event.stopPropagation (event.stopPropagation паузе)
2) моя функция (выполняйте мою функцию, когда все будет сделано дальше)
3) event.startPropagation (продолжить стандартное действие клиента)

Прямо сейчас, первая и вторая работа. Третья проблема.
Я знаю event.startPropagation не существует, но я хочу что-то вроде этого. Любые намеки?

Ответ 1

Вы можете повторно запустить один и тот же объект событий на родительском узле 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
});

ДЕМО: http://jsfiddle.net/BGuU3/1/

Ответ 2

Не прекращайте распространение в первую очередь.

Проверьте, my function ли my function то, что вы хотите, а затем решите, собираетесь ли вы прекратить распространение или нет.

Ответ 3

Добавьте и удалите обработчик кликов, если вы хотите включить/отключить событие клика соответственно. Поскольку event.stopPropagation() остановит события от распространения дерева event.stopPropagation().

Обновить:

Если вы используете jQuery, используйте .trigger().

http://api.jquery.com/trigger/