gpt4 book ai didi

javascript - event.stopPropagation() 不工作 - 捕获仍然传递函数

转载 作者:行者123 更新时间:2023-12-01 16:09:47 26 4
gpt4 key购买 nike

首先 - 我是一个菜鸟。对不起,如果这个问题足够基本。其次 - 我尝试搜索,如我所见,我按照其他帖子中的说明应用了解决方案。

话虽这么说...我有三组 DIV。每组包含 2 个 Divs(一个在另一个里面)。在 OUTER div 上有一个函数,表示如果单击它就制作一个边框。

查看错误:

  1. 点击“外部”一词。
  2. 点击 INNER 一词。

代码假设只在外部制作边框。

HTML

<html>
<head>
<title>Event Propagation</title>
<meta charset="UTF-8" />

</head>
<body onload="onLoad()">

<!--Squares 1-->
<div style="display:inline-block">
<div class="outer" style="height: 100px; width: 100px;">
Outer
<div class="inner" style="height: 50px; width: 50px;margin:20px">
Inner
</div>
</div>
</div>
<!--Squares 2-->
<div style="display:inline-block">
<div class="outer" style="height: 100px; width: 100px;">
Outer
<div class="inner" style="height: 50px; width: 50px;margin:20px">
Inner
</div>
</div>
</div>

<!--Squares 3-->
<div style="display:inline-block">
<div class="outer" style="height: 100px; width: 100px;">
Outer
<div class="inner" style="height: 50px; width: 50px;margin:20px">
Inner
</div>
</div>
</div>


</body>
</html>

JS

    <script>
function onLoad(){

const elOuter = document.querySelectorAll(".outer")

elOuter.forEach(element=>{
element.addEventListener('click', fnChangeColor,false)
})
}

function fnChangeColor(e){

e.target.style.border="1px solid black"

if (e.stopPropagation) {

e.stopPropagation()
} else {

e.cancelBubble = true
}
}

</script>

仅供引用 - 我解决了为 children 创建事件的问题,将 e.stopPropagation 归因于他们。那奏效了。但我知道这不是最好的方法。如果我有一个包含 100 个 div 的 div,那将是人间 hell 。

最佳答案

这是因为当您点击“内部”时,e.target 元素是“内部”,而不是“外部”。

在我看来,你所做的似乎是为了理解事件委托(delegate),这样做:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>xxx</title>
<style>
body > div { display:inline-block; }
.outer { height: 100px; width: 100px; background: lightgrey; }
.inner { height: 50px; width: 50px;margin:20px; background: lightblue; }
.bordering { border: 1px solid black; }
</style>
</head>
<body>
<div> <div class="outer"> Outer <div class="inner"> Inner </div> </div> </div>
<div> <div class="outer"> Outer <div class="inner"> Inner </div> </div> </div>
<div> <div class="outer"> Outer <div class="inner"> Inner </div> </div> </div>
<script>
document.body.onclick= e => {
if (!e.target.matches('.outer')) return // ignore other click events
e.target.classList.toggle('bordering')
}
</script>
</body>
</html>

或者这样

document.querySelectorAll('.outer').forEach(el=>{
el.onclick=e=>{

// console.log(e.target.className)
if (!e.target.matches('.outer')) return // ignore other click events
e.target.classList.toggle('bordering')
}
})

在您的代码中,只使用了一个事件,无法进行任何传播。

当用户点击 .inner 时,事件附加到 .inner 元素上,永远不会附加到 .outer 上。
它就像一个泡沫,遵循自下而上的方式,而不是相反。当气泡找到目标代码(avent 监听器)时,不再传播并且气泡破裂。

如果您想看到一个事件传播,您必须设置2 个事件监听器(这意味着 2 个气泡)。

您可以通过添加 console.log(e.target.className) 来查看,如下所示:

document.querySelectorAll(".outer, .inner") // => 6 event listeners
.forEach(el=>{ el.addEventListener('click', getClick , false) })

var counter = 0

function getClick(e)
{
console.log( `${++counter} - event listener is on : ${e.currentTarget.className}
clicked element is : ${e.target.className} `)
}

cClear.onclick=_=>{ counter = 0; console.clear() }
body > div { display:inline-block; }
.outer { height: 100px; width: 100px; background: lightgrey; }
.inner { height: 50px; width: 50px;margin:20px; background: lightblue; }
<div> <div class="outer"> Outer <div class="inner"> Inner </div> </div> </div>
<div> <div class="outer"> Outer <div class="inner"> Inner </div> </div> </div>
<div> <div class="outer"> Outer <div class="inner"> Inner </div> </div> </div>
<button id="cClear">clear console</button>

关于javascript - event.stopPropagation() 不工作 - 捕获仍然传递函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63425951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com