Di recente ho aggiornato jQuery dalla 1.8 alla 2.1. Improvvisamente ho scoperto che .live()
smette di funzionare.
Ottengo l'errore TypeError: $(...).live is not a function
.
Esiste un metodo che posso usare al posto di .live()
?
Di recente ho aggiornato jQuery dalla 1.8 alla 2.1. Improvvisamente ho scoperto che .live()
smette di funzionare.
Ottengo l'errore TypeError: $(...).live is not a function
.
Esiste un metodo che posso usare al posto di .live()
?
Risposte:
.live()
è stato rimosso dalla versione 1.9 in poi.Ciò significa che se stai eseguendo l'aggiornamento dalla versione 1.8 e precedenti, noterai cose che si rompono se non segui la guida alla migrazione di seguito. Non devi semplicemente sostituirlo .live()
con .on()
!
Per le correzioni rapide / a caldo su un sito live, non sostituire semplicemente la parola chiave live
con on
,
poiché i parametri sono diversi !
.live(events, function)
dovrebbe mappare a:
.on(eventType, selector, function)
Il selettore (figlio) è molto importante! Se non è necessario utilizzarlo per qualsiasi motivo, impostarlo su null
.
prima:
$('#mainmenu a').live('click', function)
successivamente, sposta l'elemento figlio ( a
) nel .on()
selettore:
$('#mainmenu').on('click', 'a', function)
prima:
$('.myButton').live('click', function)
successivamente, sposta l'elemento ( .myButton
) sul .on()
selettore e trova l'elemento genitore più vicino (preferibilmente con un ID):
$('#parentElement').on('click', '.myButton', function)
Se non sai cosa mettere come genitore, body
funziona sempre:
$('body').on('click', '.myButton', function)
Puoi evitare il refactoring del tuo codice includendo il seguente codice JavaScript
jQuery.fn.extend({
live: function (event, callback) {
if (this.selector) {
jQuery(document).on(event, this.selector, callback);
}
return this;
}
});
La documentazione dell'API jQuery è live()
obsoleta dalla versione 1.7 e rimossa dalla versione 1.9: link .
versione obsoleta: 1.7, rimossa: 1.9
Inoltre afferma:
A partire da jQuery 1.7, il metodo .live () è obsoleto. Utilizzare .on () per collegare i gestori di eventi. Gli utenti di versioni precedenti di jQuery dovrebbero usare .delegate () preferibilmente a .live ()
Porta forward di .live()
per jQuery> = 1.9 Evita il refactoring delle dipendenze JS sul .live()
contesto del selettore DOM ottimizzato
/**
* Forward port jQuery.live()
* Wrapper for newer jQuery.on()
* Uses optimized selector context
* Only add if live() not already existing.
*/
if (typeof jQuery.fn.live == 'undefined' || !(jQuery.isFunction(jQuery.fn.live))) {
jQuery.fn.extend({
live: function (event, callback) {
if (this.selector) {
jQuery(document).on(event, this.selector, callback);
}
}
});
}
.live è stato rimosso in 1.9, consultare la guida all'aggiornamento: http://jquery.com/upgrade-guide/1.9/#live-removed
Una soluzione molto semplice che non ha bisogno di cambiare il codice, basta aggiungere lo script di migrazione jquery, scaricare qui https://github.com/jquery/jquery-migrate/
Fornisce jquery deprecato ma funzioni necessarie come "live", "browser" ecc
Tendo a non usare la sintassi .on (), se non necessario. Ad esempio puoi migrare più facilmente in questo modo:
vecchio:
$('.myButton').live('click', function);
nuovo:
$('.myButton').click(function)
Ecco un elenco di gestori di eventi validi: https://api.jquery.com/category/forms/
Se ti capita di usare la gemma jQuery di Ruby on Rails jquery-rails
e per qualche motivo non riesci a riformattare il tuo codice legacy, l'ultima versione che ancora supporta è 2.1.3
e puoi bloccarlo utilizzando la seguente sintassi sul tuo Gemfile
:
gem 'jquery-rails', '~> 2.1', '= 2.1.3'
quindi è possibile utilizzare il seguente comando per aggiornare:
bundle update jquery-rails
Spero che possa aiutare gli altri ad affrontare un problema simile.
return this;
a alla fine della funzione per preservare l'abilità di concatenamento