2009-04-24 24 views
12

Me estoy volviendo loco intentando desvincular un controlador onclick del evento en jQuery para poder enlazarlo más tarde a otra función.jquery unbind click

me han aislado el código en una página de prueba por lo que no es nada más que la carne, sólo un botón que llama a una función y un guión que intentos para desvincularla:

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

Alguien sabe por qué el clic evento sigue llamando a la función hi() sin importar lo que dije en el documento. ¿listo?

Gracias

Respuesta

21

porque se le puso en el atributo HTML, se queda allí. No estaba vinculado con jQuery, por lo que jQuery no rastrea su uso.

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

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

+0

¿Quiere decir que todo lo establecido en modo declarativo no se puede desvincular de esta manera? – antonioh

+3

correcto, tal vez puedas desvincularlo por $ ("# btnNext"). Attr ('onclick', '') ... pero es mejor hacer todos tus enlaces con jQuery. Es mucho más limpio y menos confuso. Es fácil olvidarse de los javascript que ha agregado en sus atributos. ;) –

+0

Bueno, ahora entiendo por qué no funcionó. Haré la encuadernación como dices. ¡Gracias! – antonioh

9

Sólo para que conste, se puede utilizar la función de jQuery removeAttr para quitar el atributo especificado inicialmente onclick.

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

Además, en respuesta a Chad, estoy de acuerdo que es generalmente mejor para hacer todo su unión con jQuery, pero estoy en una situación (con ASP.NET MVC), que exige que los enlaces individuales para tener alguna parámetros del modelo en sus manejadores de eventos click. Sería una IMO más intrincada tratar de conectar estos manejadores de eventos a través de jQuery.

+0

esto no funciona en IE (por supuesto). ¿Alguien sabe una forma de desvincular eventos "onclick" en IE? –

0

no pude conseguir removeAttr para trabajar, pero esto hace:

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

yo quería para eliminar los onclicks ASP.NET suministrado (sólo para SelectedNodeChanged) en mi TreeView, por lo que podía manejar la evento en el cliente. Por supuesto, mi función de clic incluía más que "return false".

0

Digamos que usted tiene

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

que ni siquiera necesita para obligar a éste si quieres desvincularla más tarde. Para hacerlo, puede hacerlo:

$(elem).unbind(); 

y eso eliminará los controladores independientemente del tipo. Si quieres ser más específico, siempre puedes pasar un tipo de evento como "clic".

Cuestiones relacionadas