为什么 `event.preventDefault()` 不适用于两个嵌套的 div?
Why `event.preventDefault()` is not working for two nested divs?
function clickOut(event) {
event.preventDefault();
alert('click on out');
}
function clickIn(event) {
event.preventDefault();
alert('click on in');
}
#out {
width: 100px;
height: 100px;
border: 1px solid red;
}
#in {
width: 50px;
height: 50px;
border: 1px solid blue;
}
<div id="out" onclick="clickOut(event)">
<div id="in" onclick="clickIn(event)">
</div>
</div>
现场演示:http://jsbin.com/qomuteyoke/1/edit?html,css,js,output
为什么我点击了里面的div,即使我调用了event.preventDefault()
,还是弹出两个提示?第一个是 click on in
,第二个是 click on out
?
尝试使用 event.stopPropagation()
:
jQuery def:
Description: Prevents the event from bubbling up the DOM tree,
preventing any parent handlers from being notified of the event.
MDN def:
Prevents further propagation of the current event.
function clickIn(event) {
event.stopPropagation();
alert('click on in');
}
阻止默认不会阻止事件传播给父级。您想要使用 event.stopPropagation();
来阻止当前事件的进一步传播。 MDN
function clickOut(event) {
event.stopPropagation();
alert('click on out');
}
function clickIn(event) {
event.stopPropagation();
alert('click on in');
}
#out {
width: 100px;
height: 100px;
border: 1px solid red;
}
#in {
width: 50px;
height: 50px;
border: 1px solid blue;
}
<div id="out" onclick="clickOut(event)">
<div id="in" onclick="clickIn(event)">
</div>
</div>
css
这是因为没有默认的动作来阻止。防止默认将对用于防止默认行为的锚标记起作用。你想要做的是停止点击的传播,所以它不会从内部 div 冒泡。这样,如果您单击内部 div,则只有内部 div 单击会触发。
将您的 event.preventDefault()
替换为 event.stopPropagation()
。
function clickOut(event) {
event.preventDefault();
alert('click on out');
}
function clickIn(event) {
event.preventDefault();
alert('click on in');
}
#out {
width: 100px;
height: 100px;
border: 1px solid red;
}
#in {
width: 50px;
height: 50px;
border: 1px solid blue;
}
<div id="out" onclick="clickOut(event)">
<div id="in" onclick="clickIn(event)">
</div>
</div>
现场演示:http://jsbin.com/qomuteyoke/1/edit?html,css,js,output
为什么我点击了里面的div,即使我调用了event.preventDefault()
,还是弹出两个提示?第一个是 click on in
,第二个是 click on out
?
尝试使用 event.stopPropagation()
:
jQuery def:
Description: Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event.
MDN def:
Prevents further propagation of the current event.
function clickIn(event) {
event.stopPropagation();
alert('click on in');
}
阻止默认不会阻止事件传播给父级。您想要使用 event.stopPropagation();
来阻止当前事件的进一步传播。 MDN
function clickOut(event) {
event.stopPropagation();
alert('click on out');
}
function clickIn(event) {
event.stopPropagation();
alert('click on in');
}
#out {
width: 100px;
height: 100px;
border: 1px solid red;
}
#in {
width: 50px;
height: 50px;
border: 1px solid blue;
}
<div id="out" onclick="clickOut(event)">
<div id="in" onclick="clickIn(event)">
</div>
</div>
css
这是因为没有默认的动作来阻止。防止默认将对用于防止默认行为的锚标记起作用。你想要做的是停止点击的传播,所以它不会从内部 div 冒泡。这样,如果您单击内部 div,则只有内部 div 单击会触发。
将您的 event.preventDefault()
替换为 event.stopPropagation()
。