Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么事件对象中存在细微的跨浏览器差异_Javascript_Dom_Events_Cross Browser_Dom Events - Fatal编程技术网

Javascript 为什么事件对象中存在细微的跨浏览器差异

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”的变量是一个糟糕的代码,但

窗口级别的以下声明:

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中,它是一个构造并传递给事件处理程序的值


如果使用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的
like
onclick='foo()'
函数将通过
window.event
知道事件,而FF将
event
发送到包装函数,因此我必须使用
onclick='foo(event)“
所以最终我将拥有
函数(event){foo(event)}
(与chrome相同)…我说的对吗?@RoyiNamir好吧,传统的“hack”是将“event”声明为处理函数的参数,然后编写
event=event | window.event
作为函数的第一条语句。
function() {
    alert(event.type);
}