2012-05-03 102 views
10

當我在一個鏈接上使用event.preventDefault()時,它可以工作,但是當我在一個按鈕上使用它時並不行!
DEMO
我的代碼:preventDefault()不起作用

<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

請勿使用內嵌html屬性添加事件。使用適當的事件註冊。 –

+0

我沒有添加任何東西,HTML是由Framework生成的,Magento如果你想知道的話。 – skafandri

+1

爲什麼你不想使用removeAttr('onClick')? –

回答

21

你想event.stopImmediatePropagation();如果有一個元素的多個事件處理程序,並要阻止他人執行preventDefault()只是阻止默認操作(例如提交表單或導航到另一個URL),而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'); 
+0

不起作用! http://jsfiddle.net/46sbB/1/ – skafandri

+0

6人誰upvoted這個答案告訴我爲什麼它不工作? – skafandri

+0

我已更新我的答案 – ThiefMaster

2

你可以試試這個:

$('#button').show(function() { 
    var clickEvent = new Function($(this).attr('click')); // store it for future use 
    this.onclick = undefined; 
}); 

DEMO

2

preventDefault功能不被觸發停止的事件處理程序,而是停止默認操作發生。對於鏈接,停止導航,按鈕,停止提交表單等。

你在找什麼是stopImmediatePropagation

+0

不起作用!http://jsfiddle.net/46sbB/1/ – skafandri

+0

啊......你真的不能控制在同一個元素上註冊的其他事件處理程序,你可以做的是防止事件冒泡。對不起,我誤解了你的問題。 –

相關問題