¿Cómo puedo desvincular "hover" en jQuery?

107

¿Cómo puedo desvincular "hover" en jQuery?

Esto no funciona:

$(this).unbind('hover');
zsharp
fuente
2
¿Está intentando desvincular una función que asignó al evento de desplazamiento o está intentando modificar un <a> </a> desplazamiento?
Justin Niessner
Para aclarar la pregunta de Justin Niessner, ¿está intentando eliminar eventos Javascript / DOM o declaraciones CSS? Este último es un asunto más complicado.
párpados

Respuestas:

214

$(this).unbind('mouseenter').unbind('mouseleave')

o más sucintamente (gracias @Chad Grant ):

$(this).unbind('mouseenter mouseleave')

Creciente fresco
fuente
42
o $ (this) .unbind ('mouseenter mouseleave')
Chad Grant
¿Es necesaria la secuencia para entrar al ratón y luego salir del ratón?
sanghavi7
70

En realidad, la documentación de jQuery tiene un enfoque más simple que los ejemplos encadenados que se muestran arriba (aunque funcionarán bien):

$("#myElement").unbind('mouseenter mouseleave');

A partir de jQuery 1.7, también puede usar $.on()y $.off()para el enlace de eventos, por lo que para desvincular el evento de desplazamiento, usaría el más simple y ordenado:

$('#myElement').off('hover');

El pseudo-nombre-evento "hover" se usa como una abreviatura de "mouseenter mouseleave" pero se manejaba de manera diferente en versiones anteriores de jQuery; requiriéndole que elimine expresamente cada uno de los nombres de eventos literales. Usar $.off()ahora le permite eliminar ambos eventos del mouse usando la misma abreviatura.

Editar 2016:

Sigue siendo una pregunta popular, por lo que vale la pena llamar la atención sobre el punto de @ Dennis98 en los comentarios a continuación de que en jQuery 1.9+, el evento "hover" se desaprobó en favor de las llamadas estándar "mouseenter mouseleave". Entonces, su declaración de vinculación de eventos ahora debería verse así:

$('#myElement').off('mouseenter mouseleave');

Phil.Wheeler
fuente
4
Tengo jQuery 1.10.2 y $.off("hover")no funciona. Sin embargo, usar ambos eventos funciona muy bien.
Alexis Wilke
Vale la pena mencionar que cuando se dan varios argumentos de filtrado, todos los argumentos proporcionados deben coincidir para que se elimine el controlador de eventos. También observo que los documentos de la API de jQuery establecen que el método .off () elimina los controladores de eventos que se adjuntaron con .on (). Si eso significa que SOLO se aplica a eventos agregados usando .on (), no estoy seguro. Pero no debería.
Phil.Wheeler
@AlexisWilke Sí, se eliminó en v1.9, busque el último enlace ...;)
Dennis98
1
@ Dennis98: solo estás hablando de que el hack de jQuery hover se movió a deprecated.js, ¿verdad? el enlace de eventos $ .off () todavía está disponible en versiones posteriores de jQuery.
Phil.Wheeler
Correcto. :) $.off()sigue ahí, es el método recomendado para desvincular eventos actualmente. Entonces, a partir de ahora, debes escribir $(element).off("mouseenter mouseleave");.
Dennis98
10

Desvincular los eventos mouseentery mouseleaveindividualmente o desvincular todos los eventos en los elementos.

$(this).unbind('mouseenter').unbind('mouseleave');

o

$(this).unbind();  // assuming you have no other handlers you want to keep
tvanfosson
fuente
4

unbind () no funciona con eventos en línea codificados.

Entonces, por ejemplo, si desea desvincular el evento mouseover <div id="some_div" onmouseover="do_something();">, descubrí que $('#some_div').attr('onmouseover','')es una forma rápida y sucia de lograrlo.

Jaytop
fuente
4

Otra solución es .die () para eventos que se adjuntan con .live () .

Ex.:

// attach click event for <a> tags
$('a').live('click', function(){});

// deattach click event from <a> tags
$('a').die('click');

Puede encontrar una buena referencia aquí: Explorando jQuery .live () y .die ()

(Perdón por mi inglés: ">)

Briganti
fuente
2

Todo lo que hace el hover detrás de escena es vinculante a la propiedad mouseover y mouseout. Vincularía y desvincularía sus funciones de esos eventos individualmente.

Por ejemplo, digamos que tiene el siguiente html:

<a href="#" class="myLink">Link</a>

entonces tu jQuery sería:

$(document).ready(function() {

  function mouseOver()
  {
    $(this).css('color', 'red');
  }
  function mouseOut()
  {
    $(this).css('color', 'blue');
  }

  // either of these might work
  $('.myLink').hover(mouseOver, mouseOut); 
  $('.myLink').mouseover(mouseOver).mouseout(mouseOut); 
  // otherwise use this
  $('.myLink').bind('mouseover', mouseOver).bind('mouseout', mouseOut);


  // then to unbind
  $('.myLink').click(function(e) {
    e.preventDefault();
    $('.myLink').unbind('mouseover', mouseOver).unbind('mouseout', mouseOut);
  });

});
bendewey
fuente
Corrección, después de mirar el jquery src hover en realidad se vincula a mouseenter / mouseleave. Deberías hacer lo mismo.
bendewey
2

Puede eliminar un controlador de eventos específico que se adjuntó mediante on, utilizandooff

$("#ID").on ("eventName", additionalCss, handlerFunction);

// to remove the specific handler
$("#ID").off ("eventName", additionalCss, handlerFunction);

Con esto, eliminará solo handlerFunction.
Otra buena práctica es establecer un espacio de nombres para múltiples eventos adjuntos

$("#ID").on ("eventName1.nameSpace", additionalCss, handlerFunction1);
$("#ID").on ("eventName2.nameSpace", additionalCss, handlerFunction2);
// ...
$("#ID").on ("eventNameN.nameSpace", additionalCss, handlerFunctionN);

// and to remove handlerFunction from 1 to N, just use this
$("#ID").off(".nameSpace");
Halayem Anis
fuente
0

Encontré que esto funciona como segundo argumento (función) para .hover ()

$('#yourId').hover(
    function(){
        // Your code goes here
    },
    function(){
        $(this).unbind()
    }
});

La primera función (argumento para .hover ()) es el mouseover y ejecutará su código. El segundo argumento es mouseout, que desvinculará el evento de desplazamiento de #yourId. Su código se ejecutará solo una vez.

Foppe
fuente
1
¿No $.unbind()eliminaría por sí mismo todos los eventos de ese objeto? En cuyo caso, cosas como tus $.click()eventos ahora fallarían, ¿verdad?
Alexis Wilke