javascript - 修复 :hover pseudo class in IE11

标签 javascript html css drop-down-menu internet-explorer-11

IE 有一个问题,即 :hover 伪类在打开 select 元素时无法按预期工作。一旦打开下拉菜单并将鼠标移到选项上,所有父标签就会松开 :hover 伪类。

这是因为打开的下拉菜单是作为新窗口实现的 (source)

我正在尝试通过在父元素上使用 mouseentermouseleave 事件来使用 Javascript 修复此问题,但是,不幸的是,mouseleave 也是当用户将鼠标移到打开的下拉菜单上时引发。

到目前为止我的尝试:

var container = document.getElementById("container");
var select = document.getElementById("select");

//$('#select').select2();

container.addEventListener("mouseenter", function() {
  container.classList.add("hover");
});

container.addEventListener("mouseleave", function() {
  container.classList.remove("hover");
});
#container {
  display: inline-block;
  background-color: red;
}

#container:hover,
#container.hover {
  background-color: green;
}
<div id="container">
<select id="select">
<option>Some option 1</option>
<option>Some option 2</option>
<option>Some option 3</option>
</select>
<p>
some long text text text text text<br>
some long text text text text text<br>
some long text text text text text<br>
some long text text text text text<br>
some long text text text text text<br>
some long text text text text text<br>
some long text text text text text<br>
some long text text text text text<br>
some long text text text text text<br>
some long text text text text text<br>
</p>
</div>

最佳答案

无论出于何种原因,在 IE11 中,mouseleave 事件都会在您的鼠标经过选择时触发(即使它包含在您正在监听的父 div 中)。尝试检查事件的“relatedTarget”属性,看看您是否正在“离开”后代的 div,或者您是否真的正在离开 div:

container.addEventListener("mouseleave", function(e) {
  if (e.relatedTarget && !container.contains(e.relatedTarget)) {
    container.classList.remove("hover");
  }
});

基本上,仅当我们要移动到的元素 1) 存在且 2) 不是我们容器的后代时才删除“悬停”类。

编辑:我们在查看“e.relatedTarget”是否包含在容器中之前检查它的原因(没有双关语意)是因为“relatedTarget”可能为空。事实上,当您将鼠标悬停在选择下拉列表上时,“relatedTarget”始终为 null。我很想知道为什么会这样,而不是在离开 HTML 主体的 div 时触发“mouseleave”,在那里您确实获得了“relatedTarget”的元素。

关于javascript - 修复 :hover pseudo class in IE11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46475363/

相关文章:

css - sass 集合作为变量名

jquery - 使用 jQuery insertBefore 悬停不正确

javascript moment.js 计算两个日期之间的百分比

javascript - Highcharts、ROR、如何让标签发挥作用

html - 图片按钮样式

html - Dart事件处理常式和Lambda

javascript - toLocaleString 不适用于所有浏览器中小于 10000 的数字

javascript - 将 id 从 onclick 方法传递到函数中

html - Aptana Studio 3 - 使用 HTML 5 的数据角色标签时的警告

Android 浏览器将宽度设置为 100%,而不管应用于元素的边距(即 block 引号)