首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止子元素发生单击?

如何防止子元素发生单击?
EN

Stack Overflow用户
提问于 2022-03-18 09:55:02
回答 3查看 47关注 0票数 0

在子元素而不是父元素上接收单击事件时,我遇到了问题。目前,单击事件发生在span元素上,而不是链接元素上。

我搜索了几个类似的问题,并找到了关于EventBubling和如何防止它的信息,但不幸的是,它对我没有用。

HTML

代码语言:javascript
复制
        <div class="container">
            <div class="list">
                <a href="#" data="data-1">
                    <span>Text 1</span>
                </a>
            </div>
            <div class="list">
                <a href="#" data="data-2">
                    <span>Text 2</span>
                </a>
            </div>
            <div class="list">
                <a href="#" data="data-3">
                    <span>Text 3</span>
                </a>
            </div>
        </div>

JS

代码语言:javascript
复制
const list = document.querySelectorAll('.list > a');

Array.from(list).forEach((el) =>
    el.addEventListener('click', (e) => {
        //e.preventDefault();
        e.stopPropagation();
        const dataAttr = e.target.getAttribute('data');
        console.log(dataAttr);
    })
);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-03-18 10:00:53

使用e.currentTarget而不是e.target

代码语言:javascript
复制
e.currentTarget.getAttribute('data');

请参阅:currentTarget属性和目标属性在JavaScript中的确切区别是什么?

如上述答覆所述:

target是触发事件的元素(例如,用户单击了阻塞引号),currentTarget是将事件侦听器附加到的元素。

以下工作代码

代码语言:javascript
复制
const list = document.querySelectorAll('.list a');
//console.log(list);

Array.from(list).forEach((el) =>
  el.addEventListener('click', (e) => {
    //e.preventDefault();
    e.stopPropagation();
    const dataAttr = e.currentTarget.getAttribute('data');
    console.log(dataAttr);
  })
);
代码语言:javascript
复制
<div class="list">
  <a href="#" data="data-1">
    <span>Text 1</span>
  </a>
</div>
<div class="list">
  <a href="#" data="data-2">
    <span>Text 2</span>
  </a>
</div>
<div class="list">
  <a href="#" data="data-3">
    <span>Text 3</span>
  </a>
</div>

票数 2
EN

Stack Overflow用户

发布于 2022-03-18 09:59:10

传播的工作方式与你所认为的不同。

您想要的是始终获得.closest() a-标记,而不管您单击了哪个子元素。然后你得到它的数据属性

代码语言:javascript
复制
const list = document.querySelectorAll('.list > a');

Array.from(list).forEach((el) =>
    el.addEventListener('click', (e) => {
        //e.preventDefault();
        e.stopPropagation();
        const dataAttr = e.target.closest('a').getAttribute('data');
        console.log(dataAttr);
    })
);
代码语言:javascript
复制
<div class="container">
  <div class="list">
    <a href="#" data="data-1">
      <span>Text 1</span>
    </a>
  </div>
  <div class="list">
    <a href="#" data="data-2">
      <span>Text 2</span>
    </a>
  </div>
  <div class="list">
    <a href="#" data="data-3">
      <span>Text 3</span>
    </a>
  </div>
</div>

票数 1
EN

Stack Overflow用户

发布于 2022-03-18 09:59:12

由于您要将事件处理程序添加到除了span元素之外的任何元素中,所以我将假设您实际上不希望阻止对span的单击。相反,您希望知道单击哪个链接,即使单击是在跨度上。

使用currentTarget而不是target

currentTarget将为您提供事件处理程序绑定到的元素,而不是实际收到单击的元素。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71525212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档