【问题标题】:mouseenter delegation using vanilla JavaScript?使用原生 JavaScript 的 mouseenter 委托?
【发布时间】:2018-10-15 02:01:23
【问题描述】:

如何为mouseenter 事件实现事件委托?

我正在寻找与此 jQuery 代码等效的代码,但无法理解 jQuery 在内部是如何实现的:

$(document).on('mouseenter', '.demo', foo);

我见过this other question about it,但没有提供合适的解决方案。

我也看过Mozilla docs regarding mouseenter和delegation,除了说它与任何浏览器都不兼容之外,他们提供的示例在JS控制台上抛出错误并且不起作用。

我还检查了this codepen,它在 Chrome 上也不起作用(没有尝试其他浏览器)。

有什么想法吗?

这是我目前正在尝试的,但 target 元素似乎总是冒泡:

document.addEventListener('mouseenter', function(e) {
    console.log('==============================');
    console.log(e.currentTarget); //document
    console.log(e.target); //document 
    console.log(e.relatedTarget); //nothing
    console.log(e.handleObj); //nothing
});

你可以玩in this jsfiddle

【问题讨论】:

  • 加载时它们可能不存在。它们可以动态添加,我无法控制何时以及如何添加。
  • 我没有时间做出复杂的回应。但是看看这里github.com/LucaRainone/jquasi/blob/master/src/jquasi.js#L178
  • 哦,对了,我忘了那是一回事
  • 我们选择了鼠标悬停和一个变量来存储最后一个悬停的元素。这样 event.target 实际上将包含悬停的元素,您可以检查其类以查看它是否应该执行某些操作。下一个悬停,您可以检查下一个悬停的元素是否是前一个元素的子元素。
  • @Shilly 但是你如何获得目标元素?尝试使用委托时,我总是收到documente.target 没有给我实际的元素。

标签: javascript mouseenter dom-events event-delegation


【解决方案1】:

您必须在capturing phase 上添加事件侦听器,将true 作为第三个参数传递:

document.body.addEventListener("mouseenter", function(e) {
    if(e.target.className === "demo") {
        console.log("catched");
    }
},true); // capturing phase

你可以做一些更详细的事情来捕捉选择器。但这是关键。

在这里演示https://codepen.io/anon/pen/Xqaxwd

【讨论】:

  • 这就是问题所在!我忘记了最后一个参数的true!! :D
【解决方案2】:

也许您可以使用mousemove 并像这样跟踪当前元素(记住父母):

let lastTarget = null;

document.addEventListener('mousemove', function(e) {
 const target = checkWithParents(e.target);
 if (target && target != lastTarget) {
   alert('mouseenter');
 }
 lastTarget = target;
})

function checkWithParents(el) {
  while (el) {
    if (el && el.classList && el.classList.contains('demo')) {
      return el;
    }
    el = el.parentNode;
  }
  return null;
}
.demo {
  background-color: tomato;
  height: 300px;
  width: 300px;
  margin: 50px;
}
<div class="demo"><div class="inner"></div></div>
<div class="demo"><div class="inner"></div></div>

【讨论】:

  • 没有。需要鼠标输入。鼠标可能不会移动:)
  • @Alvaro 我认为即使 jquery 也不能像你想要的那样工作,检查这个fiddle,把你的鼠标放在 div 的右边,当 div 移到你的鼠标上时,什么都不会发生(除非你移动鼠标)。
  • 我可以在不移动鼠标的情况下向上和向下滚动(仅使用触控板的滚轮效果)并且警报不断触发。
猜你喜欢
  • 2021-09-30
  • 2018-12-31
  • 1970-01-01
  • 2013-02-24
  • 2014-10-04
  • 2017-10-12
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
相关资源
最近更新 更多