Я наткнулся на кусок устаревшего кода плагина YUI3, который пытался внедрить себя в поток на основе событий. По сути, код подписывается на событие X и в обработчике делает что-то вроде следующего:
if (!this._hasDoneStuff) {
doStuff();
event.preventDefault();
fire("theEvent", newEvent);
}
Вызов preventDefault(), похоже, не работал; мероприятие продолжилось в обычном режиме. Мне удалось воспроизвести это на небольшом примере:
var eidCounter = 0;
this.publish("myEvent", {
defaultFn: function (myEvent) {
console.log("default function hit by event " + myEvent.eid);
},
context: this
});
this.on("myEvent", function (myEvent) {
console.log("saw & prevented " + myEvent.eid);
myEvent.preventDefault();
if (myEvent.eid < 3) {
this.fire("myEvent", { eid: eidCounter++ });
} else {
console.log("stopped " + mikeEvent.eid);
}
}, this);
this.fire("myEvent", { eid: eidCounter++ });
Я ожидаю, что это НИКОГДА не запустит функцию по умолчанию, потому что preventDefault()
всегда вызывается. Тем не менее, фактический результат:
обнаружение и предотвращение 0
обнаружение и предотвращение 1
обнаружение и предотвращение 2
обнаружение и предотвращение 3
остановлено 3
функция по умолчанию, вызванная событием 2
функция по умолчанию столкновение с событием 1
функция по умолчанию столкновение с событием 0
Таким образом, preventDefault()
работает только с последним событием в стеке. Это похоже на ошибку, но действительно ли я нарушаю какую-то часть API событий? Есть ли обходной путь?