我已经定义了onclick事件。我想添加额外的回调函数,该函数将在已定义的回调之前调用。
答案 0 :(得分:1)
如果您对IE使用attachEvent
,则无法保证触发事件的顺序。见http://msdn.microsoft.com/en-us/library/ms536343(VS.85).aspx
如果您附加多个功能 在同一个对象上的相同事件, 函数以随机顺序调用, 在对象的事件之后立即 处理程序被调用。
(我实际上已经看到事件以相反的顺序调用,而不是随机调用)。无论如何,图书馆通常倾向于使用attachEvent
深层次,所以你遇到了同样的问题。
话虽如此,如果您可以检查节点是否有“点击”处理程序(例如,您的标记中节点上有“onclick”属性设置),那么可以放置“你的“领先于他们的”:
var nodes = document.getElementsByTagName('*'); // collect your nodes however
for(var i=0; i < nodes.length; i++) {
var node = nodes[i];
if(!node.onclick)
continue;
// At this point we have a node with an "onclick" attr.
// Hijack onclick to do something else first.
var original = node.onclick;
node.onclick = function() {
doSomethingElse();
return original.apply(this, arguments);
}
}
有关如何检查其他库中的节点事件(如果您使用的话),请参阅this answer。您也可以将doSomethingElse()
用于这些库。
答案 1 :(得分:1)
超级。这让我看了jquery doc,我发现将crescentfresh的解决方案与jQuery的unbing()方法(Extjs.removeAll()的肛门)相结合将解决我的问题。
所以,最后我有这个:
this.onclick = function( e )
if ( /*trigger clause*/ true ) {
//cancel all events
$(this).unbind();
return false;
} else {
//continue processing
return original ? original.apply(this, arguments) : true;
}
}
感谢你们的建议!
PS这个混蛋做了这个糟糕的回复编辑器??!在这里贴一些代码很头疼。PPS不幸的是,我不能投票支持两个回复,由于缺乏声誉,我无法为你的回复提出有用的标记,我不能标记多个可接受的答案。所以,请原谅我。愚蠢的论坛引擎,但真的很酷的人在这里
答案 2 :(得分:0)
addEventListener可让您添加其他活动。请注意,在IE中,您必须使用attachEvent。
这不会让您定义事件的顺序 - 显然是can't predict the order the events will be fired in。因此,如果您真的想要一个事件的可预测事件队列,您将不得不自己实现它。
答案 3 :(得分:0)
您可以使用preventDefault()停止事件的默认操作,或停止使用stopPropagation()传播嵌套事件,以便仅触发您的特定事件。
但是在不使用setTimeout()的情况下本地暂停或延迟事件,停止,保存状态并稍后在队列中重新触发是不可能的。
答案 4 :(得分:0)
你在使用jquery框架吗?我目前正在使用extjs,我找到了一个可以使用或复制的课程
让我们看看http://extjs.com/deploy/dev/docs/ Ext&gt; EventManager&gt;的removeAll()
removeAll(String / HTMLElement el): void从中删除所有事件处理程序 元件。通常你会使用 Ext.Element.removeAllListeners 直接在一个元素上赞成 叫这个版本。参数:el: String / HTMLElement id或html 要从中删除事件的元素 返回:void
我认为您可以将标记body
设置为HTMLElement以关闭所有事件。 (没有测试过抱歉)
在此下载http://extjs.com/products/extjs/build/&gt;如果您正在使用jquery&gt;选择jquery适配器extcore就足够了(它包含EventManager.js)。
另一方面,像crescentfresh(回答4号),我把这个示例代码应用于所有节点事件:
var nodes = document.getElementsByTagName('*'); // collect your nodes however
for(var i=0; i < nodes.length; i++) {
var node = nodes[i];
Ext.EventManager.removeAll(node);
}
}
如果您在使用我可以提供帮助的extjs时遇到问题,请告诉我,如果我的回答有用,请告诉我。
答案 5 :(得分:-1)
您只需使用正确的参数加载此示例函数即可停止事件侦听器:
function removeEvent(obj,type,fn){
if(obj.removeEventListener) obj.removeEventListener(type,fn,false);
else if(obj.detachEvent){
obj.detachEvent("on"+type,obj[type+fn]);
obj[type+fn]=null;
obj["e"+type+fn]=null;
}
}
此外,您可以在杀死其他侦听器的事件中触发àsetTimeout,并在外部或使用其他setTimeout逐个重新启用侦听器。
用于调试事件的库,可能很有用。