Jak usunąć „hover” w jQuery?

107

Jak usunąć „hover” w jQuery?

To nie działa:

$(this).unbind('hover');
zsharp
źródło
2
Czy próbujesz usunąć powiązanie funkcji przypisanej do zdarzenia hover, czy też próbujesz zmodyfikować <a> </a> dymek?
Justin Niessner
Aby wyjaśnić pytanie Justina Niessnera, czy próbujesz usunąć zdarzenia Javascript / DOM lub deklaracje CSS? Ta ostatnia sprawa jest bardziej skomplikowana.
powiek

Odpowiedzi:

214

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

lub bardziej zwięźle (dzięki @Chad Grant ):

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

Crescent Fresh
źródło
42
lub $ (this) .unbind ('mouseenter mouseleave')
Chad Grant
czy jest to konieczna sekwencja dla mouseenter następnie po mouseleave?
sanghavi7
70

W rzeczywistości dokumentacja jQuery ma prostsze podejście niż połączone przykłady pokazane powyżej (chociaż będą działać dobrze):

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

Począwszy od jQuery 1.7, możesz również używać $.on()i $.off()do wiązania zdarzeń, więc aby rozwiązać zdarzenie najechania, możesz użyć prostszego i bardziej przejrzystego:

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

Nazwa pseudo-zdarzenia „hover” jest używana jako skrót od „mouseenter mouseleave”, ale była obsługiwana inaczej we wcześniejszych wersjach jQuery; wymagające wyraźnego usunięcia każdej z literalnych nazw zdarzeń. Użycie $.off()teraz umożliwia porzucenie obu zdarzeń myszy przy użyciu tego samego skrótu.

Edycja 2016:

Wciąż popularne pytanie, więc warto zwrócić uwagę na uwagę @ Dennis98 w komentarzach poniżej, że w jQuery 1.9+ zdarzenie „hover” zostało wycofane na rzecz standardowych wywołań „mouseenter mouseleave”. Twoja wiążąca deklaracja wydarzenia powinna teraz wyglądać następująco:

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

Phil Wheeler
źródło
4
Mam jQuery 1.10.2 i $.off("hover")nie działa. Jednak użycie obu zdarzeń działa świetnie.
Alexis Wilke,
Warto wspomnieć, że jeśli podano wiele argumentów filtrujących, wszystkie podane argumenty muszą być zgodne, aby program obsługi zdarzenia został usunięty. Zauważam również, że dokumentacja jQuery API stwierdza, że ​​metoda .off () usuwa programy obsługi zdarzeń, które zostały dołączone za pomocą .on (). Czy to oznacza, że ​​dotyczy TYLKO zdarzeń dodanych za pomocą .on (), nie jestem pewien. Ale nie powinno.
Phil Wheeler
@AlexisWilke Tak, został usunięty w wersji 1.9, sprawdź ostatni link ..;)
Dennis98
1
@ Dennis98 - Mówisz tylko o tym, że hack jQuery został przeniesiony do deprecated.js, prawda? powiązanie zdarzenia $ .off () jest nadal dostępne w nowszych wersjach jQuery.
Phil Wheeler,
Dobrze. :) $.off()nadal tam jest, jest to obecnie zalecana metoda rozpinania wydarzeń. Więc na razie musisz pisać $(element).off("mouseenter mouseleave");.
Dennis98,
10

Usuń powiązania zdarzeń mouseenteri mouseleaveindywidualnie lub odłącz wszystkie zdarzenia na elemencie (elementach).

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

lub

$(this).unbind();  // assuming you have no other handlers you want to keep
tvanfosson
źródło
4

unbind () nie działa z zakodowanymi na stałe zdarzeniami wbudowanymi.

Na przykład, jeśli chcesz odłączyć zdarzenie mouseover od <div id="some_div" onmouseover="do_something();">, stwierdziłem, że $('#some_div').attr('onmouseover','')jest to szybki i brudny sposób na osiągnięcie tego.

Jaytop
źródło
4

Innym rozwiązaniem jest .die () dla zdarzeń, które zostały dołączone za pomocą .live () .

Dawny.:

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

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

Dobre odniesienie można znaleźć tutaj: Exploring jQuery .live () i .die ()

(Przepraszam za mój angielski: ">)

Briganti
źródło
2

Wszystko, co robi najechanie za kulisami, wiąże się z właściwościami mouseover i mouseout. Chciałbym wiązać i usuwać twoje funkcje z tych zdarzeń indywidualnie.

Na przykład załóżmy, że masz następujący html:

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

wtedy twój jQuery wyglądałby tak:

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

});
Bendewey
źródło
Korekta: po spojrzeniu na jquery src hover faktycznie wiąże się z mouseenter / mouseleave. Powinieneś zrobić to samo.
bendewey
2

Możesz usunąć określoną procedurę obsługi zdarzeń, która została dołączona przy onużyciuoff

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

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

Używając tego, usuniesz tylko handlerFunction
Inną dobrą praktyką jest ustawienie nameSpace dla wielu dołączonych zdarzeń

$("#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");
Halayem Anis
źródło
0

Zauważyłem, że to działa jako drugi argument (funkcja) do .hover ()

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

Pierwsza funkcja (argument funkcji .hover ()) to mouseover i wykona Twój kod. Drugim argumentem jest mouseout, która spowoduje odłączenie zdarzenia hover od #yourId. Twój kod zostanie wykonany tylko raz.

Foppe
źródło
1
Czy $.unbind()samo w sobie nie spowoduje usunięcia wszystkich zdarzeń z tego obiektu? W takim przypadku takie rzeczy jak twoje $.click()wydarzenia teraz zawiodłyby, prawda?
Alexis Wilke,