e = e || window.event是我们在做事件处理时候区分IE和其他浏览器事件对象时常用的写法。但是这行兼容性代码有没有必要出现在所有的事件句柄中呢?标准事件调用方式需要这行代码吗?下边我们做详细讨论。

  在讨论之前,如果有些忘记或者不熟悉事件对象的先参考其他资料,或者看看这个连接的资料http://wenku.baidu.com/view/400a89f4f61fb7360b4c65ca.html

这里作者把四种主要的事件调用方式总结了出来,本文的讨论也是在此之上延伸说明。

<!DOCTYPE HTML><html><head>    <title></title>    <style type="text/css">    #aa{ border:1px solid #000; width:100px; height:40px; margin-top:50px;}    #bb{ border:1px solid #000; width:500px; height:40px; margin-top:50px;}    #cc{ border:1px solid #000; width:500px; height:40px;}    </style></head><body>    <div id="aa"></div>    <div id="bb">dfdfddfsd</div>    <div id="cc">gregreger</div>

    <script type="text/javascript">

        document.getElementById("aa").onclick = function (e) {if (e) alert(e.toString()); // IE6/7/8 e为undefined  IE9中e为W3标准事件对象。//e = window.event; alert(e.srcElement.tagName || e.currentTarget.tagName); }/* element.onXXX方式(比较古老,不推荐使用)

 这种方式添加事件IE6/7/8只支持window.event不支持参数传入, Firefox只支持参数传入不支持其它方式。 IE9/Opera/Safari/Chrome 两种方式都支持。*/

var d4 = document.getElementById('bb');function clk(e) { alert(e); // 所有浏览器弹出的信息框显示都是事件对象。 alert(e.srcElement.tagName || e.currentTarget.tagName); e = e || window.event; alert(e); // IE6/7/8中和上个e弹出相同的对象。 } if (d4.addEventListener) { d4.addEventListener('click', clk, false); alert("addEventListener"); }if (d4.attachEvent) { d4.attachEvent('onclick', clk); alert("attachEvent"); }/* addEventListener、attachEvent方式(推荐使用)

 结论: 通常事件句柄里有这句话:e = e || window.event; 但是在这种调用方式(addEventListener、attachEvent方式)中没什么作用, 这是什么原因呢?上边参考文章的总结里指出了原因,即: “IE6/7/8支持通过window.event获取对象, 通过attachEvent方式添加事件时也支持事件对象作为句柄第一个参数传入” 因为IE6/7/8在attachEvent方式添加事件时同时支持两种方式,所以事件句柄中的参数e在 IE6/7/8中会自动转换为window.event。 这么以来,这句e = e || window.event;在此处就不需要了(个人结论)。

*/

/*  在编写跨浏览器的函数库时,IE和标准事件对象的属性的差异的问题需要解决。 下边抽出相关代码,讨论这个问题在这里的体现。*/var _E = { BindEvent: function (object, fun) {if (arguments.length == 1) { fun = arguments[0]; object = null; }var args = Array.prototype.slice.call(arguments, 2);return function (event) {return fun.apply(object, [fixEvent(event)].concat(args)); } } };function fixEvent(event) { // 统一不同浏览器的event对象if (event) return event;  event = window.event; event.pageX = event.clientX + getScrollLeft(event.srcElement); event.pageY = event.clientY + getScrollTop(event.srcElement); event.target = event.srcElement; event.stopPropagation = stopPropagation; event.preventDefault = preventDefault;var relatedTarget = { "mouseout": event.toElement, "mouseover": event.fromElement }[event.type];if (relatedTarget) { event.relatedTarget = relatedTarget; }

return event; };function stopPropagation() { this.cancelBubble = true; };function preventDefault() { this.returnValue = false; };

// 测试代码如下function get(ev) { alert(ev.pageX); }var cc = document.getElementById("cc");var clickHandler = _E.BindEvent(get); cc.attachEvent('onclick', clickHandler); // IE6/7/8下测试/* 结果点击id为cc的div元素后,弹出undefined。说明ev.pageX根本不存在。 可是我们在fixEvent()里已经做了事件对象的统一工作。 调试会发现:fixEvent()里if (event) return event;这句是执行后就直接return了, 这里的event按照道理说应该是undefined,但是事实并不是。

 // 至于原因个人觉得就是这里:因为IE6/7/8在attachEvent方式添加事件时同时支持两种方式, 所以事件句柄中的参数会自动转换为window.event。也就是说参数不是undefined

 // 所以在这里用if (event) return event;判断事件对象不妥。 (说明:fixEvent()这段代码参考自博客园里cloudgamer的函数库, 他里边就是这种写法,个人觉得有错误,希望有兴趣的朋友也做做验证)*/

 </script></body></html>

转载于:https://www.cnblogs.com/zzc134680/p/5741843.html

window.event相关推荐

  1. JS中window.event事件使用详解

    一.描述 event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等. event对象只在事件发生的过程中才有效. event的某些属性只对特定的事件有意义.比如:from ...

  2. if(window.event) e = window.event

    浏览器事件对象兼容 function func(e){ if(window.event){ e = window.event; } } 浏览器中的事件都是以对象的形式存在的,IE浏览器与标准DOM浏览 ...

  3. window.event.srcElement

    <input type=button value=ok οnclick="mm()"> <s cript LANGUAGE="Javas cript&q ...

  4. 冇内容管理系统分析-[JS]详尽解析window.event对象

    描述 event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等. event对象只在事件发生的过程中才有效. event的某些属性只对特定的事件有意义.比如,fromEl ...

  5. event 和 window.event

    event 和 window.event 出处:http://hi.baidu.com/zzcc_8/blog/item/1c6e7a8f560765f3503d9200.html < html ...

  6. javascript中window.event事件用法详解

    前两天写程序时因为要用到javascript中的window.event事件,于是就在网上搜了一下,终于找到一篇不错的文章,来与大家分享下:  描述   event代表事件的状态,例如触发event对 ...

  7. window.event.returnValue=false

    window.event.returnValue=false放到提交表单中的onclick事件中则不会提交表单,如果放到超链接中则不执行超链接

  8. 详尽解析window.event对象

    描述 event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等. event对象只在事件发生的过程中才有效. event的某些属性只对特定的事件有意义.比如,fromEl ...

  9. JavaScript:window.event.srcElement(指触发事件的对象)

    event对象指当前触发的事件对象, window.event.srcElement是指触发事件的对象. srcelement 是事件初始目标的html元素对象引用,因为事件通过元素容器层次冒泡,可以 ...

最新文章

  1. Java 内存 关系_内存一致性 – 发生在Java之前的关系
  2. PyTorch常用代码段整理合集,建议收藏!
  3. 关于安防与大数据不能不说的九个发展趋势
  4. Linux CPU信息
  5. oracle rac 磁盘重建,Oracle RAC环境下重建ASM磁盘组 Re-create ASM diskgroup with Oracle RAC...
  6. android 圆角按钮渐变,Android实现圆形渐变加载进度条
  7. mysql php 乱码问题_解决php与mysql中文乱码问题
  8. DNS服务系列之二:DNS区域传送漏洞的安全案例
  9. 云栖号在线课堂—云服务器数据库快速入门特辑
  10. 《C陷阱与缺陷》读书笔记与总结
  11. Flask--网页微信登陆示例
  12. python爬取5442网站图片
  13. 利用Tsai-lenz算法实现手眼标定
  14. 从王自如和老罗的论战中我貌似懂得了点神马...
  15. java espresso车架_Espresso 学习
  16. 打印机服务器纸张属性不显示,为什么我的打印机能在打印机服务器属性里设置自定义纸张大小,却无法? 爱问知识人...
  17. 几款流行监控系统简介
  18. 【SAP】根据生产订单号查询序列号并导出序列号数据
  19. python是个啥-CPython是个什么鬼?
  20. python基本数据类型练习

热门文章

  1. 记TX实习生笔试归来
  2. 实验九:异常的抛出、捕获并处理
  3. Thread类(线程)
  4. 盘点互联网巨头奉献的十大开源安全工具
  5. DB2客户端,查看、增加、删除节点和数据库编目
  6. JavaOne 2016——首日亮点
  7. (实用)将wordpad添加到Windows PowerShell中
  8. NodeList 和 HTMLCollection
  9. Unity3d Http Get请求
  10. Fedora的ifconfig命令