Jak usunąć „hover” w jQuery?


107

Jak usunąć „hover” w jQuery?

To nie działa:

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

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')


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');


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

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.


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: ">)


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

});

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");

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.


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.