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);
}
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);
}
相关文章推荐
- js绑定事件方法:addEventListener与attachEvent的不同浏览器的兼容性写法
- js绑定事件方法:addEventListener与attachEvent的不同浏览器的兼容性写法
- js中事件对象event的兼容性问题
- js-事件1_事件对象event/ev 兼容性及其简易写法
- js事件处理程序的运行环境(改变attachEvent内部的this指向&封装兼容性的 addEvent方法)
- JS添加事件和解绑事件:addEventListener()与removeEventListener()
- 06 JS的事件(Event)
- JS事件Event元素(兼容IE,Firefox,Chorme)
- event loop js事件循环 microtask macrotask
- [问题记录]js将事件写在函数之前解决IE8的兼容性问题
- js高级——注册事件的兼容性处理
- js中事件对象event
- js 添加事件 attachEvent 和 addEventListener 的用法
- 【JS进阶2】attachEvent()/addEventListener() 对象添加触发事件
- js事件定义方式和获取事件对象event总结
- js Event 特别注意的事件
- js中获取键盘按下键值event.keyCode、event.charCode和event.which的兼容性详解
- 使用JS监听键盘按下事件(keydown event)
- js 添加事件 attachEvent 和 addEventListener 的用法
- JS基础——事件对象event