2012-05-17 17 views
6

Come posso combinare questo vecchio codice jQuery nella v1.7 .on()?jQuery - convert .live() a .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(); 
}); 

voglio passare entrambi i gestori di eventi per un .on() chiamata, ma mantenere la delegazione evento brillante .on() mi permette di fare.

Grazie!

+2

Whats' sbagliato con il tuo secondo esempio? È possibile concatenare entrambe le chiamate 'on()' da un selettore, ma a parte questo non vedo problemi. –

+0

No, non ci sono problemi, voglio solo passare entrambi i gestori di eventi in un oggetto, come faccio nel primo esempio. Grazie per la risposta super veloce, a proposito. – pilau

+2

TJ. risponde alla domanda vera, ma Rory ha ragione che in un caso come questo potresti semplicemente usare un singolo metodo dianmico di gestione. – JMM

risposta

10

è possibile passare un evento-map come primo parametro:

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

jQuery documentation:

.on (eventi-map [, selettore] [dati]),
eventi-mappa una mappa in cui le chiavi stringa rappresentano uno o più tipi di eventi separati da spazi e namespace opzionali, ei valori rappresentano una funzione di gestore per essere chiamato per l'evento (s).

+0

Questo è quello, grazie TJ. – pilau

1

I formati utilizzati sono specificate nella documentazione per live

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

oppure

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

Il codice per la funzione live in 1.7+ è ormai solo una funzione pass-through:

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

I voglio solo passare entrambi i gestori di eventi in un oggetto, come faccio nel primo esempio.

In questo caso si potrebbe collegare i due eventi insieme, poi li differenziano nel gestore stesso, in questo modo:

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

Questo è bello!Penso che sarebbe utile nei casi in cui si vincolano molti gestori di eventi sullo stesso elemento - e si potrebbe usare un interruttore di selezione per catturare tutto. – pilau

0

Prendendo il tuo primo esempio e cambiando live a on dovrebbe essere tutto ciò che è necessario

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

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

+0

Ma ti mancherà la delega dell'evento. Guarda la risposta di TJ :) – pilau