2009-04-24 32 views
12

Tôi đang đi hạt chỉ cố gắng để unbind một handler onclick từ sự kiện trong jQuery vì vậy tôi có thể ràng buộc nó sau này vào một chức năng khác.jquery unbind click

Chúng tôi đã tách mã trong một trang thử nghiệm nên không có gì nhưng thịt, chỉ cần một nút mà các cuộc gọi một hàm và một kịch bản mà cố gắng để unbind nó:

<%@ 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> 

Bất kỳ ai biết lý do tại sao nhấp chuột event giữ gọi hàm hi() bất kể tôi đã nói gì trong document.ready?

Cảm ơn

Trả lời

21

Vì bạn đặt nó vào thuộc tính html, nó vẫn ở đó. Nó không bị ràng buộc với jQuery nên jQuery không theo dõi việc sử dụng nó.

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

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

+0

Bạn có nghĩa là bất kỳ điều gì được đặt trong chế độ khai báo không thể hủy liên kết như thế này? – antonioh

+3

chính xác, bạn có thể có thể unbind nó bằng $ ("# btnNext") attr ('onclick', '') ... nhưng tốt hơn để làm tất cả các ràng buộc của bạn với jQuery. Nó sạch hơn và ít khó hiểu hơn. Dễ quên về javascript bạn đã thêm vào thuộc tính của mình. ;) –

+0

Đẹp nhất, bây giờ tôi hiểu tại sao nó không hoạt động. Tôi sẽ làm ràng buộc như bạn nói. Cảm ơn! – antonioh

9

Chỉ cần cho các hồ sơ, bạn có thể sử dụng removeAttr jQuery chức năng để loại bỏ các thuộc tính ban đầu quy định onclick.

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

Ngoài ra, để đáp ứng với Chad, tôi đồng ý rằng đó là thường tốt hơn để làm tất cả những bạn ràng buộc với jQuery, nhưng tôi đang ở trong một tình huống (sử dụng ASP.NET MVC) mà yêu cầu liên kết cá nhân để có một số tham số mô hình trong trình xử lý sự kiện nhấp chuột của họ. Nó sẽ là IMO phức tạp hơn để cố gắng kết nối các trình xử lý sự kiện này thông qua jQuery.

+0

điều này không hoạt động trong IE (tất nhiên). Bất cứ ai cũng biết một cách để unbind "onclick" sự kiện trong IE? –

0

tôi không thể có được removeAttr để làm việc, nhưng điều này không:

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

Tôi đã muốn loại bỏ các onclicks ASP.NET-cung cấp (chỉ dành riêng cho SelectedNodeChanged) trong TreeView tôi, vì vậy tôi có thể xử lý các sự kiện trên máy khách. Tất nhiên, hàm nhấp chuột của tôi bao gồm nhiều hơn "return false".

0

Hãy nói rằng bạn có

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

bạn thậm chí không cần phải ràng buộc nó nếu bạn muốn để unbind nó sau này. Để làm như vậy, bạn có thể thực hiện:

$(elem).unbind(); 

và điều đó sẽ loại bỏ trình xử lý bất kể loại. Nếu bạn muốn cụ thể hơn, bạn luôn có thể chuyển loại sự kiện như "nhấp".

Các vấn đề liên quan