2010-02-14 16 views
162

Ich verwende den folgenden jquery-Code, um eine kontextbezogene Löschschaltfläche nur für Tabellenzeilen anzuzeigen, die wir mit der Maus bewegen. Dies funktioniert aber nicht für Zeilen, die mit js/ajax on the fly hinzugefügt wurden ...jquery live hover

Gibt es eine Möglichkeit, dies mit Live-Events funktionieren zu lassen?

$("table tr").hover(
    function() {}, 
    function() {} 
); 
+0

hervorragende Frage veraltet! – emaillenin

Antwort

244

jQuery 1.4.1 unterstützt jetzt „schweben“ live() Ereignisse, sondern nur mit einem Event-Handler-Funktion:

$("table tr").live("hover", 

function() { 

}); 

Alternativ können Sie zwei Funktionen, eine für MouseEnter- und eine für mouseleave bieten:

$("table tr").live({ 
    mouseenter: function() { 

    }, 
    mouseleave: function() { 

    } 
}); 
+0

Es funktioniert immer noch nicht für mich. Ich habe es versucht: Wo gehe ich falsch? > $ ('table tr') live ('hover', funktion() { \t \t $ (this) .find ('. deletebutton'). toggle(); \t}); –

+1

das ist falsch und funktioniert nicht. siehe die Überschrift "Mehrere Ereignisse" in der Dokumentation zu 'live': http://api.jquery.com/live/ – Jason

+34

Seit jQuery 1.4.2 entspricht .Live (" Hover ") .live (" mouseover " mouseout "), NICHT .live (" mouseenter mouseleave ") - siehe http://bugs.jquery.com/ticket/6077 Also, mach .live (" mouseenter mouseleave ", function() {...}), oder .live ("mouseenter", function() {...}). live ("mouseleave", funktion() {...}) – aem

5

Ab jQuery 1.4.1 arbeitet das Hover-Ereignis mit live(). Es bindet im Grunde nur auf die MouseEnter- und mouseleave Ereignisse, die Sie vor der 1.4.1 mit Versionen tun können genauso gut:

$("table tr") 
    .mouseenter(function() { 
     // Hover starts 
    }) 
    .mouseleave(function() { 
     // Hover ends 
    }); 

Dies erfordert zwei bindet, funktioniert aber genauso gut.

5

Dieser Code funktioniert:

$(".ui-button-text").live(
     'hover', 
     function (ev) { 
      if (ev.type == 'mouseover') { 
       $(this).addClass("ui-state-hover"); 
      } 

      if (ev.type == 'mouseout') { 
       $(this).removeClass("ui-state-hover"); 
      } 
     }); 
+2

Was ist "UI-State-Hover"? Wie gilt das für die ursprüngliche Frage des Benutzers? –

+1

Er verwendet nur Standardklassen von Jquery UI, wenn das Ereignis aktiv wird. –

110
$('.hoverme').live('mouseover mouseout', function(event) { 
    if (event.type == 'mouseover') { 
    // do something on mouseover 
    } else { 
    // do something on mouseout 
    } 
}); 

http://api.jquery.com/live/

+0

Arbeitete auch für mich. +1 Versuche, Philippe's Version zu machen, sowohl mit Mouseover als auch mit Mouseover - beides funktionierte nicht. Aber dieser hat es getan. Vielen Dank! – eduncan911

+0

'.live' ist jetzt veraltet, siehe Andre's Antwort für die Ersetzungsmethode jetzt. – johntrepreneur

+1

Wenn Sie die Ereignisse mouseover und mouseout verwenden, wird der Code kontinuierlich ausgelöst, wenn der Benutzer die Maus innerhalb des Elements bewegt. Ich denke, dass "mouseenter" und "mouseleave" besser geeignet sind, da sie nur einmal bei der Eingabe ausgelöst werden. – johntrepreneur

2

WARNUNG: Bei der Live-Version von Hover tritt eine erhebliche Leistungseinbuße auf. Es ist besonders auf einer großen Seite auf IE8 bemerkbar.

Ich arbeite an einem Projekt, wo wir mehrstufige Menüs mit AJAX laden (wir haben unsere Gründe :). Wie auch immer, ich habe die Live-Methode für den Hover verwendet, die auf Chrome funktioniert hat (IE9 war OK, aber nicht großartig). In IE8 verlangsamte es jedoch nicht nur die Menüs (Sie mussten für ein paar Sekunden schweben, bevor es fallen würde), aber alles auf der Seite war schmerzhaft langsam, einschließlich Scrollen und sogar das Überprüfen einfacher Checkboxen.

Die Bindung der Ereignisse direkt nach dem Laden führte zu einer angemessenen Leistung.

+2

nützlich, aber mehr ein Kommentar als eine Antwort. – mikemaccana

59

.live() hat als von jQuery 1.7

Verwenden .on() statt und geben Sie einen Abkömmling Selektor

http://api.jquery.com/on/

$("table").on({ 
    mouseenter: function(){ 
    $(this).addClass("inside"); 
    }, 
    mouseleave: function(){ 
    $(this).removeClass("inside"); 
    } 
}, "tr"); // descendant selector 
+6

das funktioniert einwandfrei ab jquery 1.9. alle leben und delegieren lösungen sind veraltet! wäre es toll, wenn jemand die akzeptierte Antwort nicht akzeptiert und stattdessen diese akzeptiert. – jascha