2010-05-05 40 views
1

我想使用事件偵聽器來阻止提交按鈕的onclick聲明,但是,使用event.preventDefault()不能按預期工作。如何防止執行onclick語句?

的代碼是這樣的:

<?xml version="1.0" encoding="utf-8"?> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 

    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 

<head> 

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <script type="application/x-javascript"> 
     function addListener() { 
      document.getElementById("submit").addEventListener("click", 
       function(ev) { 
        alert("listener"); 
        ev.preventDefault(); 
       }, 
       false); 
     } 
    </script> 

    <title></title> 

</head> 

<body onload="addListener();"> 
<form id="form" method="post" target=""> 
<input type="submit" id="submit" onclick="alert('onclick')" value="test" /> 
</form> 

</body> 

</html> 

預期的行爲只是「監聽器」將被警告,但在實踐中(火狐3.7a5pre),「點擊」和「聽衆」都被驚動了,在給定的順序。

看來onclick正在偵聽器之前執行,所以event.preventDefault()不起作用。有沒有辦法阻止onclick被執行?

回答

3

DOM0處理程序(onclick屬性等)和DOM2處理程序(通過attachEvent/addEventListener動態添加)是相互獨立的。

您可以做的唯一的事情就是移除DOM0處理程序(通過爲屬性分配一個空字符串)並且僅使用DOM2處理程序。

您可以在刪除它之前從屬性檢索DOM0處理程序,然後將其重新註冊爲DOM2處理程序。你會遇到一些瀏覽器不一致的情況(有些會給你一個Function對象,其他的會給你一個字符串),但是這些很容易在代碼中處理。

+0

感謝您的回答,這是有幫助的。 – 2010-05-05 08:19:38

+2

+1 - 正在寫類似的東西。嘗試將'preventDefault()'看作阻止元素的默認操作 - 如果未設置任何事件將會發生的操作。通過'onclick'屬性設置一個事件不是設置默認動作,所以'preventDefault()'不會阻止這個處理器被調用。 – 2010-05-05 08:20:41

-1

你可以試試這個:

function addListener() { 
     document.getElementById("submit").addEventListener("click", 
      function(ev) { 
       alert("listener"); 
       ev=ev¦¦event; 
       ev.preventDefault? ev.preventDefault() : ev.returnValue = false; 
      }, 
      false); 
    } 
+0

這對Firefox有相同的效果。您的代碼只能解決舊版瀏覽器的兼容性問題。 – 2010-05-05 08:23:13

+0

在'click'處理程序的命令列表末尾添加'return false;'。你的點擊事件將會發生 - 當你使用addEventListener('click',handler(){});這是事件捕獲和觸發部分 - (MS也定義事件冒泡階段) - 如果您找到一種方法來強制事件在註冊處理程序後「取消執行」,我有興趣瞭解它。 – Andreas 2010-05-05 08:43:43