JavaScript入门教程

JavaScript简介
JavaScript语法基础
JavaScript流程控制
JavaScript函数
面向对象编程
JavaScript事件
JavaScript DOM
正则表达式
JavaScript BOM
AJAX

专题分析

浏览器兼容性
JS优化
Web前端开发规范
编辑器推荐
总结和笔记

学习助手

对象参考手册
ECMAScript分析
数据中心
QQ交流群

JS事件(Event)兼容性探究

事件(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);
}