javascript事件

事件,本来挺简单的,但是在javascript确是个麻烦的事情。最重要的原因是兼容性。首先我们看看javascript事件有哪些兼容性问题,以及如何处理这些兼容性。

事件的兼容性一览

  • addEventListener(type, eventHandle, useCapture)、attachEvent(“on”+ type, eventHandler) // w3c

      removeEventListener(type, eventHandle, useCapture) 、detachEvent(“on”+ type, eventHandle) // IE

tip: addEventListener中第三个参数为true时,捕获时触发,false时候为冒泡时触发。

function addEvent(elem, type, eventHandle, useBubble){
	if(elem.addEventListener){
		elem.addEventListener(type, eventHandle, useBubble);
	}else if(elem.attachEvent){
		elem.attachEvent(“on”+type, eventHandle);
	}
}
function removeEvent(elem, type, eventHandle, useCapture){
	if(elem.removeEventListener){
		elem.removeEventListener(type, eventHandle, useCapture);
	}else if(elem.detachEvent){
		elem.detachEvent(type, eventHandle);
	}
}
  • target、srcElement

IE9以下不支持event.target

function filter(event){
	if(!event.target){
		event.target = event.srcElement || document;
	}
}
 
  • keyCode、which、charCode的兼容性

在IE下:
>> 支持keyCode
>> 不支持which和charCode,二者值为 undefined
在Firefox下:
>> 支持keyCode,除功能键外,其他键值始终为 0
>> 支持which和charCode,二者的值相同
在Opera下:
>> 支持keyCode和which,二者的值相同
>> 不支持charCode,值为 undefined

兼容处理:

function filter(event){
        if(event.which == null){

                event.charCode != null ? event.charCode : event.keyCode;

        }
        return event.which;

}
 
  • pageX、pageY

image

兼容处理:

function filter(event){
	var eventDoc = event.target.ownerDocument || document;
	var doc = eventDoc.documentElement;
	bar body = eventDoc.body;
	event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
	event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop) + (doc && doc.clientTop || body && body.clientTop);
}
 
  • relatedTarget、fromElement、toElement相关元素

DOM通过event对象的releatedTarget属性获取相关元素信息。这个属性只针对mouseover/mouseenter和mouseout才包含值。

IE不支持releatedTarget,但是支持fromElement或者toElement。

function filter(event){
	if(!event.relatedTarget && event.fromElement){
		event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
	}
}
原文地址:https://www.cnblogs.com/pfzeng/p/5266480.html