2011-11-16 11 views
9

Mam pasek menu, który wyświetla zestaw kategorii w górnym wierszu.jQuery - unbind lub rebind hoverIntent()?

Jedna z kategorii ma zestaw podkategorii.

Mam ustawienie hoverIntent, które będzie się wysuwaćWykonaj podmenu i przesuń mysz po opuszczeniu myszy.

Jednak jeśli przeglądam stronę w tej kategorii, chciałbym aby podmenu było widoczne z podświetloną aktywną kategorią. Chciałbym również upewnić się, że kiedy podmenu jest połączone z myszą, nie przesuwa się ponownie po wyjściu myszy.

Próbowałem ponownie napisać funkcję hoverIntent na elemencie na tej stronie, ale to nie działa, nadal używa poprzedniego wiązania. Czy istnieje sposób na odwiązanie poprzedniego hoverIntent i upewnienie się, że używa nowego?

+0

możesz spróbować mieć dwie klasy, i wiążą jedno wydarzenie z każdym z nich. Następnie musisz po prostu dodać/usunąć odpowiednią klasę dla danych elementów. – Jerome

Odpowiedz

19

związać i rozwiązać hoverIntent należy zrobić:

// 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

Idealne, dziękuję! – waffl

+0

Dzięki człowieku! Szukałem tego, tylko pytanie. Co robi removeProp "hoverIntent_t"? –

1

Od docs jQuery: "W najprostszym przypadku, bez argumentów, .unbind() usuwa wszystkie programy obsługi dołączone do elementów"

10

Myślę, że jest to bardziej kompletna odpowiedź. Wykonuje następujące czynności:

  • Każdy aktywny zegar jest czyszczony.
  • Wszystkie zdarzenia są usuwane
  • Wszystkie właściwości obiektów są rozliczone
  • Wykorzystuje wspólnej składni jQuery i wygląda rodzimej części hoverIntent

Kod:

(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

Musiałem zawinąć zawartość tej funkcji w wywołanie 'this.each', aby móc wywołać ją w kolekcjach: https://gist.github.com/raulferras/10458877 –

+0

Ładnie wykonane. Założyłem żądanie github, aby dodać metodę unbind/destroy do kodu źródłowego, ponieważ wydaje się, że jest to zgodne z dobrym zachowaniem wtyczki: https://github.com/briancherne/jquery-hoverIntent/issues/43 – tohster

0

użyłem:

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