2009-04-30 28 views
90

¿Cómo desactivo "hover" en jQuery?¿Cómo desactivo "hover" en jQuery?

Esto no funciona:

$(this).unbind('hover'); 
+2

¿Estás tratando de desatar una función que ha asignado al caso estacionario, o ¿Estás intentando modificar un vuelo estacionario ? –

+0

Para aclarar la pregunta de Justin Niessner, ¿estás tratando de eliminar los eventos Javascript/DOM o las declaraciones CSS? Este último es un asunto más complicado. – eyelidlessness

Respuesta

188

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

o más sucintamente (gracias @Chad subvención) :

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

+36

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

+0

¿es necesario secuenciar para mouseenter luego de mouseleave? – sanghavi7

2

Todos vuelo estacionario está haciendo detrás de las escenas es vinculante al pasar el ratón y la propiedad mouseout. Me gustaría vincular y desvincular tus funciones de esos eventos de forma individual.

Por ejemplo, supongamos que tiene el código HTML siguiente:

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

luego sería su jQuery:

$(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); 
    }); 

}); 
+0

Corrección, después de mirar el jquery src, el hover se vincula realmente al mouseenter/mouseleave. Deberías hacer lo mismo. – bendewey

10

Desvincular los eventos mouseenter y mouseleave individualmente o desvincular todos los eventos en los elemento (s).

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

o

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

En realidad, el jQuery documentation tiene un enfoque más simple que los ejemplos mostrados anteriormente encadenados (a pesar de que va a trabajar muy 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, debería usar el más simple y ordenado:

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

El pseudo-evento-name "libración" is used as a shorthand para "MouseEnter mouseleave" pero fue manejado de manera diferente en las versiones anteriores jQuery; requiriendo que elimines expresamente cada uno de los nombres de eventos literales. El uso de $.off() ahora le permite soltar ambos eventos del mouse con la misma abreviatura.

Edición 2016:

siendo una cuestión popular por lo que vale la pena llamar la atención sobre @Dennis98 's punto en los comentarios que en jQuery 1.9+, el evento 'estacionario' era deprecated a favor de la norma " mouseenter mouseleave "llamadas. Por lo que su declaración vinculante en caso ahora debería tener este aspecto:

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

+4

Tengo jQuery 1.10.2 y '$ .off (" hover ")' no funciona. Sin embargo, usar ambos eventos funciona muy bien. –

+0

Vale la pena mencionar que cuando se proporcionan varios argumentos de filtrado, todos los argumentos proporcionados deben coincidir para que se elimine el controlador de eventos. También observo que los documentos API de jQuery indican que el método .off() elimina los controladores de eventos que se adjuntaron con .on(). Si eso significa que ÚNICAMENTE se aplica a eventos agregados usando .on(), no estoy seguro. Pero no debería. –

+0

@AlexisWilke Sí, se eliminó en v1.9, busca el último enlace ...;) – Dennis98

4

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

Así, por ejemplo, si desea desenlazar el evento mouseover de <div id="some_div" onmouseover="do_something();">, he encontrado que $('#some_div').attr('onmouseover','') es una manera rápida y sucia para lograrlo.

0

Encontré que esto funciona como el segundo argumento (función) para.vuelo estacionario()

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

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

+1

¿El '$ .unbind()' por sí mismo así no eliminaría todos los eventos de ese objeto? En cuyo caso cosas como tus eventos '$ .click()' ahora fallarían, ¿no? –

3

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

Ej .:

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

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

se puede encontrar una buena refference aquí: Exploring jQuery .live() and .die()

(Lo siento por mi Inglés: ">)

1

puede quitar un controlador de eventos específicos que fue adjuntado por on, usando off

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

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

El uso de este, se quitará solamente handlerFunction
Otra buena práctica, es la creación de un espacio de nombres para varios 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");