2011-11-16 20 views
9

Ho una barra dei menu che visualizza una serie di categorie in una riga superiore.jQuery - unbind o rebind hoverIntent()?

Una delle categorie ha un insieme di sottocategorie.

Ho una configurazione hoverIntent in modo che faccia scorrereDown sul sottomenu e slideUp quando il mouse lascia.

Tuttavia, se sto visualizzando una pagina in questa categoria, desidero che il sottomenu sia visibile con la categoria attiva evidenziata. Mi piacerebbe anche assicurarmi che quando il sottomenu è interagito con il mouse, non scorre di nuovo una volta che il mouse è partito.

Ho provato a ripetere la funzione hoverIntent sull'elemento in questa pagina ma non funziona, sta ancora utilizzando il bind precedente. C'è un modo per dissipare il precedente hoverIntent e assicurarsi che usi quello nuovo?

+0

puoi provare ad avere due classi, e associare un evento a ciascuno di essi. Quindi dovrai solo aggiungere/rimuovere la classe giusta sugli elementi interessati. – Jerome

risposta

19

di legare e non associare il hoverIntent si dovrebbe fare:

// bind the hoverIntent 
$("#demo1 li").hoverIntent(makeTall, makeShort) 
// unbind the hoverIntent 
$("#demo1 li").unbind("mouseenter").unbind("mouseleave"); 
$("#demo1 li").removeProp('hoverIntent_t'); 
$("#demo1 li").removeProp('hoverIntent_s'); 
// rebind the hoverIntent 
$("#demo1 li").hoverIntent(makeTall, makeShort) 
+0

Perfetto, grazie! – waffl

+0

Grazie amico! Lo stavo cercando, solo una domanda. Cosa fa removeProp "hoverIntent_t"? –

1

Da docs jQuery: "Nel caso più semplice, senza argomenti, .unbind() rimuove tutti i gestori associati agli elementi"

10

Penso che questa sia una risposta più completa. Effettua quanto segue:

  • Qualsiasi timer attivo viene ripulito.
  • Tutti gli eventi vengono cancellati
  • Tutte le proprietà degli oggetti vengono cancellati
  • utilizza la sintassi comune jQuery e si presenta come parte nativo di hoverIntent

Codice:

(function($) { 
    if (typeof $.fn.hoverIntent === 'undefined') 
    return; 

    var rawIntent = $.fn.hoverIntent; 

    $.fn.hoverIntent = function(handlerIn,handlerOut,selector) 
    { 
     // If called with empty parameter list, disable hoverintent. 
     if (typeof handlerIn === 'undefined') 
     { 
     // Destroy the time if it is present. 
     if (typeof this.hoverIntent_t !== 'undefined') 
     { 
      this.hoverIntent_t = clearTimeout(this.hoverIntent_t); 
     } 
     // Cleanup all hoverIntent properties on the object. 
     delete this.hoverIntent_t; 
     delete this.hoverIntent_s; 

     // Unbind all of the hoverIntent event handlers. 
     this.off('mousemove.hoverIntent,mouseenter.hoverIntent,mouseleave.hoverIntent'); 

     return this; 
     } 

     return rawIntent.apply(this, arguments); 
    }; 
})(jQuery); 
+1

Ho dovuto racchiudere il contenuto della funzione in una chiamata 'this.each' per poterlo chiamare sulle raccolte: https://gist.github.com/raulferras/10458877 –

+0

Ben fatto. Ho avviato una richiesta di github per ottenere un metodo unbind/destroy aggiunto al codice sorgente, in quanto questo sembra essere coerente con un buon comportamento del plugin: https://github.com/briancherne/jquery-hoverIntent/issues/43 – tohster

0

ho usato:

var elements = $("#main_nav li, #breadcrumb_ul li"); 
elements.unbind('mouseover mouseout'); 
delete $(elements).hoverIntent_t; 
delete $(elements).hoverIntent_s; 
Problemi correlati