我有一个forEach循环,它获取页面上具有指定属性的任何元素的属性.它看起来像这样:

const cursorActionElements = document.querySelectorAll("[data-cursor]");

cursorActionElements.forEach((el) => {
 const elAttr = el.getAttribute("data-cursor");

 el.addEventListener('mouseover', () => {
   console.log(elAttr)
 });
});

一切都运行得很好.它遍历并获取具有data-cursor属性的所有元素,并将其值存储在elAttr变量中.然而,由于某种原因,如果目标的父级恰好ALSO具有data-cursor属性,则它同时返回目标的data-cursor值和其父级的data-cursor值.

我真的不知道如何解决这个问题.我曾想过在mouseover上检索data-cursor值,但这只是意味着我需要使用another Event Listner,它似乎会让我的网站变慢一些.

请帮帮忙.

推荐答案

问题在于,事件是从子级向父级沿DOM向上传播,因此每个元素都会触发一次事件处理程序.要解决此问题,可以对传递给事件处理程序的事件调用stopPropagation().

还要注意,最好也从事件对象中读取data属性,以避免在依赖于事件处理程序内循环中的变量集时可能出现的任何作用域/闭包问题.

下面是一个进行了上述更改的工作示例:

const cursorActionElements = document.querySelectorAll("[data-cursor]");

cursorActionElements.forEach((el) => {
  el.addEventListener('mouseover', e => {
    e.stopPropagation();
    const elAttr = e.currentTarget.getAttribute("data-cursor");
    console.log(elAttr)
  });
});
<div data-cursor="foo">foo</div>
<div data-cursor="bar">
  bar
  <div data-cursor="foobar">
    foobar
  </div>
  <div>
    no data attribute
  </div>
</div>

Javascript相关问答推荐

如何在不分配整个数组的情况下修改包含数组的行为主体?

有什么(最佳)方法可以从模块中获取脚本模块的多姆元素吗?

fs. writeFile()vs fs.writeFile()vs fs.appendFile()

无法在nextjs应用程序中通过id从mongoDB删除'

为什么promise对js中的错误有一个奇怪的优先级?

更改JSON中使用AJAX返回的图像的路径

你怎么看啦啦队的回应?

闭包是将值复制到内存的另一个位置吗?

Eval vs函数()返回语义

本地库中的chartjs-4.4.2和chartjs-plugin-注解

如何在Svelte中从一个codec函数中调用error()?

在Reaction中的handleSubmit按钮内,useSelector值仍然为空

让chart.js饼图中的一个切片变厚?

无法重定向到Next.js中的动态URL

是否可以在不更改组件标识的情况下换出Reaction组件定义(以维护状态/引用等)?如果是这样的话,是如何做到的呢?

bootstrap S JS赢得了REACT中的函数/加载

rxjs在每次迭代后更新数组的可观察值

重新渲染过多(&Q).REACT限制渲染次数以防止无限循环.使用REACT下拉菜单时

REACT-本机错误:错误类型错误:无法读取未定义的容器的属性

浮动标签效果移除时,所需的也被移除