2010-05-05 74 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