您的位置:首页 > Web前端 > JavaScript

JS事件(Event)兼容性探究

2014-01-15 16:48 483 查看
事件(Event)即为用户的动作,例如:用户点击鼠标,产生onclick事件;按下键盘,产生onkeyDown事件;改变输入框的值,产生onchange事件...

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(暂时仅限于8.0以下版本,8.0以上版本笔者未曾测试)下是行不通的,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为用户事件

好,这几个例子,笔者相信大家一定明白了,上面对事件兼容的巧妙处理,也就迎刃而解了。

IT学院提醒,大家在处理浏览器兼容问题的时候,尽量不要去判断浏览器,那将会为向后兼容带来风险,或许某个升级的版本开始遵循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浏览器上运行就会产生错误了。

最后,梳理了思路,再把上面的代码重复一遍。

<p id="demo">点击我将获得屏幕坐标</p>

document.getElementById("demo").onclick=function(e)

{

    var e=e||event;

    alert(e.screenX);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: