2009-04-30 8 views
90

Come faccio a smettere di "passare il mouse" in jQuery?Come posso smettere di "passare il mouse" in jQuery?

Questo non funziona:

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

Stai cercando di separare una funzione che è stato assegnato alla manifestazione hover, o stai cercando di modificare un hover ? –

+0

Per chiarire la domanda di Justin Niessner, stai cercando di rimuovere gli eventi Javascript/DOM o le dichiarazioni CSS? Quest'ultima è una questione più complicata. Correzione – eyelidlessness

risposta

188

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

o più brevemente (grazie @Chad Concessione) :

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

+36

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

+0

è necessaria la sequenza per mouseenter, quindi dopo il mouseleave? – sanghavi7

2

Tutti hover sta facendo dietro le quinte è vincolante per il passaggio del mouse e la proprietà mouseout. Legherei e distaccerò le tue funzioni da quegli eventi individualmente.

Per esempio, supponiamo di avere il seguente codice HTML:

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

allora il vostro jQuery sarebbe:

$(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

, dopo aver osservato il jover di jquery src, è effettivamente vincolante per mouseenter/mouseleave. Dovresti fare lo stesso. – bendewey

10

Separare gli eventi mouseenter e mouseleave singolarmente o separare tutti gli eventi sugli elementi.

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

o

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

In realtà, il jQuery documentation ha un approccio più semplice rispetto agli esempi incatenato sopra menzionato (anche se faranno funzionano bene):

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

Al jQuery 1.7, puoi utilizzare anche $.on() e $.off() per l'associazione degli eventi, quindi per dissipare l'evento di passaggio del mouse, utilizzerai il più semplice e ordinato:

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

La pseudo-evento-name "hover" is used as a shorthand per "mouseenter mouseLeave", ma è stata gestita in modo diverso nelle versioni precedenti jQuery; richiedendo di rimuovere esplicitamente ciascuno dei nomi degli eventi letterali. L'utilizzo di $.off() ora consente di eliminare entrambi gli eventi del mouse utilizzando la stessa stenografia.

Edit 2016:

Ancora una domanda popolare quindi vale la pena richiamare l'attenzione su @Dennis98 s' punto nei commenti qui sotto che in jQuery 1.9+, l'evento "hover" è stato deprecated a favore dello standard " "mouseenter mouseleave" chiama. Così la vostra dichiarazione vincolante evento dovrebbe apparire così:

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

+4

Ho jQuery 1.10.2 e '$ .off (" hover ")' non funziona. Tuttavia, utilizzare entrambi gli eventi funziona alla grande. –

+0

Vale la pena ricordare che quando vengono forniti più argomenti di filtro, tutti gli argomenti forniti devono corrispondere per la rimozione del gestore eventi. Osservo anche che i documenti API di jQuery affermano che il metodo .off() rimuove i gestori di eventi che sono stati allegati con .on(). Se questo significa che si applica SOLO agli eventi aggiunti usando .on(), non sono sicuro. Ma non dovrebbe. –

+0

@AlexisWilke Sì, è stato rimosso nella v1.9, cercare l'ultimo collegamento ..;) – Dennis98

4

unbind() non funziona con gli eventi in linea hardcoded.

Così, per esempio, se si vuole separare l'evento mouseover da <div id="some_div" onmouseover="do_something();">, ho scoperto che $('#some_div').attr('onmouseover','') è un modo rapido e sporco per realizzarla.

0

Ho trovato questo funziona come secondo argomento (funzione) a.hover()

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

La prima funzione (argomento a .hover()) è mouseover e eseguirà il codice. Il secondo argomento è il mouseout che dissiperà l'evento hover da #yourId. Il codice verrà eseguito una sola volta.

+1

Non il '$ .unbind()' di per sé come questo rimuove tutti gli eventi da quell'oggetto? In tal caso cose come i tuoi eventi '$ .click() 'ora fallirebbero, giusto? –

3

Un'altra soluzione è .die() per gli eventi che che attaccato con .Live().

Es .:

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

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

è possibile trovare un buon refference qui: Exploring jQuery .live() and .die()

(Ci dispiace per il mio inglese: ">)

1

È possibile rimuovere un gestore di eventi specifico che è stato allegato da on, utilizzando off

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

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

Usando questo, verrà rimosso solo handlerFunction
Un'altra buona pratica, è quello di impostare uno spazio dei nomi per più eventi collegati

$("#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"); 
Problemi correlati