Javascript 跨浏览器事件处理程序(添加、删除、触发)
我有点困惑,当我在IE7、IE9、Chrome 18、Firefox 12中尝试将一个函数绑定到一个事件(如单击)时,它的工作非常好,但是当我尝试删除与事件相关的函数时,只有IE7和Firefox能够解除该函数的连接。 这就是我使用的代码,我做错了什么Javascript 跨浏览器事件处理程序(添加、删除、触发),javascript,internet-explorer,firefox,google-chrome,Javascript,Internet Explorer,Firefox,Google Chrome,我有点困惑,当我在IE7、IE9、Chrome 18、Firefox 12中尝试将一个函数绑定到一个事件(如单击)时,它的工作非常好,但是当我尝试删除与事件相关的函数时,只有IE7和Firefox能够解除该函数的连接。 这就是我使用的代码,我做错了什么 bindEvent:function(el,evtType,fn){ if(el.addEventListener){ el.addEventListener(evtType,fn
bindEvent:function(el,evtType,fn){
if(el.addEventListener){
el.addEventListener(evtType,fn,false);
} else {
if(el.attachEvent){
var _el=el;
var f = function(){fn.call(_el,window.event);}
el.attachEvent( 'on'+evtType, f);
el[fn.toString()+evtType]=f;
//el.attachEvent('on'+evtType,fn) ;
} else {
el['on'+evtType]=fn;
}
}
return el;
},
removeEvent: function(el,evtType, fn ) {
if( el.removeEventListener){
el.removeEventListener( evtType, fn, false );
}else if(el.detachEvent){
el.detachEvent('on'+evtType,el[fn.toString()+evtType]);
el[fn.toString()+evtType]=null;
}else{
el['on'+evtType]=function(){};
}
return el;
}
我的测试代码是:
var a = document.getElementById('just_a_div');
bindEvent(a,'click',function(){alert('Hi There');});
为了尝试删除,我使用了几乎相同的:
removeEvent(a,'click',function(){alert('Hi There');});
是否有任何想法或一些预先制作的代码片段可以在所有浏览器上有效地完成此任务??
希望能出现一个解决方案,永远心存感激。用纯javascript代码支持所有浏览器有点困难,更好的方法是使用javascript框架,我认为最好的方法之一是&当然还有很多其他框架是为不同的目的而设计的。你的代码在IE8中工作,firefox和chrome(事件将在五秒钟后删除)。也许您的测试用例中有错误?你能给我们看看你的测试用例吗 ==UPDTAE=== 在javascript中,当函数具有相同的参数和内容时,它们也不会相同。试试:
alert(函数(){alert('Hi-There');}==function(){alert('Hi-There');})代码>结果为false
对功能的尊重是平等的,如果他们尊重相同的功能。所以var fn=function(){alert('clicked');};警报(fn==fn)代码>为真
您应该使用与中类似的bindEvent
和removeEvent
函数中的函数相同的引用。使用jQuery实现跨浏览器支持。只需使用附加事件并使用分离即可 jQuery没有完全实现用于事件处理的本机javascript行为。使用jQuery,您可以为同一对象的同一事件类型多次注册同一函数。但是,addEventListener
的本机行为不允许这种情况。@AndrewD。但是,问题是,我只需要将函数附加到对象的事件上,其他什么都不需要。这正是我的目标:不要使用Jquery,我只需要将函数附加到对象的事件上。你知道为什么5秒钟吗?哦,我还没有研究过你的代码,这是一个超时!!,对不起,我弄错了。@codefformer我调用的方式是:bindEvent('click',function(){return'Hi';});但是当我试图删除它时,可以删除event('click',function(){return'Hi';});对于后人来说,OP代码似乎是基于John Resig在2005年9月发布的内容。评论中对代码提出了一些实质性的批评,特别是那些与内存泄漏有关的批评,这些批评应予以考虑(例如,作者提出的批评)。他们没有在邮件中被提及。另请参见第页的评论。