javascript 事件绑定(兼容各种浏览器)

IE中的 attachEvent 函数在添加事件绑定的时候不传递this对象。这让开发者很纠结,不过有政策就有对策。使用如下方法代替事件绑定函数,兼容各种浏览器。

<script type="text/javascript">
function addEvent(o,e,f) {
	if(o.addEventListener) {
		o.addEventListener(e,f,false)
	} else {
		var ctype="_"+e,a,i;
		if(!o[ctype]){
			a=o[ctype]=[];
			o.attachEvent("on"+e,function(evt){
			evt=event;
			evt.target=event.srcElement;
			for(var i=0,l=a.length;i<l;i++)
				a[i].call(o,evt);
			});
		}
		a=o[ctype];
		i=a.length;
		while(i--)if(a[i]==f)return;
		a.push(f);
	}
}

function delEvent(o,e,f) {
	if(o.removeEventListener) {
		o.removeEventListener(e,f,false);
	} else {
		var ctype="_"+e;
		if(o[ctype]) {
			var a=o[ctype],i=a.length;
			while(i--)
			if(a[i]==f) {
			 a.splice(i,1);break;
			}
		}
	}
}
</script>

addEventListener-事件流(小插曲,只是提醒注意这个知识点)
说到 addEventListener 不得不说到事件流,先说事件流对后面的解释比较方便。
当一个事件发生时,分为三个阶段:
捕获阶段 从根节点开始顺序而下,检测每个节点是否注册了事件处理程序。如果注册了事件处理程序,并且 useCapture 为 true,则调用该事件处理程序。(IE 中无此阶段。)
目标阶段 触发在目标对象本身注册的事件处理程序,也称正常事件派发阶段。
冒泡阶段 从目标节点到根节点,检测每个节点是否注册了事件处理程序,如果注册了事件处理程序,并且 useCapture 为 false,则调用该事件处理程序。
上面提到的 useCapture 也就是 addEventListener 的第三个参数了。

还要谢谢Ander的帮助:http://user.qzone.qq.com/81839603/infocenter#!app=2&pos=1319529117

31
May 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS 1 Comment