Czy można używać jQuery .on i hover?

331

Mam plik, <ul>który jest zapełniany javascript po początkowym załadowaniu strony. Obecnie używam .bindz mouseoveri mouseout.

Projekt właśnie zaktualizował się do jQuery 1.7, więc mam opcję korzystania .on, ale wydaje się, że nie mogę go uruchomić hover. Czy można używać .onz hover?

EDYCJA : Elementy, z którymi się wiążę, są ładowane javascript po załadowaniu dokumentu. Dlatego używam oni nie tylko hover.

Ryre
źródło
3
Z poniższego komentarza - obsługa zdarzenia hover w On () została wycofana w jQuery 1.8 i usunięta w jQuery 1.9 . Spróbuj z kombinacją mouseenteri mouseleave, zgodnie z sugestią calebthebrewer.
SexyBeast

Odpowiedzi:

677

( Spójrz na ostatnią edycję w tej odpowiedzi, jeśli chcesz używać .on()z elementami wypełnionymi JavaScript )

Użyj tego dla elementów, które nie są wypełniane za pomocą JavaScript:

$(".selector").on("mouseover", function () {
    //stuff to do on mouseover
});

.hover()ma własny moduł obsługi: http://api.jquery.com/hover/

Jeśli chcesz zrobić wiele rzeczy, połącz je w .on()module obsługi w następujący sposób:

$(".selector").on({
    mouseenter: function () {
        //stuff to do on mouse enter
    },
    mouseleave: function () {
        //stuff to do on mouse leave
    }
});

Zgodnie z odpowiedziami podanymi poniżej możesz używać hoverz.on() , ale:

Chociaż zdecydowanie zniechęcony jest nowy kod, możesz zobaczyć pseudo-zdarzenie „hover” używane jako skrót dla ciągu „mouseenter mouseleave”. Dołącza jeden moduł obsługi zdarzeń dla tych dwóch zdarzeń, a moduł obsługi musi sprawdzić event.type, aby ustalić, czy zdarzenie to jest centrum myszy, czy pozostawienie myszy. Nie należy mylić nazwy pseudo-zdarzenia „hover” z metodą .hover (), która akceptuje jedną lub dwie funkcje.

Ponadto nie ma żadnych korzyści związanych z wydajnością korzystania z niego i jest bardziej nieporęczny niż zwykłe używanie mouseenter lub mouseleave. Podana przeze mnie odpowiedź wymaga mniej kodu i jest właściwym sposobem na osiągnięcie czegoś takiego.

EDYTOWAĆ

Minęło trochę czasu, odkąd udzielono odpowiedzi na to pytanie i wydaje się, że zyskało ono trochę trakcji. Powyższy kod nadal obowiązuje, ale chciałem dodać coś do mojej oryginalnej odpowiedzi.

Chociaż wolę używać mouseenteri mouseleave(pomaga mi zrozumieć, co się dzieje w kodzie) z .on()nim, to tak samo jak pisanie poniższegohover()

$(".selector").hover(function () {
    //stuff to do on mouse enter
}, 
function () {
    //stuff to do on mouse leave
});

Ponieważ oryginalne pytanie nie zapytać jak mogli prawidłowo korzystać on()z hover(), myślałem, że chciałbym poprawić wykorzystanie on()i nie uważają, że konieczne jest dodanie hover()kodu w czasie.

EDYCJA 11 GRUDNIA 2012

Niektóre nowe odpowiedzi podane poniżej szczegółowo opisują, jak .on()powinno działać, jeśli divpytanie jest wypełniane za pomocą JavaScript. Załóżmy na przykład, że wypełniasz zdarzenie divjQuery za pomocą .load():

(function ($) {
    //append div to document body
    $('<div class="selector">Test</div>').appendTo(document.body);
}(jQuery));

Powyższy kod .on()nie będzie obowiązywał. Zamiast tego powinieneś nieco zmodyfikować kod, tak jak poniżej:

$(document).on({
    mouseenter: function () {
        //stuff to do on mouse enter
    },
    mouseleave: function () {
        //stuff to do on mouse leave
    }
}, ".selector"); //pass the element as an argument to .on

Ten kod będzie działał dla elementu wypełnionego JavaScript po .load()zdarzeniu. Po prostu zmień argument na odpowiedni selektor.

Sethen
źródło
1
@Scott, proszę zauważyć, że odpowiedź JonMcIntosha nie odpowiada na moje pytanie, ponieważ używa on tylko połowy funkcji aktywowania.
Ryre
1
Nie działa to w przypadku elementów dodanych do DOM. Jak @Nik Chankov wskazuje poniżej, tutaj jest prawidłowe użycie .on () do dołączania wielu
programów
1
@ soupy1976 Edytowałem moją odpowiedź, teraz uwzględnia ona elementy wypełnione JavaScript.
Sethen,
1
@SethenMaleno - dokładnie, a twoje .on()rozwiązanie działa albo usuwając zdarzenie pseudo najechania i używając prawdziwych. Podoba mi się pierwszy, który zilustrowałeś za pomocą mouseenter / mouseleave +1
Mark Schultheiss
1
Ta edycja zmieniła mój głos z głosowania w dół na głos w górę, dobrze zagrany, Sethen, dobrze zagrany!
Sean Kendle,
86

Żadne z tych rozwiązań nie działało dla mnie, gdy najechanie myszą na obiekty utworzone po załadowaniu dokumentu w odpowiedzi na pytanie. Wiem, że to pytanie jest stare, ale mam rozwiązanie dla tych, którzy wciąż szukają:

$("#container").on('mouseenter', '.selector', function() {
    //do something
});
$("#container").on('mouseleave', '.selector', function() {
    //do something
});

Spowoduje to powiązanie funkcji z selektorem, dzięki czemu obiekty z tym selektorem wykonane po przygotowaniu dokumentu będą mogły nadal go wywoływać.

cazzer
źródło
5
Ten ma właściwe rozwiązanie: stackoverflow.com/questions/8608145/…
Nik Chankov
Tak też to działało. Znalazłem akceptowaną odpowiedź, stawiając selektor przed .on nie działał po zdarzeniu .load (), ale tak się dzieje.
MattP,
@calebthebrewer Edytowałem moją odpowiedź, teraz uwzględnia ona elementy wypełnione JavaScript.
Sethen,
5
Użycie mouseoveri mouseoutzdarzenia w tym miejscu powodują ciągłe uruchamianie kodu, gdy użytkownik porusza myszą wewnątrz elementu. Myślę mouseenteri mouseleavesą bardziej odpowiednie, ponieważ wystrzelą tylko raz przy wejściu.
johntrepreneur
1
używanie dokumentu jako elementu głównego nie jest najlepszą praktyką, ponieważ jego wydajność jest bardzo niska. monitorujesz dokument, podczas gdy za pomocą load () przeważnie manipulujesz tylko częścią strony internetowej (np. #content). więc lepiej jest zawęzić go do elementu, który jest zmanipulowany ..
honk31 24.09.2013
20

Nie jestem pewien, jak wygląda reszta twojego Javascript, więc nie będę w stanie stwierdzić, czy występują jakieś zakłócenia. Ale .hover()działa dobrze jako wydarzenie .on().

$("#foo").on("hover", function() {
  // disco
});

Jeśli chcesz móc wykorzystać jego zdarzenia, użyj zwróconego obiektu ze zdarzenia:

$("#foo").on("hover", function(e) {
  if(e.type == "mouseenter") {
    console.log("over");
  }
  else if (e.type == "mouseleave") {
    console.log("out");
  }
});

http://jsfiddle.net/hmUPP/2/

Jon McIntosh
źródło
Jak to obsługuje osobne funkcje włączania / wyłączania używane przez aktywowanie? Np .: $('#id').hover(function(){ //on }, function(){ //off});
Ryre,
Dla mnie nie jest to konieczne .. Nie trzeba korzystać .on()z hoverkiedy można tak łatwo pozbyć .on()i zastąpić go z .hover()funkcji i uzyskać takie same wyniki. Czy jQuery nie pisze mniej kodu?
Sethen
@Toast nie, zobacz moją odpowiedź poniżej, aby zobaczyć, jak wykonać mouseenteri jak mouseleavedziała.on()
Sethen
Zaktualizowałem swoją odpowiedź, aby uwzględnić wykorzystanie obu typów zdarzeń. Działa to tak samo jak odpowiedź Sethena, ale ma inny smak.
Jon McIntosh
24
hoverobsługa zdarzeń w On()została wycofana w jQuery 1.8 i usunięta w jQuery 1.9.
Gone Coding
9

Funkcja hover jQuery daje funkcję najechania myszką i myszy.

$ (selektor) .hover (inFunction, outFunction);

$(".item-image").hover(function () {
    // mouseover event codes...
}, function () {
    // mouseout event codes...
});

Źródło: http://www.w3schools.com/jquery/event_hover.asp

Tigin
źródło
3
zdecydowanie działa. masz głos negatywny, ponieważ niektórzy ludzie są wyrzuceni! Dzięki kolego
Kareem,
8

Po prostu surfowałem po Internecie i czułem, że mogę coś wnieść. Zauważyłem, że powyższy kod opublikowany przez @calethebrewer może powodować wiele wywołań selektora i nieoczekiwane zachowanie, na przykład:

$(document).on('mouseover', '.selector', function() {
   //do something
});
$(document).on('mouseout', '.selector', function() {
   //do something
});

To skrzypce http://jsfiddle.net/TWskH/12/ ilustruje mój punkt widzenia. Podczas animowania elementów, takich jak wtyczki, zauważyłem, że te wielokrotne wyzwalacze powodują niezamierzone zachowanie, które może spowodować wywołanie animacji lub kodu więcej niż jest to konieczne.

Moją sugestią jest po prostu zastąpienie mouseenter / mouseleave: -

$(document).on('mouseenter', '.selector', function() {
   //do something
});
$(document).on('mouseleave', '.selector', function() {
   //do something
});

Chociaż zapobiegło to wywołaniu wielu wystąpień mojej animacji, ostatecznie zdecydowałem się na najechanie kursorem myszy / pozostawienie myszy, ponieważ musiałem ustalić, kiedy dzieci rodzica były najechane.

KryptoniteDove
źródło
Ta odpowiedź faktycznie stanowi działające rozwiązanie dodawania zdarzenia aktywowania dla selektora dokumentów. +1
Rich Davis,
5

Można skorzystać .on()z hoverrobiąc to, co mówi Dodatkowa sekcja Uwagi:

Chociaż zdecydowanie zniechęcony jest nowy kod, możesz zobaczyć pseudo-zdarzenie „hover” używane jako skrót dla ciągu „mouseenter mouseleave”. Dołącza jeden moduł obsługi zdarzeń dla tych dwóch zdarzeń, a moduł obsługi musi sprawdzić event.type, aby ustalić, czy zdarzenie to jest centrum myszy, czy pozostawienie myszy. Nie należy mylić nazwy pseudo-zdarzenia „hover” z metodą .hover (), która akceptuje jedną lub dwie funkcje.

Byłoby to wykonać następujące czynności:

$("#foo").on("hover", function(e) {

    if (e.type === "mouseenter") { console.log("enter"); }
    else if (e.type === "mouseleave") { console.log("leave"); }

});

EDYCJA (uwaga dla użytkowników jQuery 1.8+):

Przestarzałe w jQuery 1.8, usunięte w 1.9: Nazwa „hover” używana jako skrót dla ciągu „mouseenteraveleave”. Dołącza jeden moduł obsługi zdarzeń dla tych dwóch zdarzeń, a moduł obsługi musi zbadać event.type w celu ustalenia, czy zdarzenie jest centrum myszy czy pozostawieniem myszy. Nie należy mylić nazwy pseudo-zdarzenia „hover” z metodą .hover (), która akceptuje jedną lub dwie funkcje.

Code Maverick
źródło
1
Jest to po prostu więcej pracy, gdy można to łatwo zrobić za pomocą mouseenteri mouseleave... Wiem, to nie odpowiada na pierwotne pytanie OP, ale nadal używanie hoverw ten sposób nie jest mądre.
Sethen
Zrób to w ten sposób, dokładnie tak, jak sugeruje zespół jQuery zgodnie z pytaniem PO. Jednak, jak sugeruje zespół jQuery, zdecydowanie nie zaleca się nowego kodu. Ale nadal jest to poprawna odpowiedź na pytanie PO.
Kod Maverick
1
@Scott - byłeś szybszy ode mnie :-). @Sethen - oba sposoby będą działać, ale pytający poprosił o tę funkcję .hover().
Jon McIntosh
Zrozumiałe więc, ale myślę, że OP szukał rozwiązania dla mouseenteri mouseleavezamiast po prostu czyni go pracować hover. Jeśli nie ma żadnego rzeczywistego powodu do używania hoverz powodów związanych z wydajnością, dlaczego warto go używać, gdy jest wysoce zniechęcany do nowego kodu?
Sethen
5
hoverobsługa zdarzeń w On()została wycofana w jQuery 1.8 i usunięta w jQuery 1.9.
Gone Coding
5
$("#MyTableData").on({

 mouseenter: function(){

    //stuff to do on mouse enter
    $(this).css({'color':'red'});

},
mouseleave: function () {
    //stuff to do on mouse leave
    $(this).css({'color':'blue'});

}},'tr');
webmaster01
źródło
2

Możesz podać jeden lub wiele typów zdarzeń oddzielonych spacją.

Więc hoverrówna sięmouseenter mouseleave .

Oto moja sugestia:

$("#foo").on("mouseenter mouseleave", function() {
    // do some stuff
});
użytkownik2386291
źródło
Podoba mi się decyzja jQ o amortyzacji tego parametru. Wcześniejsza wersja 1.8, używanie hovera jako przestrzeni nazw nie pokrywało się ze zdarzeniem DOM, hover, brak relacji.
Jim22150
1

Jeśli potrzebujesz tego jako warunku na innym wydarzeniu, rozwiązałem to w ten sposób:

$('.classname').hover(
     function(){$(this).data('hover',true);},
     function(){$(this).data('hover',false);}
);

Następnie w innym wydarzeniu możesz go łatwo użyć:

 if ($(this).data('hover')){
      //...
 }

(Widzę, że niektórzy używają is(':hover')do rozwiązania tego. Ale to nie jest (jeszcze) prawidłowy selektor jQuery i nie działa we wszystkich zgodnych przeglądarkach)

Sanne
źródło
-2

Wtyczka jQuery hoverIntent http://cherne.net/brian/resources/jquery.hoverIntent.html wykracza daleko poza naiwne podejścia wymienione tutaj. Chociaż z pewnością działają, niekoniecznie zachowują się tak, jak oczekują użytkownicy.

Najsilniejszym powodem użycia hoverIntent jest limit czasu funkcja . Umożliwia wykonywanie takich czynności, jak zapobieganie zamykaniu menu, ponieważ użytkownik przeciąga myszą nieco za daleko w prawo lub w lewo, zanim kliknie żądany element. Zapewnia również możliwości nie aktywowania zdarzeń zawisu w zaporze i czeka na skoncentrowane zawisanie.

Przykład użycia:

var config = {    
 sensitivity: 3, // number = sensitivity threshold (must be 1 or higher)    
 interval: 200, // number = milliseconds for onMouseOver polling interval    
 over: makeTall, // function = onMouseOver callback (REQUIRED)    
 timeout: 500, // number = milliseconds delay before onMouseOut    
 out: makeShort // function = onMouseOut callback (REQUIRED)
};
$("#demo3 li").hoverIntent( config )

Dalsze wyjaśnienie tego można znaleźć na https://stackoverflow.com/a/1089381/37055

Chris Marisic
źródło