2013-02-26 16 views
5

Ho utilizzato il seguente snippet per determinare in Chrome/Safari & FF se un utente passa con il mouse su un ancoraggio.jQuery perché: hover funziona solo una volta?

var isURL = $("a", obj).is(":hover"); 

Ho visto diversi post su: hover essere un selettore CSS, ma quello che non riesco a ottenere la mia testa intorno è il motivo per cui il codice restituisce vero se c'è 1 collegamento all'interno obj ma getta una javascript espressione non riconosciuta al passaggio del mouse al volo se ce ne sono 2 o più.

Ecco un violino di: hover di lavoro: - http://jsfiddle.net/2kyaJ/122/

Stesse ma più elementi (non funzionante): - http://jsfiddle.net/2kyaJ/121/

Qualcuno può spiegare questo a me?

Tra l'altro ho visto questo ... How do I check if the mouse is over an element in jQuery?

4 anni sul è questo ancora il migliore e apparentemente solo modo per determinare se un utente è in bilico sopra un elemento? Se sì qualcuno sarebbe in grado di fornire un esempio?

Modifica: ha dovuto andare a pescare esattamente ciò di cui avevo bisogno, ma si scopre che, per quanto semplice sia, funziona davvero bene.

Attualmente lo sto usando all'interno di un plugin con jQuery 1.9.1 dove sto attivando un'animazione su un mouseover di un elemento genitore (obj). Spero che qualcun altro lo trovi utile in futuro. Usa .length invece di .size come .size è deprecato dalla versione 1.8 in poi.

 function isMouseOver() { 
      if ($('a:hover', obj).length != 0) { 
       return true; 
      } else { 
       return false; 
      }       
     } 

Usage:

var isURL = isMouseOver(); 
+0

Perché per la logica di lavorare, * tutti * '.sample' elementi dovrebbero essere attestata allo stesso tempo. È necessario verificare quale elemento (se presente) è sospeso individualmente per ottenere ciò che si desidera qui. – BenM

+1

@BenM, se è vero, quindi [la documentazione] (http://api.jquery.com/is/) è errata: "Controlla il set di elementi corrente abbinato a un selettore, elemento o oggetto jQuery e ritorna' true' if ** almeno un ** di questi elementi corrisponde agli argomenti specificati. " – redbmk

+0

Bene, controlla la tua console. Sizzle non supporta 'hover' per oggetti jQuery contenenti più di un elemento:' Errore non rilevato: errore di sintassi, espressione non riconosciuta: hover'. – BenM

risposta

5

:hover non è documentato a http://api.jquery.com/ - come tale non mi fiderei che funzioni in un modo particolare. Il problema sembra essere che Sizzle si stia confondendo con questo pseudo-selettore quando c'è più di un elemento da scorrere nella raccolta, anche se non posso davvero dire whey guardando il codice.

Il fatto che è anche lavorando nel primo esempio sembra essere un bug: http://jsfiddle.net/2kyaJ/122/ - non funziona con jQuery 1.9

Quanto a come capire se un elemento è aleggiava - Sono non sono sicuro di quali circostanze avresti bisogno di farlo. Invece, è meglio agire quando viene attivato un hover. È possibile eseguire il binding a un evento "simile al passaggio del mouse" con mouseover e mouseenter. C'è, naturalmente, lo pseudo-selettore CSS :hover.

+0

Sto scrivendo un plugin che quando si passa il mouse su un elemento scorre verso sinistra per rivelare ciò che è nascosto a destra, al passaggio del mouse torna alla posizione originale, se l'utente passa con il mouse su un collegamento che non voglio per attivare l'animazione, ma sto già usando setTimeout per attendere 250 ms al passaggio del mouse e 1.5 secondi al passaggio del mouse. – KryptoniteDove

3

Prova questo violino http://jsfiddle.net/2rU4U/:

setInterval(function(){ 
    var $sample = $(".sample"); 

    $sample.each(function(index) { 
     if($(this).is(":hover")) { 
      $(this).css("background", "yellow"); 
     } 
     else { 
      $(this).css("background", ""); 
     } 
    }); 
}, 200); 

Come accennato nel commento di cui sopra, questo rispetta il fatto che un insieme di elementi potrebbe essere restituito, e non solo uno solo. Potrebbe causare un po 'di sovraccarico con un sacco di elementi, naturalmente ...!

+0

Grazie, stavo usando il violino come un'illustrazione del comportamento davvero. Sembra che alla prima parte della domanda sia stato risposto "pseudo non supportato", ma qualcuno conosce il modo migliore per determinare se sto passando il mouse sopra un elemento? o è il precedente con il mouseover a fadeout ancora la strada da percorrere? – KryptoniteDove

-2

Onestamente, l'impostazione di un intervallo è una pessima idea ...

Basta impostare un ascoltatore hover.

$('.sample').hover(function() { 
    console.log($this) // $(this) is the currently hovered element 
}) 

JSFiddle: http://jsfiddle.net/jeffshaver/2kyaJ/124/

+0

Questo non risponde alla domanda cambia tutti gli elementi con la classe di .sample a giallo. Voglio determinare su quale elemento si sta librando. Il violino è solo un esempio di comportamento. – KryptoniteDove

+0

Bene, se stai cercando di capire quale ".sample" è stazionario, allora fai qualcosa con $ (this) all'interno del listener hover ... Funziona ancora ... ie $ ('. Sample') .hover (function() { console.log ($ (this)); }); restituisce l'elemento html che era al passaggio del mouse –

+0

http://jsfiddle.net/jeffshaver/2kyaJ/124/ –

1

Per quanto riguarda il motivo per cui non funziona il vostro senso, direi che potrebbe essere un bug o potrebbe essere che è senza documenti. Non lo so davvero.

Tuttavia, ecco un esempio che funziona in jQuery 1.7.1, 1.9, e 2.0.0b1: http://jsfiddle.net/2kyaJ/125/

In sostanza, invece di utilizzare .is() è possibile interrogare per tutti gli elementi aleggiava e quindi controllare che non vi sia almeno una partita ($(".sample:hover").length anziché $(".sample").is(":hover")).

Ho avuto l'impressione che volessi evidenziare tutti gli elementi .sample quando uno di essi è al passaggio del mouse, quindi il primo jsfiddle. Tuttavia, se si desidera solo per evidenziare l'elemento è passato il mouse, si potrebbe provare qualcosa di simile: http://jsfiddle.net/2kyaJ/126/

Inoltre, se si sta semplicemente cercando di legare qualcosa per l'evento hover, piuttosto che il controllo più o meno ogni 0,2 secondi si potrebbe utilizzare la funzione .hover(): http://jsfiddle.net/2kyaJ/127/

Problemi correlati