jQuery 事件捕获停止传播
jQuery event capturing stop propagation
我在 parent div 上有一个事件侦听器,我希望它也不会在 child div onclick 上被触发。
我为此使用 jQuery,因为我需要 .on() 作为动态创建的元素,而且 child div 是使用内联 onclick 动态创建的="myFunction()"。
当 child 中发生 onclick myFunction 时,我不希望 parent .on(click) 再次被调用。
html:
<div id="parent" class="areatext" onkeydown="checkR()">
<div id="input" contenteditable="true" style="min-height:26px;" onkeyup="checkTyping()"></div>
<div id="child" onclick="myFunction()"></div>
</div>
js 文件 1:
$('#parent').on('click', function(event){
$('#input').focus();
console.log('parent clicked!');
event.stopPropagation();
});
js 文件 2:
function myFunction(event){
// actions
// when this is clicked, #parent .on(click) also triggers, i don't want that
}
如您所说,jQuery不支持在捕获阶段监听事件;您必须使用标准 Javascript 而不是 jQuery 才能完成此操作。例如:
const parent = document.querySelector('#parent');
parent.addEventListener('click', (e) => {
if (e.target.matches('#child')) return;
e.stopPropagation();
console.log('parent was clicked, but not on child');
}, true);
function myFunction(event){
console.log('child was clicked on');
// when this is clicked, #parent .on(click) also triggers, i don't want that
}
<div id="parent" class="areatext">
parent
<div id="input" contenteditable="true" style="min-height:26px;" onkeyup="checkTyping()"></div>
<div id="child" onclick="myFunction()">child</div>
</div>
如果您希望在点击子 div 时不调用父 div 的点击处理程序,您必须在子 div 中添加 event.stopPropagation()
] 的点击事件处理程序。
根据您的代码:
$('#parent').on('click', function(event){
$('#input').focus();
console.log('parent clicked!');
//event.stopPropagation(); <-- Not needed
});
$('#parent').on('click', '.child', function(event){
event.stopPropagation();
// ^^^^ Add here
console.log('child clicked!');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="parent" class="areatext" onkeydown="checkR()">Parent
<div id="input" contenteditable="true" style="min-height:26px;" onkeyup="checkTyping()"></div>
<div class="child">child</div>
</div>
我建议您阅读 https://javascript.info/bubbling-and-capturing 以了解冒泡和捕获在 JavaScript 中的工作原理。
我在 parent div 上有一个事件侦听器,我希望它也不会在 child div onclick 上被触发。
我为此使用 jQuery,因为我需要 .on() 作为动态创建的元素,而且 child div 是使用内联 onclick 动态创建的="myFunction()"。 当 child 中发生 onclick myFunction 时,我不希望 parent .on(click) 再次被调用。
html:
<div id="parent" class="areatext" onkeydown="checkR()">
<div id="input" contenteditable="true" style="min-height:26px;" onkeyup="checkTyping()"></div>
<div id="child" onclick="myFunction()"></div>
</div>
js 文件 1:
$('#parent').on('click', function(event){
$('#input').focus();
console.log('parent clicked!');
event.stopPropagation();
});
js 文件 2:
function myFunction(event){
// actions
// when this is clicked, #parent .on(click) also triggers, i don't want that
}
如您所说,jQuery不支持在捕获阶段监听事件;您必须使用标准 Javascript 而不是 jQuery 才能完成此操作。例如:
const parent = document.querySelector('#parent');
parent.addEventListener('click', (e) => {
if (e.target.matches('#child')) return;
e.stopPropagation();
console.log('parent was clicked, but not on child');
}, true);
function myFunction(event){
console.log('child was clicked on');
// when this is clicked, #parent .on(click) also triggers, i don't want that
}
<div id="parent" class="areatext">
parent
<div id="input" contenteditable="true" style="min-height:26px;" onkeyup="checkTyping()"></div>
<div id="child" onclick="myFunction()">child</div>
</div>
如果您希望在点击子 div 时不调用父 div 的点击处理程序,您必须在子 div 中添加 event.stopPropagation()
] 的点击事件处理程序。
根据您的代码:
$('#parent').on('click', function(event){
$('#input').focus();
console.log('parent clicked!');
//event.stopPropagation(); <-- Not needed
});
$('#parent').on('click', '.child', function(event){
event.stopPropagation();
// ^^^^ Add here
console.log('child clicked!');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="parent" class="areatext" onkeydown="checkR()">Parent
<div id="input" contenteditable="true" style="min-height:26px;" onkeyup="checkTyping()"></div>
<div class="child">child</div>
</div>
我建议您阅读 https://javascript.info/bubbling-and-capturing 以了解冒泡和捕获在 JavaScript 中的工作原理。