我遇到了一段传统的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的某些部分?有解决方法吗?
答案 0 :(得分:0)
不幸的是,YUI一直都是这样做的。尽管从订阅中解雇订阅的事件似乎很奇怪,但它确实看起来像一个bug。您可以在此处提交:https://github.com/yui/yui3/issues