jQuery 1.9 .live () n'est pas une fonction


242

J'ai récemment mis à jour jQuery de 1.8 à 2.1. J'ai soudain découvert que les .live()arrêts fonctionnent.
Je reçois l'erreur TypeError: $(...).live is not a function.

Existe-t-il une méthode que je peux utiliser à la place de .live()?

Réponses:


509

jQuery .live()a été supprimé à partir de la version 1.9.

Cela signifie que si vous effectuez une mise à niveau à partir de la version 1.8 et antérieure, vous remarquerez que les choses se cassent si vous ne suivez pas le guide de migration ci-dessous. Vous ne devez pas simplement remplacer .live()par .on()!


Lisez avant de commencer une recherche et remplacez:

Pour les correctifs rapides / à chaud sur un site en direct, ne remplacez pas simplement le mot-clé livepar on,
car les paramètres sont différents !

.live(events, function)

doit correspondre à:

.on(eventType, selector, function)

Le sélecteur (enfant) est très important! Si vous n'avez pas besoin de l'utiliser pour une raison quelconque, réglez-le sur null.


Exemple de migration 1:

avant:

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

après, vous déplacez l'élément enfant ( a) vers le .on()sélecteur:

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

Exemple de migration 2:

avant:

$('.myButton').live('click', function)

après, vous déplacez l'élément ( .myButton) vers le .on()sélecteur, et trouvez l'élément parent le plus proche (de préférence avec un ID):

$('#parentElement').on('click', '.myButton', function)

Si vous ne savez pas quoi mettre en tant que parent, bodyfonctionne toujours:

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

Voir également:


56

Vous pouvez éviter de refactoriser votre code en incluant le code JavaScript suivant

jQuery.fn.extend({
    live: function (event, callback) {
       if (this.selector) {
            jQuery(document).on(event, this.selector, callback);
        }
        return this;
    }
});

3
Devrait inclure un return this;à la fin de la fonction afin de préserver la capacité de chaînage
Guerilla

Est-ce que son utilisation causera des problèmes à l'avenir?
Islam Elshobokshy

15

La documentation de l'API jQuery répertorie live()les éléments obsolètes à partir de la version 1.7 et supprimés à partir de la version 1.9: lien .

version obsolète: 1.7, supprimée: 1.9

En outre, il déclare:

Depuis jQuery 1.7, la méthode .live () est obsolète. Utilisez .on () pour attacher des gestionnaires d'événements. Les utilisateurs d'anciennes versions de jQuery doivent utiliser .delegate () de préférence à .live ()


Merci d'avoir mentionné la version compatible vers l'avant: .delegate ()
Edward Olamisan

13

Port avant de .live()pour jQuery> = 1.9 Évite de refactoriser les dépendances JS sur .live() Utilise un contexte de sélecteur DOM optimisé

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

Cela a très bien fonctionné pour mon cas: je dois travailler obligatoirement sur jQuery 1.11.2. Je vous remercie!
vcoppolecchia

5

.live () était obsolète et a maintenant été supprimé de jQuery 1.9 Vous devez utiliser .on ()



5

Un correctif très simple qui n'a pas besoin de changer votre code, ajoutez simplement un script de migration jquery, téléchargez ici https://github.com/jquery/jquery-migrate/

Il fournit des fonctions obsolètes mais nécessaires comme "live", "navigateur", etc.


2

J'ai tendance à ne pas utiliser la syntaxe .on (), si ce n'est pas nécessaire. Par exemple, vous pouvez migrer plus facilement comme ceci:

vieux:

$('.myButton').live('click', function);

Nouveau:

$('.myButton').click(function)

Voici une liste de gestionnaires d'événements valides: https://api.jquery.com/category/forms/


3
Je pense que la syntaxe .on () est requise uniquement pour le contenu chargé dynamiquement (par exemple, les éléments ajoutés après le chargement de la page).
T30

1

Si vous utilisez la gemme jQuery de Ruby on Rails jquery-railset pour une raison quelconque, vous ne pouvez pas refactoriser votre code hérité, la dernière version qui le prend toujours en charge est 2.1.3et vous pouvez le verrouiller en utilisant la syntaxe suivante sur votre Gemfile:

gem 'jquery-rails', '~> 2.1', '= 2.1.3'

alors vous pouvez utiliser la commande suivante pour mettre à jour:

bundle update jquery-rails

J'espère que cela aidera d'autres personnes confrontées à un problème similaire.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.