Javascript 为什么事件对象中存在细微的跨浏览器差异
窗口级别的以下声明: var event; // for IE var event = "anything"; // for Chrome var事件;//对于IE var event=“任何东西”;//铬 将销毁此处使用的事件对象: <div onMouseOver = "alert(event.type);">Mouseover Div</div> 滑鼠驾驶室 Firefox似乎不受这两种声明的影响 我意识到声明一个名为“event”的变量是一个糟糕的代码,但我对这里的技术差异感到好奇,例如,IE中使用var会将变量重新初始化为null,而Chrome不会用var声明覆盖,除非显式赋值,FF可能将事件对象保存在窗口的var声明范围之外 这更像是一种好奇。我在一个我无法控制的网站上遇到了IE中的一个bug,这是由这个bug引起的。我越是深入研究,就越能看到浏览器之间的细微差别。只是想知道这里是否有人有任何见解。IE中的“事件”对象是“窗口”对象的属性;也就是说,它是全球性的。在Firefox中,它是一个构造并传递给事件处理程序的值Javascript 为什么事件对象中存在细微的跨浏览器差异,javascript,dom,events,cross-browser,dom-events,Javascript,Dom,Events,Cross Browser,Dom Events,窗口级别的以下声明: var event; // for IE var event = "anything"; // for Chrome var事件;//对于IE var event=“任何东西”;//铬 将销毁此处使用的事件对象: <div onMouseOver = "alert(event.type);">Mouseover Div</div> 滑鼠驾驶室 Firefox似乎不受这两种声明的影响 我意识到声明一个名为“event”的变量是一个糟糕的代码,但
如果使用jQuery或其他框架,事件处理支持通常会将“event”对象规范化为跨浏览器工作相同的对象。在IE中,
事件
是窗口
对象的属性,在事件处理函数中用于访问正在处理的事件。在其他浏览器(如Firefox)中,情况是在事件处理程序属性中,调用属性中的JavaScript代码时,就好像它构成了一个函数体,函数体中传递了一个名为event
的参数,该参数对应于正在处理的事件。所以在
<div onmouseover="alert(event.type);">Mouseover Div</div>
event
参数覆盖包含范围中声明的任何event
,而在IE中,它是
function() {
alert(event.type);
}
而
事件
标识符被解析为全局对象的一个属性(即窗口
)。您在寻找什么样的答案?这一切归结为不同的浏览器供应商拥有不同且不一致的DOM API和渲染引擎。Tim down的回答回答了我的问题-谢谢!如果他的答案回答了你的问题,你应该把它标记为正确答案,这样他就能得到分数和积分。仍然了解这里的情况。谢谢你的解释,蒂姆-这很有道理。那么Chrome处理事件对象是否与IE类似?它似乎在:var event=null;上失败;。但在WebKit中,情况似乎并非如此,因为Safari似乎处理得很好。我还不确定,因此我对“其他浏览器,如Firefox”的说法含糊不清。从你所说的来看,Chrome的机制很可能与IE类似,但我会做一些研究。几乎可以肯定Chrome的工作方式与IE相同:在事件处理程序属性中,window.event==event
返回true
,设置一个名为event
的全局变量会破坏一切,因为全局对象是JavaScript在尝试解析标识符时检查的最后一个对象。Safari 4中的情况很奇怪:window.event==event
返回true
,但定义event
全局变量不会覆盖事件处理程序中event
的值,因此,我认为Safari正在设置window.event
,并传递与event
参数相同的对象。谢谢Tim。感谢您在这里解释您的方法。感谢您提供有关规范化事件对象的框架的更多信息。很好的洞察力。如果你喜欢你得到的答案,你应该投票给他们。这就是StackOverflow对每个人的作用!谢谢你,我是新来的,还没有达到要求的15分。Pointy:因此,在IE中,事件是全局的,因此所有foo的likeonclick='foo()'
函数将通过window.event
知道事件,而FF将event
发送到包装函数,因此我必须使用onclick='foo(event)“
所以最终我将拥有函数(event){foo(event)}
(与chrome相同)…我说的对吗?@RoyiNamir好吧,传统的“hack”是将“event”声明为处理函数的参数,然后编写event=event | window.event
作为函数的第一条语句。
function() {
alert(event.type);
}