J'ai récemment mis à jour jQuery de 1.8 à 2.1. J'ai soudain découvert que la .live()
cessait de fonctionner.
Je reçois le message d'erreur TypeError: $(...).live is not a function
.
Existe-t-il une méthode que je peux utiliser à la place de .live()
?
.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 des problèmes si vous ne suivez pas le guide de migration ci-dessous. Vous ne devez pas simplement remplacer .live()
par .on()
!
Pour solutions rapides/rapides sur un site actif, ne remplace pas , mais remplacez simplement le mot clé live
par on
,
étant donné que les paramètres sont différents !
.live(events, function)
devrait mapper à:
.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, définissez-le sur null
.
avant:
$('#mainmenu a').live('click', function)
ensuite, vous déplacez l'élément enfant (a
) vers le sélecteur .on()
:
$('#mainmenu').on('click', 'a', function)
avant:
$('.myButton').live('click', function)
ensuite, vous déplacez l'élément (.myButton
) vers le sélecteur .on()
et recherchez 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 indique que live()
est obsolète à partir de la version 1.7 et supprimé à partir de la version 1.9: lien .
version obsolète: 1.7, supprimée: 1.9
En outre, il est indiqué:
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 de transfert de .live()
pour jQuery> = 1.9 Evite 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);
}
}
});
}
Un correctif très simple qui n'a pas besoin de changer votre code, ajoutez simplement un script de migration jquery, téléchargez-le ici https://github.com/jquery/jquery-migrate/
Il fournit jquery obsolète mais des fonctions nécessaires telles que "live", "navigateur", etc.
.live a été supprimé de la version 1.9, veuillez consulter le guide de mise à niveau: http://jquery.com/upgrade-guide/1.9/#live-removed
.live () est obsolète et a été supprimé de jQuery 1.9. Vous devez utiliser . on ()
J'ai tendance à ne pas utiliser la syntaxe .on (), sinon nécessaire. Par exemple, vous pouvez migrer plus facilement comme ceci:
vieux:
$('.myButton').live('click', function);
nouveau:
$('.myButton').click(function)
Voici une liste des gestionnaires d’événements valides: https://api.jquery.com/category/forms/
Si vous utilisez le Ruby sur le gem jQuery de Rails jquery-Rails
et que, pour une raison quelconque, vous ne pouvez pas refactoriser votre code hérité, la dernière version prise en charge est toujours 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 les autres confrontés à un problème similaire.