如何防止链接点击事件传播?

时间:2018-08-10 14:35:39

标签: javascript stoppropagation

当我单击我的a-tag时,我不希望触发父母的事件。如果孩子有一个正常的事件侦听器,可以通过event.stopPropagation()阻止它,但是当没有“事件”时该怎么办?

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="parent" style="width:100px; height:100px; background-color: red">
    <a id="child" href="https://i.kym-cdn.com/entries/icons/facebook/000/013/564/doge.jpg">Text</a>
</div>
<script>
    document.getElementById("parent").addEventListener("click", function () {
        alert("Oh no, you clicked me!");
    });
</script>
<script src="test.js"></script>
</body>
</html>

4 个答案:

答案 0 :(得分:2)

方法1

  

如果孩子具有正常的事件侦听器,则可以通过event.stopPropagation()阻止它

是的

  

但是当没有“事件”时该怎么办?

有一个事件。您只是不听而已。

您可以通过侦听child元素来解决问题:

document.getElementById("parent").addEventListener("click", function() {
  alert("Oh no, you clicked me!");
});

document.querySelector("a").addEventListener("click", function(e) {
  e.stopPropagation();
});
<div id="parent" style="width:100px; height:100px; padding: 1em; background-color: #aaa">
  <a id="child" href="https://placeimg.com/200/200/nature/sepia">Text</a>
</div>


方法2

或者,您可以检查事件的target并查看它是否不可接受。

const blacklist = [document.querySelector("a")];

document.getElementById("parent").addEventListener("click", function(e) {
  if (blacklist.includes(e.target)) {
    return;
  }
  alert("Oh no, you clicked me!");
});
<div id="parent" style="width:100px; height:100px; padding: 1em; background-color: #aaa">
  <a id="child" href="https://placeimg.com/200/200/nature/sepia">Text</a>
</div>

答案 1 :(得分:0)

只需将点击侦听器添加到链接上即可进行event.stopPropagation();。这样可以防止对子项的单击冒泡(从而触发对父项的单击)。

document.getElementById("parent").addEventListener("click", function() {
  console.log('parent received click');
});

document.getElementById("child").addEventListener("click", function(e) {
  e.preventDefault(); // this line prevents changing to the URL of the link href
  e.stopPropagation(); // this line prevents the link click from bubbling
  console.log('child clicked');
});
<div id="parent" style="width:100px; height:100px; background-color: red">
  <a id="child" href="https://i.kym-cdn.com/entries/icons/facebook/000/013/564/doge.jpg">Text</a>
</div>
<script>
</script>

答案 2 :(得分:0)

event 对象也可在 onclick 处理程序中使用:

<a id="child" href="https://i.kym-cdn.com/entries/icons/facebook/000/013/564/doge.jpg"
  onclick="event.stopPropagation()">Text</a>

灵感来自this

⚠️ 与 Internet Explorer 不兼容,但它与 Edge 兼容(在 v89 上测试)。

答案 3 :(得分:-1)

尝试一下。

document.getElementById(id-here).addEventListener("click", function(e) {
  e.stopImmediatePropagation();
  console.log("clicked");
});
根据我的经验,

致电event.stopImmediatePropagation();会给您带来预期的结果。