Mouseenter 委托问题 vanilla js

Posted

技术标签:

【中文标题】Mouseenter 委托问题 vanilla js【英文标题】:Mouseenter delegation problems vanilla js 【发布时间】:2021-09-30 11:05:09 【问题描述】:

我正在尝试使用 vanilla javascript 创建一个放大功能,它使用 jquery 非常容易,但使用 Javascript 时,mouseenter 函数会触发多次。结果我在我的 html 中多次收到 <div class="sp-zoom">...。

如何阻止它多次触发?

我已经在 *** 上尝试了很多不同的解决方案,但我无法完成这项工作。

这里是一个简单的例子:

document.querySelector('.sp-large').addEventListener('mouseenter', event => 
    var largeUrl = document.querySelector('.sp-large').querySelector('a').getAttribute('href');
    document.querySelector('.sp-large').innerHTML += '<div class="sp-zoom"><img src="' + largeUrl + '"/></div>';
    document.querySelector('.sp-zoom').style.display = 'block';
    event.preventDefault();
);
&lt;div class="sp-large"&gt;&lt;a href="https://mvz-bietigheim.de/wp-content/uploads/2017/05/placeholder-image10.jpg" class="sp-current-big"&gt;&lt;img src="https://www.bestructural.com/wp-content/uploads/2015/03/generic-image-placeholder.png" width="600" height="464" alt=""&gt;&lt;/a&gt;&lt;/div&gt;

根据要求提供工作 jquery 版本:

$(document.body).on('mouseenter', '.sp-non-touch .sp-large', function(event) 
  var largeUrl = $('a', this).attr('href');
  $(this).append('<div class="sp-zoom"><img src="' + largeUrl + '"/></div>');
  $(this).find('.sp-zoom').fadeIn(250);
  event.preventDefault();
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="sp-large"><a href="https://mvz-bietigheim.de/wp-content/uploads/2017/05/placeholder-image10.jpg" class="sp-current-big"><img src="https://www.bestructural.com/wp-content/uploads/2015/03/generic-image-placeholder.png"   ></a></div>

【问题讨论】:

我的猜测是更改 innerHTML 会以某种方式重新触发 mouseenter 事件。 问题是您从其他元素获取 mouseenter 事件冒泡吗?是否需要检查事件的目标并丢弃目标错误的? 你能展示工作的jQuery版本吗,因为你上面使用的逻辑没有多大意义。你在.sp-large 上做一个鼠标,然后将你的缩放添加到同一个 div 中,所以由于事件冒泡它变得无限。 当前代码不检查是否已经存在缩放 div,并在每个 mouseenter 处添加新的。也许您需要默认显示缩放 div 但隐藏并在悬停时显示?可以只用 css 完成 除此之外,您可能想写成document.querySelector('.sp-large a') 而不是像document.querySelector('.sp-large').querySelector('a') (***.com/questions/38228487/…) 这样写。 【参考方案1】:

您必须在鼠标离开时清除&lt;div class="sp-zoom"&gt;&lt;img src="' + largeUrl + '"/&gt;&lt;/div&gt; - 我认为您可以通过这种方式实现。

【讨论】:

这应该是评论,没有答案。 对不起!这是我的错

以上是关于Mouseenter 委托问题 vanilla js的主要内容,如果未能解决你的问题,请参考以下文章

将“Vanilla”Javascript 库加载到 Node.js 中

jQuery---委托事件原理

如果我提到最外层的选择器,为啥事件委托不起作用?

jquery hover中嵌套mouseenter,mouseenter函数执行多次的问题解决方案

❲Vanilla技巧❳Vanilla(OpenResty)实现的Restful

ClearDb + Azure:Vanilla 论坛安装真的很慢