запускать функцию, только если событие по умолчанию является / не предотвращено - PullRequest
4 голосов
/ 26 ноября 2010

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

Ответы [ 2 ]

3 голосов
/ 30 ноября 2010

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

0 голосов
/ 27 ноября 2010

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

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

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

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

...