2012-05-17 12 views
6

Jak mogę połączyć stary kod jQuery z wersją 1.7 .on()?jQuery - konwersja .live() do .on()

v1.3 .live():

$('#results tbody tr').live({ 
    mouseenter: 
     function() { $(this).find('.popup').show(); }, 
    mouseleave: 
     function() { $(this).find('.popup').hide(); } 
    }); 

v1.7 .on():

$('#results tbody').on('mouseenter', 'tr', function() { 
    $(this).find('.popup').show(); 
}); 
$('#results tbody').on('mouseleave', 'tr', function() { 
    $(this).find('.popup').hide(); 
}); 

Chcę przekazać zarówno obsługi zdarzeń do jednego .on() rozmowy, ale zachować genialne wydarzenie delegacja .on() pozwala mi zrobić.

Dziękujemy!

+2

Whats' tak z drugiego przykładu? Można połączyć oba wywołania 'on()' z jednego selektora, ale poza tym nie widzę problemów. –

+0

Nie, nie ma problemów, po prostu chcę przekazać oba programy obsługi zdarzenia w jednym obiekcie, tak jak robię to w pierwszym przykładzie. Dziękuję za super szybką odpowiedź, nawiasem mówiąc. – pilau

+2

TJ. odpowiada na faktyczne pytanie, ale Rory ma rację, że w takim przypadku można użyć pojedynczej metody obsługi dyanmicznej. – JMM

Odpowiedz

10

można przekazać zdarzeń-map jako pierwszy parametr:

$('#results tbody').on({ 
    'mouseenter' : function() { 
     $(this).find('.popup').show(); 
    }, 
    'mouseleave' : function() { 
     $(this).find('.popup').hide(); 
    } 
}, 'tr'); 

jQuery documentation:

.on (zdarzenia-map [selektor] [Dane]),
zdarzenia-MAP mapa w którym klucze łańcuch oznacza jeden lub więcej typów zdarzeń przestrzeni oddzielonych i opcjonalne nazw i wartości reprezentują funkcja obsługi jest wywołana dla zdarzenia (zdarzeń).

+0

To jest jeden, dziękuje TJ. – pilau

1

Formaty stosowane są określone w dokumentacji live

$(document).on({...events...}, selector, data); 

-lub-

$(document).on(event, selector, data, callback); 

Kod dla funkcji w 1.7+ live jest teraz po prostu funkcja pass-through:

live: function(types, data, fn) { 
    jQuery(this.context).on(types, this.selector, data, fn); 
    return this; 
} 
3

I po prostu chcę przekazać obydwie funkcje obsługi zdarzeń w jednym obiekcie, tak jak robię to w pierwszym przykładzie.

W tym przypadku można dołączyć dwa zdarzenia razem, a następnie różnicować je w samej obsługi, jak to:

$('#results tbody').on('mouseenter mouseleave', 'tr', function (e) { 
    if (e.type == "mouseenter") { 
     $(this).find('.popup').show(); 
    } 
    else { 
     $(this).find('.popup').hide(); 
    } 
}); 
+0

To jest miłe!Myślę, że przydałoby się to w przypadkach, w których wiążesz wiele programów obsługi zdarzeń na tym samym elemencie - i możesz użyć przełącznika wyboru, aby uchwycić wszystko. – pilau

0

Biorąc swój pierwszy przykład i zmieniając live do on powinno być wszystko, co trzeba

$('#results tbody tr').on({ 
mouseenter: 
    function() { $(this).find('.popup').show(); }, 
mouseleave: 
    function() { $(this).find('.popup').hide(); } 
}) 

Patrz: http://api.jquery.com/on/#example-6

+0

Ale wtedy przegapisz delegację wydarzenia. Spójrz na odpowiedź TJ :) – pilau

Powiązane problemy