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()
?
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:
.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()
!
Pour les correctifs rapides / à chaud sur un site en direct, ne remplacez pas simplement le mot-clé live
par 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
.
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)
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, body
fonctionne toujours:
$('body').on('click', '.myButton', function)
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;
}
});
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 ()
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);
}
}
});
}
.live a été supprimé en 1.9, veuillez consulter le guide de mise à niveau: http://jquery.com/upgrade-guide/1.9/#live-removed
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.
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/
Si vous utilisez la gemme jQuery de Ruby on Rails jquery-rails
et 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.3
et 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.
return this;
à la fin de la fonction afin de préserver la capacité de chaînage