js之event对象获取在FF和IE下的区别
摆脱各种库之后,我从代码中获取了更多的乐趣,编程能力也快速的提升。毫无疑问,各种问题也接踵而至。对于自成标准的IE,我始终向它投去钦佩的目光。我觉得一个人的学习成长和他的老师以及他的眼界密切相关,很庆幸我的老师之一是互联网,但是从这瀚海之中提取有用的知识,对新人来说并非易事。感谢那些才华横溢善于思考又愿意分享的前辈,我虽无才华,也愿意把实际经验分享出来,供新人参考和交流。
从我想给搜索框绑定一个“Enter”键便开始查询的事件开始。
我用了最传统的事件注册的办法:
- var seat = document.getElementById("seat");//这是一个搜索输入框
- seat.onkeydown = function(e){
- var eve = (window.event)?window.event:e;
- if(eve.keyCode == 13)//回车键
- msea();//另一个函数
- }
问题在第三行的地方,event对象在W3C和IE的模型中是不一样的。
- 在w3c的模型中,事件对象作为第一个参数被传递到当前事件的处理程序中;
- 在IE的模型中,事件的对象总是window.event。
firefox紧跟w3c标准,chrome则两者都支持。
所以第三行的三目运算符,若浏览器支持window.event[IE和chrome支持]则返回window.event,否则返回传入的参数e。
至此,跨越第一道门,兼容的获取到了不同浏览器的event对象。
我使用了一个匿名函数来注册事件,在有些情况下,这么做是一种很不错的选择。
还可以直接添加到html元素中作为一个属性:
- function enter(e){
- var eve = (window.event)?window.event:e;//可以去掉
- if(eve.keyCode == 13)//回车键
- msea();//另一个函数
- }
<input id="seat" type="text" onkeydown="enter(event)"/>
这种情况下,传入的“event”参数就是当前的事件对象,也就不存在兼容性问题了,于是第二行处理w3c和IE间的兼容也就不需要了。这种直接写到html里的做法还能传入一个强大的参数“this”,js的this也很给力额,如果某次你发现自己怎么也找不到“this”了,那么这种办法暂时会是不错的选择。