2009-04-24 29 views
12

我正在尝试从jQuery中的事件中解除绑定onclick处理程序,以便稍后将其绑定到另一个函数。jquery unbind click

我已经分离的代码测试页,所以没有什么,但肉类,只需调用一个函数和一个脚本,尝试取消绑定一个按钮:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> 

<!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 id="Head1" runat="server"> 
    <script src="../../Scripts/jquery-1.3.2.min.js" type="text/javascript"> 
    </script> 

    <script src="../../Scripts/jquery-1.3.2.js" type="text/javascript"> 
    </script> 

    <script type="text/javascript" language="javascript"> 
     $(document).ready(function() { $("#btnNext").unbind('click'); }); 
     function hi() {window.alert("hi");} 
    </script> 
</head> 

<body> 

    <input id="btnNext" type="button" value="Next" onclick="hi();" /> 
</body> 
</html> 

任何人知道为什么点击无论我在document.ready中说过什么,事件都会不断调用hi()函数?

谢谢

回答

21

因为你把它放在html属性中,它就停留在那里。它没有绑定jQuery,所以jQuery没有跟踪它的用法。

$("a").bind('click',hi); 
$("a").unbind('click',hi); 

http://docs.jquery.com/Events/bind

+0

你的意思是说任何设置在声明模式下的东西都不能像这样解除绑定吗? – antonioh 2009-04-24 09:29:37

+3

正确,你可能可以通过$(“#btnNext”)。attr('onclick','')解除绑定,但是最好能够用jQuery来完成所有的绑定。它更干净,更容易混淆。容易忘记你的属性中添加的JavaScript。 ;) – 2009-04-24 09:32:09

9

只是为了记录在案,可以使用removeAttr jQuery函数删除最初指定onclick属性。

$('#btnNext').removeAttr("onclick"); 

另外,响应乍得,我同意这是通常更好地做到所有与jQuery结合,但是我在需要的各个链接到有一些情况(使用ASP.NET MVC)模型参数在他们的点击事件处理程序中。尝试通过jQuery连接这些事件处理程序将会更加令人费解。

0

我不能让removeAttr工作,但这样做:

$("#btnNext").click(function(){ return false; }); 

我想在我的TreeView删除ASP.NET提供的onclicks(只是SelectedNodeChanged),这样我就可以处理事件在客户端。当然,我的点击功能不仅包含“返回false”。

0

比方说,你有

$(elem).on("click", function() { ... }); 

你甚至都不需要绑定,如果你想稍后解除绑定。要做到这一点,只能这样做:

$(elem).unbind(); 

并且这将删除处理程序,无论类型。如果你想要更具体,你总是可以传递一个类似“click”的事件类型。