js中事件对象event的兼容性问题

W3C标准规定,事件是作为函数的参数传入的,例如:

"demo">点击我将获得屏幕坐标

document.getElementById("demo").onclick=function(e){ alert(e.screenX); }

当在元素上点击时,弹出警告框,内容为鼠标在屏幕上的横坐标。这里函数传入的参数e,就是事件,浏览器会实时跟踪用户的行为,如e.screenX、e.screenY、e.offsetX、e.offsetY…

这种做法在FireFox、Chrome、Safari等遵循W3C规范的浏览器下是没有问题的,唯独在IE下是行不通的,
IE采用了一种非标准的方式,将事件作为window对象的event属性:window.event、window.event.screenX…

所以,我们在写代码的时候要照顾到IE,做好事件的兼容。

下面给出的一个兼容写法,该示例并没有去判断浏览器,仅仅使用了一个小技巧。

"demo">点击我将获得屏幕坐标

document.getElementById("demo").onclick=function(e){ var e=e||event; alert(e.screenX); }

注意:不要将var e=e||event; 写成 var e=event||e; ,这在FireFox下会提示错误,FireFox无法处理未声明未赋值的变量event。

这里大家可能有疑虑,为什么是var e=e||event; ,为什么是 或运算(||),这样的结果只能是e=true或者e=false?

或运算(||)返回的并不只是true或者false,而是返回第一个不为false的变量的值,例如:
var a=5||6; //a=5
var b=0||5; //b=5
var c=false||”www.itxueyuan.com”; //c=”www.itxueyuan.com”
var e=e||event; //e为用户事件
与运算(&&)返回第一个不为true的变量的值;
在处理浏览器兼容问题的时候,尽量不要去判断浏览器,那将会为向后兼容带来风险,或许某个升级的版本开始遵循W3C标准,我们之前写的代码在该版本上就会产生错误,得不到预想结果。

例如,某个升级的IE版本支持将事件作为函数参数传入,抛弃了将事件作为window的属性,而我们的代码,恰恰是这个样子的:

if((/ie/i).test(navigator.userAgent)){
    document.getElementById("demo").onclick=function(){
        alert(window.event.screenX);
    }
}else {
    document.getElementById("demo").onclick = function (e) {
        alert(e.screenX);
    }
}

总结:

//IE是把event事件对象作为全局对象window的一个属性;可以使用event或window.event来访问;
//FireFox和Chrome等主流浏览器是通过把【事件对象】作为【事件响应函数】的【参数】进入传入的;
//兼容性的写法示例:
domElement.onclick = function( e ){
      e = e || window.event;//或(||)书写顺序有讲究,不能随意换
}

你可能感兴趣的:(javascript)