上面这段代码,在 JavaScript 的事件处理中比较常见,主要是为了兼容老版本的 Internet Explorer(主要是 IE9 之前的版本)而设立的,原因是老版 IE 不支持标准的 W3C 事件处理规范。
这段代码中的 e 代表事件(event)对象,即所谓的事件驱动源。下面以鼠标点击事件为例,作一个测试:
(HTML)
<!DOCTYPE html><html>
<body>
<button type="button" id="btn">Click</button>
<script type="text/javascript">
// JavaScript 代码
</script>
</body>
</html>
(JavaScript)
document.getElementById("btn").onclick=function(e){alert(e)
}
编写一个匿名函数 function(e){ alert(e)},并将其赋值给事件句柄(即 onclick),这是一个回调函数,相当于 onclick(e){ alert(e)}。这段代码在 Chrome、Firefox 或新版 IE(IE9 及以后的版本)等支持标准的浏览器下运行,弹出的应该是类似“[object MouseEvent]”的字符串,说明 e 为事件对象;而在老版 IE 下运行,结果就是“undefined”(未定义)。
显而易见,在标准的流程中, 事件对象默认由事件句柄函数的第一个参数传入,供处理函数使用;在老版 IE 中,这个事件对象却无法直接由句柄函数传入,反而可以使用一个全局变量来代表事件对象,这个变量即 window.event。同样,可以用例子验证:
document.getElementById("btn").onclick=function(e){alert(window.event)
}
在老版 IE 中即可显示 window.event 为对象,说明可以通过这种方式取得事件对象。(其实除了 IE 外,Chrome 等浏览器中也存在 window.event,但是在支持标准的浏览器中,我们最好使用标准方式。)
现在,就可以理解为什么会出现 e=e||window.event 这种写法了。因为只有这样才能兼容老版 IE 的事件处理过程:如果浏览器支持标准的处理过程则使用句柄函数传入的第一个参数(e),反之则使用 IE 的处理方法(window.event)。从某种意义上说,标准的事件对象(e) 和老版 IE 中的 window.event 可以视为等价的(事实上有一些区别,这里就不详细区分了),两者任何一个有效都可以供我们使用。
document.getElementById("btn").onclick=function(e){e=e||window.event
// 使用 e 对象
}
于是,上面的这段代码就可以兼容几乎所有的浏览器了。
e是事件对象,就是js事件相关信息对象,而且根据不同的事件,属性值会不一样。比如 obj.onclick=function(e){console.log(e)
}
这里的e就是obj点击事件的事件对象