Я работаю над кодом обработки событий для библиотеки Javascript и пытаюсь реализовать нечто похожее на stopImmediatePropagation (), которое также будет работать в IE 6.
То, как в настоящее время работает обработка событий, заключается в том, что наш код обработки событий регистрируется в объекте, а затем пользователи регистрируют все свои события в наших обработчиках событий.
Первый способ, которым я пытался эмулировать stopImmediatePropagation (), был просто добавить этот метод к событию, если его еще не было:
if (event != null && event.isImmediatePropagationEnabled == null) {
event.stopImmediatePropagation = function () {
this.isImmediatePropagationEnabled = false;
};
event.isImmediatePropagationEnabled = true;
event.isImmediatePropagationStopped = function () {
return !this.isImmediatePropagationEnabled;
};
}
Когда вызываются обратные вызовы обработчика событий пользователя, они передаются в том же объекте события, который мы получаем. При желании они могут вызвать stopImmediatePropagation () для события.
Поскольку мы перебираем все зарегистрированные обратные вызовы обработки событий, мы проверяем логическое распространение каждый раз:
given some event
for [all the callbacks] {
if (event != null &&
event.isImmediatePropagationStopped != null &&
event.isImmediatePropagationStopped()) {
stopPropagation = true;
break;
}
execute the callback, passing in the event
}
Это прекрасно работает в некоторых браузерах. Поскольку событие сохраняется, даже после того, как наш код обработки события завершается и событие всплывает до следующего элемента, после того, как наш код обработки события получит повторное обращение, свойство isImmediatePropagationStopped все еще существует, и поэтому больше не выполняется никаких обратных вызовов (которые зарегистрированы у нас) .
В Internet Explorer (даже в 8) это не работает. На том же элементе все хорошо; но когда событие всплывает, создается впечатление, что создается совершенно новый объект события, и мы теряем свойство isImmediatePropagationStopped. Это означает, что мы не можем проверить, отключил ли пользователь распространение.
Так что мой вопрос: есть ли у кого-нибудь идеи, как это сделать? Я знаю, что jquery управляет подобным умением (http://bugs.jquery.com/ticket/3355), но они делают это подобным образом - сохраняя его в дополнительных данных для объекта. Чего я не знаю, так это того, что непостоянство объекта не причиняет им вреда, как это мне. (И по разным причинам использование jquery само по себе здесь не вариант)
Если у кого-то есть какие-либо идеи - либо из-за того, что они знают больше о Javascript, чем у меня, либо из-за того, что они могут придумать изящный способ сделать это - я был бы очень признателен. Спасибо!