2010-11-26 4 views
4

Есть ли способ запустить функцию только в том случае, если 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] }, но IE предупреждает undefined.Тогда IE не позволит мне определить Event.prototype.test, но он позволит мне переопределить Event.prototype.preventDefault. Я уверен, что могу придумать . решение для второй задачи, основанный на этом, если я могу просто заставить его работать в IE

+2

Вы можете увидеть, что вы можете достичь, баловаться с «preventDefault» на `Event.prototype` вместо` Event` - вероятно, не будет работать в IE, однако – Pointy 2010-11-26 14:14:31

ответ

0

для первой задачи, попробовать что-то вроде этого:

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

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

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

3

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