preventDefault()不起作用

时间:2012-05-03 13:25:10

标签: javascript jquery javascript-events

当我在链接上使用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');

5 个答案:

答案 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会阻止默认的浏览器行为,而不是方法冒泡。

http://api.jquery.com/event.stopImmediatePropagation/

http://api.jquery.com/event.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();
       ...
}