2010-02-14 19 views
162

Korzystam z poniższego kodu jquery, aby pokazać kontekstowy przycisk usuwania tylko dla wierszy tabel, które zawieszamy myszą. Działa to, ale nie dla wierszy, które zostały dodane z js/ajax w locie ...jquery live hover

Czy istnieje sposób, aby to działało z wydarzeniami na żywo?

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

wspaniałe pytanie! – emaillenin

Odpowiedz

244

jQuery 1.4.1 obsługuje teraz „hover” na żywo() wydarzeń, ale tylko jeden z funkcji obsługi zdarzeń:

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

function() { 

}); 

Alternatywnie, można zapewnić dwie funkcje, jedną dla mouseenter i jeden dla mouseLeave:

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

    }, 
    mouseleave: function() { 

    } 
}); 
+0

To nadal nie działa dla mnie. Próbowałem to zrobić: Gdzie ja idę źle? > $ ('table tr'). live ('hover', function() { \t \t $ (this) .find ('. deletebutton'). toggle(); \t}); –

+1

jest to nieprawidłowe i nie działa. zobacz nagłówek "Wiele zdarzeń" w dokumentacji dla "live": http://api.jquery.com/live/ – Jason

+34

Od wersji jQuery 1.4.2, .live ("hover") jest równoważne .live ("mouseoverover" mouseout "), NOT .live (" mouseenter mouseleave ") - patrz http://bugs.jquery.com/ticket/6077 Tak, zrób .live (" mouseenter mouseleave ", function() {...}), lub .live ("mouseenter", function() {...}). live ("mouseleave", function() {...}) – aem

5

Jak jQuery 1.4.1, zdarzenie aktywowanych współpracuje z live(). To w zasadzie tylko wiąże się z mouseenter i mouseLeave zdarzeń, które można zrobić z wersji przed 1.4.1 równie dobrze:

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

Wymaga to dwóch wiąże ale działa tak samo dobrze.

5

Ten kod działa:

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

Co to jest "ui-state-hover"? Jak to dotyczy oryginalnego pytania użytkownika? –

+1

po prostu używa domyślnych klas JQuery UI, gdy wydarzenie podejmuje działanie .. –

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

Pracował także dla mnie. +1 wypróbowany w wersji Philippe'a, zarówno z mouseover, jak i mouseenter - ani nie działał. Ale ten zrobił. Dzięki! – eduncan911

+0

'.live' jest przestarzałe, teraz patrz odpowiedź Andre dla metody zastępowania. – johntrepreneur

+1

Użycie zdarzeń 'mouseover' i' mouseout' powoduje, że kod ciągle się uruchamia, gdy użytkownik porusza myszą wewnątrz elementu. Myślę, że 'mouseenter' i' mouseleave' są bardziej odpowiednie, ponieważ będą uruchamiane tylko raz przy wejściu. – johntrepreneur

2

OSTRZEŻENIE: Występuje znaczna kara za wydajność w wersji aktywnej na żywo. Jest to szczególnie widoczne na dużej stronie na IE8.

Pracuję nad projektem, w którym ładujemy wielopoziomowe menu za pomocą AJAX (mamy nasze powody :). W każdym razie użyłem metody na żywo dla hover, która świetnie działała w Chrome (IE9 działało dobrze, ale nie wspaniale). Jednak w IE8 nie tylko spowolnił menu (trzeba było zawisnąć przez kilka sekund, zanim spadnie), ale wszystko na stronie było boleśnie powolne, w tym przewijanie, a nawet sprawdzanie prostych pól wyboru.

Wiązanie zdarzeń bezpośrednio po ich załadowaniu spowodowało odpowiednią wydajność.

+2

przydatne, ale bardziej komentarz niż odpowiedź. – mikemaccana

59

.live() został wycofany z jQuery 1.7

Korzystanie .on() zamiast i określić selektor potomka

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

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

działa to bezbłędnie jak w jquery 1.9. wszystkie rozwiązania na żywo i na delegatów są ZOSTAŁE ODRADZANE! Byłoby świetnie, gdyby ktoś mógł nie zaakceptować zaakceptowanej odpowiedzi i zaakceptować ją. – jascha