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

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

<p id="demo">点击我将获得屏幕坐标</p>
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,做好事件的兼容。

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

<p id="demo">点击我将获得屏幕坐标</p>
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;//或(||)书写顺序有讲究,不能随意换
}
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值