YUI事件似乎不会递归地工作

时间:2013-11-19 22:32:46

标签: javascript javascript-events yui yui3

我遇到了一段传统的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()。但是,实际输出是:

锯&amp;阻止0 锯和阻止1 锯和阻止2 锯和阻止3 停了3 事件2命中的默认功能 事件1命中的默认函数 默认函数按事件0命中

因此,preventDefault()似乎只对堆栈中的最后一个事件起作用。这似乎是一个错误,但我实际上是否违反了事件API的某些部分?有解决方法吗?

1 个答案:

答案 0 :(得分:0)

不幸的是,YUI一直都是这样做的。尽管从订阅中解雇订阅的事件似乎很奇怪,但它确实看起来像一个bug。您可以在此处提交:https://github.com/yui/yui3/issues