Запустите функцию, только если событие по умолчанию / не предотвращено
-
28-09-2019 - |
Вопрос
Есть ли способ запустить функцию, только если 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()
нравится это