javascript - mouseover 和 mouseout 事件的奇怪行为

标签 javascript html css hover dom-events

我需要在将鼠标悬停在元素(触发器)上时显示 HTMLElement 并在离开同一元素时隐藏它。

工作示例

此处显示/隐藏元素未悬停在触发元素上。

var div = document.createElement("div");
div.className = "d";
document.body.appendChild(div);

var hov = document.createElement("div");
hov.className = "h";

var hover = false;

var overEvent = "mouseenter";
var overOut = "mouseleave";

div.addEventListener(overEvent, function(e) {
  if (hover) return;
  
  document.body.appendChild(hov);
  hover = true;
  
  console.log("OVER");
});
div.addEventListener(overOut, function(e) {
  if (!hover) return;
  
  document.body.removeChild(hov);
  hover = false;
  
  console.log("OUT");
});
.d {
  width: 100px;
  height: 100px;
  background-color: #ff9900;
  z-index: 0;
}

.h {
  width: 100px;
  height: 100px;
  top: 150px;
  bottom: 150px;
  background-color: #000000;
  opacity: 0.5;
  z-index: 1;
}

div {
  position: absolute;
}

不工作

这里,触发器被覆盖,事情变得奇怪:

var div = document.createElement("div");
div.className = "d";
document.body.appendChild(div);

var hov = document.createElement("div");
hov.className = "h";

var hover = false;

var overEvent = "mouseenter";
var overOut = "mouseleave";

div.addEventListener(overEvent, function(e) {
  if (hover) return;
  
  document.body.appendChild(hov);
  hover = true;
  
  console.log("OVER");
});
div.addEventListener(overOut, function(e) {
  if (!hover) return;
  
  document.body.removeChild(hov);
  hover = false;
  
  console.log("OUT");
});
.d {
  width: 100px;
  height: 100px;
  background-color: #ff9900;
  z-index: 0;
}

.h {
  width: 100%;
  height: 100%;
  background-color: #000000;
  opacity: 0.5;
  z-index: 1;
}

div {
  position: absolute;
}

在这种情况下,我可以看到当将鼠标移动到触发元素顶部时会重复调用监听器,从而导致多次放置和移除叠加层的这种有趣的间歇性不良效果。

当使用 mouseovermouseout 作为事件时也会发生这种情况。

为什么会这样?

最佳答案

正如 Salasar 已经指出的那样,出现此问题是因为第二个 div(悬停在第一个 div 时显示的那个)准确显示鼠标所在的位置,这会触发第一个 div 上的鼠标移开事件。你可以做些什么来解决这个问题,配置你的第二个 div,div.h,使用'pointer-events:none'。 This will make it never to be a target of mouse events.

我已经更新了您的示例以展示此功能。

var div = document.createElement("div");
div.className = "d";
document.body.appendChild(div);

var hov = document.createElement("div");
hov.className = "h";

var hover = false;

var overEvent = "mouseenter";
var overOut = "mouseleave";

div.addEventListener(overEvent, function(e) {
  if (hover) return;
  
  document.body.appendChild(hov);
  hover = true;
  
  console.log("OVER");
});
div.addEventListener(overOut, function(e) {
  if (!hover) return;
  
  document.body.removeChild(hov);
  hover = false;
  
  console.log("OUT");
});
.d {
  width: 100px;
  height: 100px;
  background-color: #ff9900;
  z-index: 0;
}

.h {
  width: 100%;
  height: 100%;
  background-color: #000000;
  opacity: 0.5;
  z-index: 1;
  pointer-events: none;
}

div {
  position: absolute;
}

关于javascript - mouseover 和 mouseout 事件的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40842656/

相关文章:

javascript - 如何获取jstree行元素的点击事件?

html - 给定路径的 Svg 填充动画

html - 在 li 元素内显示 flex 隐藏编号

javascript - 如何使用 browserify 在客户端 html 文档中使用 Node.js 包

Javascript 全屏切换重置用户视口(viewport)位置

javascript - DataTables:未捕获类型错误:无法读取未定义的属性 'defaults'

javascript - Typescript 属性在类型 {} 上不存在

javascript - 从 Postgres DB 获取 PNG 文本并将图像发送到前端 React

html - 文本字段相互叠加 CSS

javascript - 获取图像信息并在页面调整大小时显示在控制台中