Ist es möglich, jQuery .on und Hover zu verwenden?


330

Ich habe eine <ul>, die nach dem ersten Laden der Seite mit Javascript gefüllt ist. Ich benutze derzeit .bindmit mouseoverund mouseout.

Das Projekt wurde gerade auf jQuery 1.7 aktualisiert, sodass ich die Option verwenden kann .on, aber ich kann es anscheinend nicht zum Laufen bringen hover. Ist es möglich , die Verwendung .onmit hover?

BEARBEITEN : Die Elemente, an die ich binde, werden nach dem Laden des Dokuments mit Javascript geladen. Deshalb benutze ich onund nicht nur hover.


3
Aus einem Kommentar unten - Die Unterstützung für Schwebeflugereignisse in On () wurde in jQuery 1.8 nicht mehr unterstützt und in jQuery 1.9 entfernt . Versuchen Sie es mit einer Kombination von mouseenterund mouseleave, wie von calebthebrewer vorgeschlagen.
SexyBeast

Antworten:


676

( Sehen Sie sich die letzte Änderung in dieser Antwort an, wenn Sie .on()Elemente verwenden müssen, die mit JavaScript gefüllt sind. )

Verwenden Sie dies für Elemente, die nicht mit JavaScript gefüllt sind:

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

.hover()hat einen eigenen Handler: http://api.jquery.com/hover/

Wenn Sie mehrere Dinge tun möchten, verketten Sie sie .on()wie folgt im Handler:

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

Entsprechend den unten angegebenen Antworten können Sie hovermit verwenden .on(), aber:

Obwohl von neuem Code dringend abgeraten wird, wird möglicherweise der Pseudoereignisname "hover" als Abkürzung für die Zeichenfolge "mouseenter mouseleave" verwendet. Es wird ein einzelner Ereignishandler für diese beiden Ereignisse angehängt, und der Handler muss event.type untersuchen, um festzustellen, ob das Ereignis mouseenter oder mouseleave ist. Verwechseln Sie den Pseudoereignisnamen "hover" nicht mit der Methode .hover (), die eine oder zwei Funktionen akzeptiert.

Es gibt auch keine Leistungsvorteile bei der Verwendung und es ist sperriger als nur die Verwendung von mouseenteroder mouseleave. Die Antwort, die ich gegeben habe, erfordert weniger Code und ist der richtige Weg, um so etwas zu erreichen.

BEARBEITEN

Es ist schon eine Weile her, dass diese Frage beantwortet wurde und sie scheint etwas an Zugkraft gewonnen zu haben. Der obige Code steht noch, aber ich wollte meiner ursprünglichen Antwort etwas hinzufügen.

Während ich es vorziehe, mouseenterund mouseleave(hilft mir zu verstehen, was im Code vor sich geht) zu verwenden .on(), ist es genauso, wie das Folgende mit zu schreibenhover()

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

Da die ursprüngliche Frage war , wie sie richtig nutzen könnten on()mit hover(), dachte ich , ich würde die Nutzung korrigieren on()und fand es nicht notwendig , den hinzufügen hover()Code zu der Zeit.

EDIT 11. DEZEMBER 2012

Im Folgenden finden Sie einige neue Antworten, die erläutern, wie funktionieren .on()soll, wenn die divbetreffende Antwort mit JavaScript ausgefüllt wird. Angenommen, Sie divfüllen ein .load()Ereignis mit jQuery wie folgt aus:

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

Der obige Code für .on()würde nicht stehen. Stattdessen sollten Sie Ihren Code wie folgt leicht ändern:

$(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

Dieser Code funktioniert für ein Element, das nach einem .load()Ereignis mit JavaScript gefüllt ist. Ändern Sie einfach Ihr Argument in den entsprechenden Selektor.


1
@Scott, bitte beachten Sie, dass JonMcIntoshs Antwort meine Frage nicht beantwortet, da er nur die Hälfte der Hover-Funktionalität verwendet.
Ryre

1
Dies funktioniert nicht für Elemente, die dem DOM hinzugefügt wurden. Wie @Nik Chankov unten weist darauf hin, hier ist die korrekte Verwendung von .on () für mehrere Handler Befestigung stackoverflow.com/questions/8608145/...
soupy1976

1
@oupy1976 Meine Antwort wurde bearbeitet und berücksichtigt jetzt Elemente, die mit JavaScript gefüllt sind.
Sethen

1
@SethenMaleno - genau, und Ihre .on()Lösung funktioniert entweder mit dem Entfernen des Pseudo-Hover-Ereignisses oder mit den realen. Ich mag die erste, die Sie mit mouseenter / mouseleave +1 dafür illustriert haben
Mark Schultheiss

1
Diese Änderung änderte meine Stimme von einer Abwärtsabstimmung zu einer Aufwärtsabstimmung, gut gespielt, Sethen, gut gespielt!
Sean Kendle

86

Keine dieser Lösungen hat bei mir funktioniert, wenn Sie mit der Maus über Objekte gefahren sind, die erstellt wurden, nachdem das Dokument geladen wurde, wie es die Frage erfordert. Ich weiß, dass diese Frage alt ist, aber ich habe eine Lösung für diejenigen, die noch suchen:

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

Dadurch werden die Funktionen an den Selektor gebunden, sodass Objekte, die mit diesem Selektor erstellt wurden, nachdem das Dokument fertig ist, es weiterhin aufrufen können.


5
Dieser hat die richtige Lösung: stackoverflow.com/questions/8608145/…
Nik Chankov

So habe ich es auch zum Laufen gebracht. Ich habe die akzeptierte Antwort gefunden, indem ich den Selektor vor das .on gestellt habe, das nach einem .load () -Ereignis nicht funktioniert hat, aber das tut es.
MattP

@calebthebrewer Meine Antwort wurde bearbeitet und berücksichtigt jetzt Elemente, die mit JavaScript gefüllt sind.
Sethen

5
Wenn Sie mouseoverund mouseoutEreignisse hier verwenden, wird der Code kontinuierlich ausgelöst, wenn der Benutzer die Maus innerhalb des Elements bewegt. Ich denke mouseenterund bin mouseleaveangemessener, da es nur einmal beim Eintritt feuert.
johntrepreneur

1
Die Verwendung von document als Root-Element ist keine bewährte Methode, da die Leistung hungrig ist. Sie überwachen das Dokument, während Sie mit load () die meiste Zeit nur einen Teil der Website bearbeiten (z. B. #content). es ist also besser zu versuchen, es auf das manipulierte Element zu beschränken.
honk31

20

Ich bin mir nicht sicher, wie der Rest Ihres Javascript aussieht, daher kann ich nicht feststellen, ob es Störungen gibt. Funktioniert aber .hover()gut als Event mit .on().

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

Wenn Sie seine Ereignisse nutzen möchten, verwenden Sie das vom Ereignis zurückgegebene Objekt:

$("#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/


Wie behandelt dies die separaten Funktionen für Ein / Aus, die der Hover verwendet? Beispiel: $('#id').hover(function(){ //on }, function(){ //off});
Ryre

Für mich ist dies nicht notwendig ist .. Sie müssen nicht verwenden müssen .on()mit , hoverwenn Sie können genauso einfach loswerden .on()und ersetzen Sie es mit der .hover()Funktion und erhalten die gleichen Ergebnisse. Geht es bei jQuery nicht darum, weniger Code zu schreiben?
Sethen

@ Toast es nicht, siehe meine Antwort unten, um zu sehen, wie man mitmouseentermouseleave.on()
Sethen

Ich habe meine Antwort aktualisiert, um die Verwendung beider Ereignistypen einzuschließen. Dies funktioniert genauso wie Sethens Antwort, hat aber einen anderen Geschmack.
Jon McIntosh

24
hoverDie Ereignisunterstützung in On()wurde in jQuery 1.8 nicht mehr unterstützt und in jQuery 1.9 entfernt.
Gone Coding

9

Die jQuery-Hover-Funktion bietet Mouseover- und Mouseout-Funktionen.

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

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

Quelle: http://www.w3schools.com/jquery/event_hover.asp


3
funktioniert definitiv. Sie haben eine Abwertung bekommen, weil einige Leute Müll sind! Vielen Dank Kumpel
Kareem

8

Ich bin gerade aus dem Internet gesurft und hatte das Gefühl, ich könnte dazu beitragen. Ich habe festgestellt, dass der von @calethebrewer gepostete Code zu mehreren Aufrufen über den Selektor und unerwartetem Verhalten führen kann, zum Beispiel:

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

Diese Geige http://jsfiddle.net/TWskH/12/ illustriert meinen Standpunkt. Beim Animieren von Elementen wie in Plugins habe ich festgestellt, dass diese mehrfachen Trigger zu unbeabsichtigtem Verhalten führen, was dazu führen kann, dass die Animation oder der Code mehr als erforderlich aufgerufen wird.

Mein Vorschlag ist, einfach durch mouseenter / mouseleave zu ersetzen: -

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

Obwohl dies verhinderte, dass mehrere Instanzen meiner Animation aufgerufen wurden, entschied ich mich schließlich für Mouseover / Mouseleave, um festzustellen, wann Kinder des Elternteils über den Mauszeiger schwebten.


Diese Antwort bot tatsächlich eine funktionierende Lösung zum Hinzufügen eines Hover-Ereignisses für eine Dokumentauswahl. +1
Rich Davis

5

Sie können .on()mit verwenden, hoverindem Sie die folgenden Schritte ausführen:

Obwohl von neuem Code dringend abgeraten wird, wird möglicherweise der Pseudoereignisname "hover" als Abkürzung für die Zeichenfolge "mouseenter mouseleave" verwendet. Es wird ein einzelner Ereignishandler für diese beiden Ereignisse angehängt, und der Handler muss event.type untersuchen, um festzustellen, ob das Ereignis mouseenter oder mouseleave ist. Verwechseln Sie den Pseudoereignisnamen "hover" nicht mit der Methode .hover (), die eine oder zwei Funktionen akzeptiert.

Das wäre folgendes zu tun:

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

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

});

BEARBEITEN (Hinweis für Benutzer von jQuery 1.8+):

In jQuery 1.8 veraltet, in 1.9 entfernt: Der Name "hover" wird als Abkürzung für die Zeichenfolge "mouseenter mouseleave" verwendet. Es wird ein einzelner Ereignishandler für diese beiden Ereignisse angehängt, und der Handler muss event.type untersuchen, um festzustellen, ob das Ereignis mouseenter oder mouseleave ist. Verwechseln Sie den Pseudoereignisnamen "hover" nicht mit der Methode .hover (), die eine oder zwei Funktionen akzeptiert.


1
Dies ist nur mehr Arbeit, wenn es einfach mit mouseenterund erledigt werden kann. mouseleaveIch weiß, dies beantwortet nicht die ursprüngliche Frage von OP, aber hoverauf diese Weise zu verwenden, ist dennoch nicht klug.
Sethen

Dies geschieht genau so, wie das jQuery-Team vorschlägt, dass Sie es gemäß der Frage des OP tun. Wie das jQuery-Team jedoch vorschlägt, wird von neuem Code dringend abgeraten. Aber es ist immer noch die richtige Antwort auf die Frage des OP.
Code Maverick

1
@ Scott - du warst schneller als ich :-). @Sethen - beide Möglichkeiten funktionieren, aber der Fragesteller hat die Funktionalität mit angefordert .hover().
Jon McIntosh

Verständlicherweise, aber dennoch denke ich, dass OP nach einer Lösung für a suchte mouseenterund mouseleavenicht nur dafür, dass es funktioniert hover. Wenn es hoveraus Leistungsgründen keinen wirklichen Grund für die Verwendung gibt , warum sollten Sie es verwenden, wenn von neuem Code dringend abgeraten wird?
Sethen

5
hoverDie Ereignisunterstützung in On()wurde in jQuery 1.8 nicht mehr unterstützt und in jQuery 1.9 entfernt.
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');

2

Sie können einen oder mehrere Ereignistypen angeben, die durch ein Leerzeichen getrennt sind.

Also hovergleich mouseenter mouseleave.

Das ist mein Vorschlag:

$("#foo").on("mouseenter mouseleave", function() {
    // do some stuff
});

Ich mag die Entscheidung von jQ, diesen Parameter abzuschreiben. Die frühere Version 1.8, in der das Schweben als Namespace verwendet wurde, stimmte nicht mit dem DOM-Ereignis überein. Schweben, keine Beziehung.
Jim22150

1

Wenn Sie es als Bedingung für ein anderes Ereignis benötigen, habe ich es folgendermaßen gelöst:

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

In einem anderen Fall können Sie es dann einfach verwenden:

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

(Ich sehe einige is(':hover'), die dies lösen, aber dies ist (noch) kein gültiger jQuery-Selektor und funktioniert nicht in allen kompatiblen Browsern.)


-2

Das jQuery-Plugin hoverIntent http://cherne.net/brian/resources/jquery.hoverIntent.html geht viel weiter als die hier aufgeführten naiven Ansätze. Während sie sicherlich funktionieren, verhalten sie sich möglicherweise nicht unbedingt so, wie Benutzer es erwarten.

Der stärkste Grund für die Verwendung von hoverIntent ist die Timeout- Funktion. Sie können beispielsweise verhindern, dass ein Menü geschlossen wird, weil ein Benutzer seine Maus etwas zu weit nach rechts oder links zieht, bevor er auf das gewünschte Element klickt. Es bietet auch Funktionen, um Schwebeereignisse in einem Staudamm nicht zu aktivieren, und wartet auf fokussiertes Schweben.

Anwendungsbeispiel:

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 )

Weitere Erläuterungen hierzu finden Sie unter https://stackoverflow.com/a/1089381/37055

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.