调整您的代码以隔离并提供正在发生的事情的详细信息,我准备了以下内容:
http://jsfiddle.net/238Nz/8/
跳过这部分下面的答案。这是为马克准备的。
让我们忽略使用on*
属性添加处理程序是好是坏$。另外,让我们使用一些日志记录来检查订单。我console.log()
用来向浏览器的 Javascript 控制台发送消息。在 Firefox 中,我使用 Firebug,而 Chrome 有一个内置控制台。在两者中,右键单击页面和Inspect Element
,然后选择Console
这些测试的选项卡。
还有一件事:jsFiddle 一开始可能有点复杂。底部左侧窗格中的 Javascript 实际上放在源中(和标记)上方的head
块中。右键单击底部右侧 ( ) 窗格,您将看到浏览器正在使用什么。它就像您自己的示例 HTML 文档一样,只是为 jsFiddle 重新排序。不过,尽量不要被它的工作原理所迷惑。input
body
View Source
Result
我用来测试您的问题的标记如下:
<input type="button" onclick="doclick()" onmouseout="domouseout()" value="Click">
请注意,我清楚地标记了我的函数并使用描述性错误消息。这有助于我通过在代码和消息日志信息中嵌入该详细信息来跟踪正在发生的事情。始终尝试在标签(、、日志信息等)中进行描述function
,而不是像orvar
之类的东西。一旦你的脚本变得更长、更复杂,就很难理解了。yay!
what happened
接下来,我使用以下函数来缩小范围并一致地复制相同的操作:
function popup(msg) {
// Note, console.log is first here. This is so that the
// alert does not "steal" focus before I get any result.
console.log(msg);
// Now, let's try the alert. Notice, the same msg is used.
alert(msg);
}
console.log
这允许我从两个事件处理程序中 alert
以特定顺序调用两者。接下来,我建立我的两个事件处理函数:
function doclick() {
popup('onclick fired');
}
function domouseout() {
popup('onmouseout fired');
}
看,他们所做的只是调用popup()
一个特定于操作的日志消息,说明应该发生的事情。由于alert
s 旨在“聚焦”用户并阻止交互,这似乎是“冻结”浏览器框架的可能原因。
我接下来要做的是在不同的浏览器中尝试这个。始终尝试在不同的浏览器之间进行复制和测试#。在这种情况下,我注意到两者之间有很大的不同......
Chrome:不阻止处理;两者都alert
开火,并且onmouseout
-fired直到我点击and之后alert
才会运行,然后我将鼠标指针从元素上移开。这似乎是我们想要的结果。正确的?console.log
Ok
alert
input
Firefox (17.0.1):Firefox 确实显示了您所描述的行为。请注意,当我单击按钮时,我会同时得到两者doclick
并被 domouseout()
调用。因此 Firefox 检测到将鼠标指针从按钮上移开,然后您就会得到“冻结”。如果您观看,您会立即看到两者都启动,并且您似乎无法与之交互(通过单击)。onclick
console
log
alert
Ok
IE (7-9, 9 Compatibility View):IE当然提供了一个有趣的例子。例如,当我单击 IE9 中的按钮时,我看到:
http://i.imgur.com/sWXWm.png
当然,这似乎与 Firefox 具有相同的效果......但由于 Firefox 的某些原因,onmouseout
-firedalert
并不专注于onclick
-fired 之上alert
。IE 7-9 plus Compatibility View 都表现出这种特殊的行为,只是略有不同。
Opera (12.02) :直到-fired和 log 消息之后,Opera 才会触发 -fired 或消息,并且您移动onmouseout
鼠标alert
(假设您在单击后将其从 button 元素中移开)。这看起来很奇怪,但比 Firefox 和 IE 的行为更可口。不过,也许我错了。console.log
onclick
alert
input
那么发生了什么?我不太确定,但我认为这onmouseout
阻止了onclick
'salert
对用户的关注。如果你[Enter]
在它被冻结的时候打它,你会得到onclick
警报,但不会onmouseout
。Chrome 在这里似乎是正确的;Firefox 的“popunder”警报似乎有点可疑。
总之,至少这两个事件在这种情况下的行为不仅是 Firefox特有的。似乎特定于 Firefox(至少 17.0.1)的事实是-firedonmouseout
没有alert
正确聚焦,并且页面“似乎冻结”。这似乎是一个错误。我想知道有没有被举报?
$使用内联属性事件处理程序(如 )
通常不是一个好主意,但让我们忽略这里无关紧要的内容。请参阅 MDN 的文档,特别是HTML 属性部分,并意识到这比这里值得介绍的要复杂和详细。<input onclick="doclick()"...>
DOM Event
#
如果你继续在浏览器中使用 Javascript,你会发现 IE 是……特别的。它在历史上占有特殊的地位,因此在使用 IE 版本检查代码时,奇怪或“异常”的行为并不少见。就个人而言,我建议在 Firefox 或 Chrome 中学习和工作,然后在 IE 和其他浏览器中检查它是否有效。