想象一下,我有这个代码:
var myFunc1 = function(event) {
alert(1);
}
var myFunc2 = function(event) {
alert(2);
}
element.addEventListener('click', myFunc1);
element.addEventListener('click', myFunc2);
Run Code Online (Sandbox Code Playgroud)
当click事件被触发时,调用myFunc1,然后调用myFunc2.但是,如果满足myFunc1中的某些条件,我如何(如果可能的话)停止调用myFunc2? event.stopPropagation()不是解决方案,因为这不是事件捕获/冒泡问题.
谢谢.
还有一个问题:执行事件侦听器的顺序是未定义的.你需要自己处理事件调度以解决这个问题,这导致我们对llimllib的一些建议提出了建议.
function dispatchSleightEvent(evt) {
var listeners = evt.currentTarget.sleightListeners[evt.type];
// can't use for-in because enumeration order is implementation dependent
for (var i=0; i<listeners.length; ++i) {
if (listeners[i]) {
if (! listeners[i].call(evt.currentTarget, evt)) {
return false;
}
}
}
return true;
}
function mixinSleightTarget(obj) {
if (! obj.sleightListeners) {
obj.sleightListeners = {}
obj.addSleightListener = function(type, listener) {
if (!this.sleightListeners[type]) {
this.sleightListeners[type] = [];
this.addEventListener(type, dispatchSleightEvent);
}
if (!this.sleightListeners[type+listener] {
this.sleightListeners[type+listener] = this.sleightListeners[type].length;
this.sleightListeners[type].push(listener);
}
}
obj.removeSleightListener = function(type, listener) {
if (this.sleightListeners[type+listener] {
delete this.sleightListeners[type][this.sleightListeners[type+listener]];
delete this.sleightListeners[type+listener];
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码完全未经测试.要在单个目标上停止事件调度,事件侦听器将返回false.如果你想要更多数据隐藏,你可以从功能编程的角度重写上述内容,尽管这可能会引入内存泄漏.
| 归档时间: |
|
| 查看次数: |
10027 次 |
| 最近记录: |