Запустите функцию, только если событие по умолчанию / не предотвращено

StackOverflow https://stackoverflow.com/questions/4285976

Вопрос

Есть ли способ запустить функцию, только если Event.PreventDefault () вызывается на событии (по другой неизвестной функции). Это для плагина jQuery, поэтому у меня нет знаний о том, какие другие части страницы могут делать. Я пробовал это:

Event.test = Event.preventDefault;
Event.preventDefault = function () {
    alert('Success');
    this.test();
}

Но это не работает ... просто ведет себя как нормально, без ошибок.

И наоборот, я тоже хочу обратное ... вызвать функцию, только если Event.PreventDefault () не вызывается. Существуют, чтобы добавить функцию к действию по умолчанию для события. Любые идеи? Это все это вообще возможно?

Редактировать: На основании комментариев у меня есть решение первой проблемы: http://jsfiddle.net/nathan/vaepb/9/. Отказ Работает в Chrome (предупреждения function preventDefault() { [native code] }, но то есть оповещения undefined. Отказ Итак, то есть не позволит мне определять событие. Прототип. Тест, но он позволит мне переопределить событие. Прототип. Странный. Я уверен, что смогу придумать решение второй проблемы, основанной на этом, если я могу просто получить его на работу в IE.

Это было полезно?

Решение

Для первой проблемы попробуйте что-то вроде этого:

oldPreventDefault = Event.prototype.preventDefault;
Event.prototype.preventDefault = function() {
    //do stuff
    oldPreventDefault.call(this);
}

Я не знаю, будет ли это работать, но это может стоить выстрела.

Для второй проблемы я бы попробовал что-то похожее на обработку живого события. Положите слушатель на родительский элемент (т.е. body или верхний уровень div). Если вы можете получить свой крючок в preventDefault Как отмечалось ранее, вы можете использовать это, чтобы установить флаг. Если события пузырится до этого элемента, и ваш флаг не установлен, выполните ваше расширенное поведение. Хотя это не будет работать со всеми событиями, поскольку не все события пузырь. Другим способом для решения этой проблемы может быть задержка выполнения до тех пор, пока текущий стек не завершится с использованием setTimeout(0,...) а затем проверять флаг.

Другие советы

Я не уверен, что я понимаю. Вы не можете просто использовать event.isDefaultPrevented() нравится это

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top