События YUI не работают рекурсивно

Я наткнулся на кусок устаревшего кода плагина 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 событий? Есть ли обходной путь?


person ChaseMedallion    schedule 19.11.2013    source источник


Ответы (1)


К сожалению, YUI всегда работал таким образом. Несмотря на то, что запуск события subscribed из подписки кажется странным, это похоже на ошибку. Вы можете загрузить его здесь: https://github.com/yui/yui3/issues

person Luke    schedule 20.11.2013