当我在链接上使用event.preventDefault()时,它会起作用,但是当我在按钮上使用它时不会!
DEMO
我的代码:
<a id="link" href="http://www.google.com">link</a>
<button id="button" onclick="alert('an alert')">button</button>
$('#link').click(function(event){
event.preventDefault();
});
$('#button').click(function(event){
event.preventDefault();
});
链接操作被取消,但是当我单击按钮时,仍然执行onClick操作
有帮助吗?我想要做的是阻止按钮onClick动作而不更改按钮html (我知道该怎么做)
$('#button').removeAttr('onclick');
答案 0 :(得分:25)
如果元素上有多个事件处理程序,并且您希望阻止其他事件执行,则需要event.stopImmediatePropagation();
。 preventDefault()
只会阻止默认操作(例如提交表单或导航到其他网址),而stopImmediatePropagation()
会阻止事件冒泡DOM树并且会阻止任何其他事件处理程序在执行相同的元素上。
以下是一些解释各种方法的有用链接:
但是,由于它仍然不起作用,这意味着onclick=""
处理程序在附加的事件处理程序之前执行。您的代码运行时,您无法执行任何操作onclick
代码已经执行。
最简单的解决方案是完全删除该处理程序:
$('#button').removeAttr('onclick');
即使通过普通javascript(addEventListener()
)与useCapture=true
添加事件监听器也无济于事 - 显然内联事件甚至在事件开始降序DOM树之前就会触发。
如果您只是因为需要而不想删除处理程序,只需将其转换为正确连接的事件:
var onclickFunc = new Function($('#button').attr('onclick'));
$('#button').click(function(event){
if(confirm('prevent onclick event?')) {
event.stopImmediatePropagation();
}
}).click(onclickFunc).removeAttr('onclick');
答案 1 :(得分:4)
您需要stopImmediatePropagation
而不是preventDefault
。 preventDefault会阻止默认的浏览器行为,而不是方法冒泡。
答案 2 :(得分:3)
preventDefault
函数不会停止触发事件处理程序,而是停止发生默认操作。对于链接,它会停止导航,对于按钮,它会停止提交表单等等。
您要找的是stopImmediatePropagation
。
答案 3 :(得分:2)
你可以试试这个:
$('#button').show(function() {
var clickEvent = new Function($(this).attr('click')); // store it for future use
this.onclick = undefined;
});
<强> DEMO 强>
答案 4 :(得分:0)
对我有帮助
function goToAccessoriesPage(targert) {
targert.onclick.arguments[0].preventDefault();
...
}