抛弃IE的attachEvent吧
给元素添加事件,在标准浏览器中使用addEventListener,而在IE中使用attachEvent,但是IE的attachEvent不支持捕获阶段的事件处理程序,并且同一个处理程序能添加多次。
Dean Edwards给出了一种不使用attachEvent添加事件处理程序的方法,解决了同一个处理程序可以添加多次的问题,并且修正了IE中event对象与标准浏览器中event对象的差别。
下面是参考Dean Edwards写法的一段程序:
- <script type="text/javascript">
- /**
- * 添加事件
- * @param {Object} el
- * @param {Object} type
- * @param {Object} fn
- */
- var addEvent = function(el, type, fn) {
- //如果是标准浏览器,则使用addEventListener方法添加事件
- if(window.addEventListener){
- el.addEventListener(type, fn, false);
- return;
- }
- //计数器,用于给每个事件处理函数一个唯一的ID
- if(!addEvent.guid)
- addEvent.guid = 0;
- //将ID赋给事件处理函数
- if(!fn._id)
- fn._id = addEvent.guid++;
- //events对象用于存储所有的事件类型
- if(!el.events)
- el.events = {};
- //不同的事件类型(click、mouseover等)作为events的一个属性
- var handles = el.events[type];
- if(!handles){
- //el.events[type]作为一个存储此类事件处理函数的对象
- handles = el.events[type] = {};
- if(el["on" + type])
- //handles[0]用于存储已使用el.onclick形式定义的事件处理函数(也可以使用其他的属性,不一定要使用0)
- handles[0] = el["on" + type];
- }
- handles[addEvent.guid] = fn;
- el["on" + type] = addEvent.handleEvent;
- };
- /**
- * 执行事件
- * @param {Object} event
- */
- addEvent.handleEvent = function(event) {
- event = event || addEvent.fixEvent();
- var handles = this.events[event.type];
- for(var i in handles){
- handles[i].call(this,event);
- }
- };
- /**
- * 修复IE的event对象
- */
- addEvent.fixEvent = function(){
- var event = window.event;
- event.target = event.srcElememt;
- if(event.type == "mouseover")
- event.relatedTarget = event.fromElement;
- else if(event.type == "mouseout")
- event.relatedTarget = event.toElement;
- event.charCode = (event.type == "keypress" || event.type == "keydown" || event.type == "keyup") ? event.keyCode : 0;
- event.preventDefault = function(){
- this.returnValue = false;
- }
- event.stopPropagation = function(){
- this.cancelBubble = true;
- }
- return event;
- };
- /**
- * 移除事件
- * @param {Object} el
- * @param {Object} type
- * @param {Object} fn
- */
- var delEvent = function(el, type, fn){
- if(window.removeEventListener){
- el.removeEventListener(type, fn);
- return;
- }
- if(el.events){
- var fns = el.events[type];
- if(fns)
- delete fns[fn._id];
- }
- };
- </script>

浙公网安备 33010602011771号