javascript - Å gjøre om live() til on() i jQuery
Applikasjonen min har dynamisk lagt til rullegardinmenyer. Brukeren kan legge til så mange de trenger.
Jeg brukte tradisjonelt jQuerys live()-metode for å oppdage når en av disse rullegardinene ble change()et:
$('select[name^="income_type_"]').live('change', function() {
alert($(this).val());
});
Fra og med jQuery 1.7 har jeg oppdatert dette til:
$('select[name^="income_type_"]').on('change', function() {
alert($(this).val());
});
Ser man på dokumentasjonen, burde det være helt gyldig (ikke sant?) - men hendelseshåndtereren aktiveres aldri. Selvfølgelig har jeg bekreftet at jQuery 1.7 er lastet inn og kjører, osv. Det er ingen feil i feilloggen.
Hva gjør jeg galt? Takk!
Svar #1
Dokumentasjonen for on sier (med fet skrift ;)):
Hendelseshåndterere er bundet kun til de for øyeblikket valgte elementene; de må eksistere på siden på tidspunktet koden din gjør kall til
.on().
Tilsvarende .live() ville være noe som
$(document.body).on('change', 'select[name^="income_type_"]', function() {
alert($(this).val());
});
Selv om det er bedre om du binder hendelsesbehandleren så nær som mulig elementene, det vil si til et element som er nærmere i hierarkiet.
Oppdatering: Mens jeg svarte på et annet spørsmål, oppdaget jeg at dette også er nevnt i .live-dokumentasjonen:
Å omskrive
.live()-metoden i forhold til dens etterfølgere er enkelt; Dette er maler for ekvivalente kall for alle tre hendelsesvedleggsmetodene:$(selector).live(events, data, handler); // jQuery 1.3+ $(document).delegate(selector, events, data, handler); // jQuery 1.4.3+ $(document).on(events, selector, data, handler); // jQuery 1.7+
Svar #2
I tillegg til det valgte svaret,
Port jQuery.live til jQuery 1.9+ mens du venter på at applikasjonen din skal migrere. Legg dette til i JavaScript-filen din.
// Borrowed from jQuery 1.8.3's source code
jQuery.fn.extend({
live: function( types, data, fn ) {
if( window.console && console.warn ) {
console.warn( "jQuery.live is deprecated. Use jQuery.on instead." );
}
jQuery( this.context ).on( types, this.selector, data, fn );
return this;
}
});
Merk: Ovennevnte funksjon vil ikke fungere fra jQuery v3 siden this.selector er fjernet.
Eller, du kan bruke https://github.com/jquery/jquery-migrate
