清除卡住的:hover伪类

6

由于webkit的一个bug(我认为是这个原因),会出现一个卡住的:hover伪类状态。你可以在这里看到: http://jsfiddle.net/zFk2V/3/

在拖放之后,先前的元素在Chrome中仍处于:hover状态。如果您将鼠标悬停在这个卡住的项目上并移开鼠标,则:hover状态会被清除。

我认为应该可以使用事件触发、DOM回流触发或其他一些手段来清除元素的:hover状态。

我尝试过:

$('[draggable]').trigger('mouseenter')
$('[draggable]').trigger('mousemove')
$('[draggable]').trigger('mouseout')
$('[draggable]').trigger('mouseleave')
$('[draggable]').trigger('blur')
$('[draggable]').trigger('hover')

$('[draggable]').toggleClass('selected')
$('[draggable]').toggleClass('selected') // twice to reset to original

$('[draggable]').height(true) // should trigger a DOM reflow

我尝试使用不同的组合,包括上述的所有方式,但都没有成功。

我甚至尝试了这个方法,虽然不可接受,但我确信它会起作用:

$('[draggable]').hide()
setTimeout(function(){
  $('[draggable]').show()
}, 10)

这也不起作用。 :(
在所有情况下,:hover状态都会持续存在。您可以通过Chrome检查器和视觉效果来验证这一点。
我很想知道是否有人提交了这个bug,或者是否有人听说过它。我找到的只有这个问题,并且那个答案是一个大锤。

我将此添加为 Webkit 的 bug:https://bugs.webkit.org/show_bug.cgi?id=134555。不过,仍然希望有解决卡住的 :hover 的方法 :) - SimplGy
1个回答

1

解决这个bug的一种方法是使用JS的mouseentermouseleave事件来应用悬停状态,而不是CSS的:hover伪类:

CSS

.hover {
    background: #fc9;
}

JS

lis[i].addEventListener("mouseenter", function(event) {
    this.classList.add("hover");
}, false);
lis[i].addEventListener("mouseleave", function(event) {
    this.classList.remove("hover");
}, false);

为确保拖动开始时悬停效果被移除:
lis[i].addEventListener("dragstart", function(event) {
    dragged = this;
    this.classList.remove("hover"); // <- Add this
    ol.classList.add("insistent");
}, false);

这是一个 JSFiddle:

http://jsfiddle.net/36kBp/2/


当然,那会起作用,但我对此有一些担忧——与此处相同的答案和相同的担忧:https://dev59.com/imMm5IYBdhLWcg3wBrTD#17953595。你能确认这个卡住的悬停问题确实是一个错误吗?你以前见过它/遇到过它的问题吗? - SimplGy
1
我不确定这是一个错误还是预期行为。但它确实感觉像个错误。我上周遇到了这个问题,当动画元素悬停时。就像你的情况一样,当元素从光标下移开时,Chrome没有删除:hover。在我的情况下,我可以通过将单击事件更改为mousedown事件来解决它,并保留:hover伪类。在你的情况下,我认为这个解决方案不适用。我的建议是:不要过于依赖JS作为解决方法。我想这比永远不删除悬停事件更可取? - Jonathan Nicol
这是解决我的:hover问题的Stack Overflow问题链接:https://dev59.com/4GPVa4cB1Zd3GeqP2x8y - Jonathan Nicol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接