2009-04-24 18 views
12

Ich bin verrückt nur versuchen, einen onclick-Handler aus dem Ereignis in jQuery zu lösen, damit ich es später an eine andere Funktion binden kann.jquery unbind click

Ich habe den Code in einer Testseite isoliert, so gibt es nichts anderes als das Fleisch, nur eine Taste, die eine Funktion und einen Skript fordert, dass versuchen es zu lösen:

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

Jeder weiß, warum den Klick Das Ereignis ruft die Funktion hi() auf, egal was ich im Dokument gesagt habe.

Dank

Antwort

21

Weil Sie es in dem HTML-Attribute gesetzt, bleibt es dort. Es war nicht an jQuery gebunden, so dass jQuery seine Verwendung nicht verfolgt.

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

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

+0

Meinst du, alles, was in einem deklarativen Modus gesetzt ist, kann nicht so gelöst werden? – antonioh

+3

korrekt, können Sie vielleicht in der Lage sein, es durch $ ("# btnNext") zu trennen. Attr ('onclick', '') ... aber besser, alle Ihre Bindung mit jQuery zu tun. Es ist viel sauberer und weniger verwirrend. Einfach das Javascript zu vergessen, das Sie in Ihren Attributen hinzugefügt haben. ;) –

+0

Schöne, jetzt verstehe ich, warum es nicht funktioniert hat. Ich werde die Bindung machen, wie du sagst. Vielen Dank! – antonioh

9

Nur für das Protokoll, können Sie die removeAttr jQuery-Funktion verwenden, um die eingangs genannten onclick Attribut zu entfernen.

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

Auch als Reaktion auf Chad, ich stimme zu, dass es in der Regel besser ist, alles zu tun, um Ihre Bindung mit jQuery, aber ich bin in einer Situation (mit ASP.NET MVC), die einzelnen Verbindungen erfordert einige haben Modellparameter in ihren Click-Event-Handlern. Es wäre mehr verschachtelte IMO zu versuchen, diese Event-Handler über jQuery zu verkabeln.

+0

das funktioniert natürlich nicht im IE. Wer weiß, wie man "onclick" -Ereignisse im IE löst? –

0

konnte ich nicht bekommen removeAttr zu arbeiten, aber dies tut:

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

ich will, um den ASP.NET-supplied onclicks entfernen (nur für SelectedNodeChanged) in meinem TreeView, so konnte ich den Griff Ereignis auf dem Client. Natürlich enthielt meine Klickfunktion mehr als "return false". später

0

Angenommen, Sie

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

haben Sie brauchen nicht einmal zu binden, wenn Sie es lösen wollen. Um dies zu tun, können Sie einfach tun:

$(elem).unbind(); 

und das wird die Handler unabhängig vom Typ entfernen. Wenn Sie genauer sein möchten, können Sie immer einen Ereignistyp wie "Klicken" übergeben.