如何防止 <button /> 元素上的事件传播?
How to prevent event propagation on a <button /> element?
我有一个 button
元素,里面有一个 span
标签:
<button onClick={this.doSomething.bind(this)}>
<span>Some text</span>
</button>
doSomething
函数如下:
function doSomething(e){
e.stopPropagation();
e.preventDefault();
if(e.target.classList.contains("disabled")){
return false;
}
// Continue with button action...
}
当按钮有 disabled
class 我不希望按钮触发。目前,当单击按钮的边缘时,它不会触发。但是,当单击按钮的内部部分(文本所在的位置)时,它会触发 - 我想避免这种情况 - 我该怎么做?
你可以用CSS规则处理它:
button.disabled span {
pointer-events: none;
}
甚至:
button.disabled * {
pointer-events: none;
}
function doSomething(e){
e.stopPropagation();
e.preventDefault();
if(e.target.classList.contains("disabled")){
return false;
}
console.log('triggered', e.target);
// Continue with button action...
}
button.disabled span {
pointer-events: none;
}
<button onclick="doSomething(event)" class="disabled">
<span>Some text (Disabled)</span>
</button>
<button onclick="doSomething(event)" class="">
<span>Some text</span>
</button>
我建议使用按钮的禁用属性而不是 class。
disabled attribute
那么您仍然可以使用以下方式设置按钮样式:
.button[disabled] or button[disabled]
希望对您有所帮助。
原因是单击的元素 SPAN 是事件 target
,而不是 BUTTON,后者是 currentTarget。检查 class 代替 event.currentTarget
:
function doSomething(e){
e.stopPropagation();
e.preventDefault();
console.log('triggered', e.target, e.currentTarget);
if (e.currentTarget.classList.contains("disabled")) {
console.log('Exit');
return false;
}
console.log('Continue'); // Continue with button action...
}
button.disabled span {
pointer-events: none;
}
<button onclick="doSomething(event)" class="disabled">
<span>Some text</span>
</button>
我有一个 button
元素,里面有一个 span
标签:
<button onClick={this.doSomething.bind(this)}>
<span>Some text</span>
</button>
doSomething
函数如下:
function doSomething(e){
e.stopPropagation();
e.preventDefault();
if(e.target.classList.contains("disabled")){
return false;
}
// Continue with button action...
}
当按钮有 disabled
class 我不希望按钮触发。目前,当单击按钮的边缘时,它不会触发。但是,当单击按钮的内部部分(文本所在的位置)时,它会触发 - 我想避免这种情况 - 我该怎么做?
你可以用CSS规则处理它:
button.disabled span {
pointer-events: none;
}
甚至:
button.disabled * {
pointer-events: none;
}
function doSomething(e){
e.stopPropagation();
e.preventDefault();
if(e.target.classList.contains("disabled")){
return false;
}
console.log('triggered', e.target);
// Continue with button action...
}
button.disabled span {
pointer-events: none;
}
<button onclick="doSomething(event)" class="disabled">
<span>Some text (Disabled)</span>
</button>
<button onclick="doSomething(event)" class="">
<span>Some text</span>
</button>
我建议使用按钮的禁用属性而不是 class。 disabled attribute
那么您仍然可以使用以下方式设置按钮样式:
.button[disabled] or button[disabled]
希望对您有所帮助。
原因是单击的元素 SPAN 是事件 target
,而不是 BUTTON,后者是 currentTarget。检查 class 代替 event.currentTarget
:
function doSomething(e){
e.stopPropagation();
e.preventDefault();
console.log('triggered', e.target, e.currentTarget);
if (e.currentTarget.classList.contains("disabled")) {
console.log('Exit');
return false;
}
console.log('Continue'); // Continue with button action...
}
button.disabled span {
pointer-events: none;
}
<button onclick="doSomething(event)" class="disabled">
<span>Some text</span>
</button>