jQuery 1.9 .live () non è una funzione


242

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:


509

jQuery .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()!


Leggi prima di iniziare a fare una ricerca e sostituire:

Per le correzioni rapide / a caldo su un sito live, non sostituire semplicemente la parola chiave livecon 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.


Esempio di migrazione 1:

prima:

$('#mainmenu a').live('click', function)

successivamente, sposta l'elemento figlio ( a) nel .on()selettore:

$('#mainmenu').on('click', 'a', function)

Esempio di migrazione 2:

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, bodyfunziona sempre:

$('body').on('click', '.myButton', function)

Guarda anche:


56

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;
    }
});

3
Dovrebbe includere return this;a alla fine della funzione per preservare l'abilità di concatenamento
Guerilla

L'utilizzo di questo può causare problemi in futuro?
Islam Elshobokshy,

15

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 ()


Grazie per aver menzionato la versione compatibile in avanti: .delegate ()
Edward Olamisan,

13

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);
          }
      }
  });
}

Questo ha funzionato benissimo per il mio caso: ho dovuto lavorare obbligatoriamente su jQuery 1.11.2. Grazie!
vcoppolecchia,

5

.live () è stato deprecato ed è stato rimosso da jQuery 1.9 Dovresti usare .on ()



5

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


2

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/


3
Penso che la sintassi .on () sia richiesta solo per i contenuti caricati dinamicamente (ad esempio, gli elementi aggiunti dopo il caricamento della pagina).
T30,

1

Se ti capita di usare la gemma jQuery di Ruby on Rails jquery-railse per qualche motivo non riesci a riformattare il tuo codice legacy, l'ultima versione che ancora supporta è 2.1.3e 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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.