将鼠标悬停在某个元素上然后刷新该页面(不移动鼠标):
以下是一个示例代码段。要重现此问题,请将鼠标悬停在div
上,然后刷新页面。在Chrome中,div
不包含" mouseenter"。在Firefox中,确实如此。
请注意,这在Stacksnippets环境中不起作用,因为您需要点击"运行代码段"第一。 JSFiddle:https://jsfiddle.net/9fu6cx5d/7/
let div = document.getElementById('my-div');
div.addEventListener('mouseenter', function () {
div.innerHTML = 'mouseenter';
});

#my-div {
width: 150px;
height: 150px;
background-color: #aaaaaa;
}

<div id="my-div">
</div>
&#13;
哪种浏览器具有正确的行为?我如何解决行为差异或至少使它们的行为相同?
Chrome版本:59.0.3071.115(官方版本)(64位)
Firefox版本:54.0(64位)
答案 0 :(得分:1)
正如评论中所指出的,根据规范,Chrome的行为是正确的。以下是关于如何解决差异的想法。
您可以通过检查鼠标是否在文档加载的div范围内来确保您获得正确的值。不幸的是,JS没有办法在没有触发事件的情况下检查鼠标位置,所以你将不得不求助于涉及CSS悬停规则的一些黑客并在$(document).ready
上检查它们。
使用覆盖整个文档的div覆盖您的页面。内 那,创建(比方说)2,000 x 2,000个元素(以便:hover 伪类将在IE 6中工作,参见),每个像素大小为1。创建一个 CSS:用于更改属性的那些元素的悬停规则(让我们看看) 说font-family)。在您的加载处理程序中,循环遍历4中的每一个 百万个元素,检查currentStyle / getComputedStyle()直到 你找到一个悬停字体。从中推断出来 元素来获取文档中的坐标。
N.B。不要这样做。
虽然你绝对不应该这样做,但是如果你只是需要解决浏览器问题,那么为了检查一个元素是否悬而不需要JS事件而使用非有效的悬停样式的一般想法是很好的。我在下面的示例中使用font-weight
,但您可以将其更改为适合您的任何内容。
#my-div:hover {font-weight:700;}
// Pseudocode!
var mouseIsInside = false,
div = $('#my-div');
$(document).ready(function(){
if (div.css('font-weight') === 700) {
mouseIsInside = true;
}
doStuffIfMouseInside();
});
div.on('mouseenter', function(){
mouseIsInside = true;
doStuffIfMouseInside();
})
function doStuffIfMouseInside() {
if (mouseIsInside) {
...
}
}
答案 1 :(得分:0)
如果在代码周围添加(function(){})();
,它似乎适用于两种浏览器。
似乎firefox可能在dom可用之前触发事件,导致mousein / out事件出现问题。