Activation de live () en () dans jQuery

202

Mon application a ajouté dynamiquement des Dropdowns. L'utilisateur peut en ajouter autant qu'il le souhaite.

J'utilisais traditionnellement la live()méthode de jQuery pour détecter le moment où l'un de ces Dropdowns était change()édité:

$('select[name^="income_type_"]').live('change', function() {
    alert($(this).val());
});

Depuis jQuery 1.7, j'ai mis à jour ceci pour:

$('select[name^="income_type_"]').on('change', function() {
    alert($(this).val());
});

En regardant les documents, cela devrait être parfaitement valide (non?) - mais le gestionnaire d'événements ne se déclenche jamais. Bien sûr, j'ai confirmé que jQuery 1.7 est chargé et fonctionne, etc. Il n'y a aucune erreur dans le journal des erreurs.

Qu'est-ce que je fais mal? Merci!

Jack
la source
2
Je sais que c'est tard, mais il semble que jQuery liveutilise en fait de ontoute façon, donc une réécriture du code hérité pourrait ne pas être nécessaire pour l'instant jusqu'à ce livequ'il soit supprimé, ce qui, je crois, est 1.9. Extrait de la source 1.7.1: live: function( types, data, fn ) {jQuery( this.context ).on( types, this.selector, data, fn ); return this;}Donc, si l'on ne met pas à niveau une version dans laquelle il a livedisparu, une mise à jour peut ne pas être nécessaire immédiatement pour le code hérité. Pour un nouveau code, il est préférable d'utiliser à la on()place, comme recommandé. Je pensais juste que cette information pourrait aider quelqu'un d'autre à un moment donné.
Nope
1
Voir Exemples de migration pour savoir comment passer liveà on.
Samuel Liew

Réponses:

246

La ondocumentation indique (en gras;)):

Les gestionnaires d'événements ne sont liés qu'aux éléments actuellement sélectionnés; ils doivent exister sur la page au moment où votre code appelle .on().

Équivalent à .live()serait quelque chose comme

$(document.body).on('change', 'select[name^="income_type_"]', function() {
    alert($(this).val());
});

Bien qu'il soit préférable de lier le gestionnaire d'événements aussi près que possible des éléments, c'est-à-dire d'un élément plus proche dans la hiérarchie.

Mise à jour: En répondant à une autre question, j'ai découvert que cela est également mentionné dans la .livedocumentation :

Réécrire la .live()méthode en fonction de ses successeurs est simple; ce sont des modèles d'appels équivalents pour les trois méthodes de connexion d'événement:

$(selector).live(events, data, handler);                // jQuery 1.3+
$(document).delegate(selector, events, data, handler);  // jQuery 1.4.3+
$(document).on(events, selector, data, handler);        // jQuery 1.7+
Felix Kling
la source
5
@Jack: Pas de soucis, OMI, c'est une bonne question. Je suppose que d' autres vont buter sur cela aussi bien quand ils essaient de convertir tous les bind, liveet les delegateappels vers on.
Felix Kling
4
Ah oui, et bien sûr, nous ne voyons cette réponse qu'après avoir exécuté une recherche et un remplacement de couverture à partir de .live>.on
ajbeaven
3
OMI, la .onsyntaxe est plus logique, car l'écouteur est en fait attaché au sélecteur que vous fournissez. Lorsque l'événement est déclenché, jQuery traverse le DOM et exécute les gestionnaires là où cela est spécifié (délégation d'événement simple). .livea suggéré qu'il y avait quelque chose de "magique" qui s'est produit, et il a été dit d'attacher des gestionnaires d'événements pour les "éléments futurs", ce qui n'était pas entièrement vrai.
David Hellsing
1
@FelixKling qui est correct - je suis tombé dessus aussi! Merci
willdanceforfun
2
Pour le moteur de recherche: La méthode jQuery ".live ()" est dépréciée depuis la v1.7 et supprimée dans la v1.9. Corrigez vos scripts en utilisant à la place la méthode ".on ()". Étonnamment, cela affecte également l'actuel Microsoft jquery.unobtrusive-ajax.js v2.0.20710.0 (Microsoft n'a pas mis à jour ses scripts non plus alors maintenant il est cassé).
Tony Wall
25

En plus de la réponse sélectionnée,

Port jQuery.liveà jQuery 1.9+ pendant que vous attendez votre application à migrer. Ajoutez ceci à votre fichier JavaScript.

// Borrowed from jQuery 1.8.3's source code
jQuery.fn.extend({
  live: function( types, data, fn ) {
          if( window.console && console.warn ) {
           console.warn( "jQuery.live is deprecated. Use jQuery.on instead." );
          }

          jQuery( this.context ).on( types, this.selector, data, fn );
          return this;
        }
});

Remarque: La fonction ci-dessus ne fonctionnera pas à partir de jQuery v3 car elle this.selectorest supprimée.

Ou, vous pouvez utiliser https://github.com/jquery/jquery-migrate

Vikrant Chaudhary
la source
7

Je viens de trouver une meilleure solution qui n'implique pas la modification de code tiers:

https://github.com/jquery/jquery-migrate/#readme

Installez le package jQuery Migrate NuGet dans Visual Studio pour éliminer tous les problèmes de version. La prochaine fois que Microsoft mettra à jour leurs modules AJAX et de validation discrets, essayez-le sans le script de migration pour voir s'ils ont résolu le problème.

Comme jQuery Migrate est géré par la Fondation jQuery, je pense que ce n'est pas seulement la meilleure approche pour les bibliothèques tierces et également pour obtenir des messages d'avertissement pour vos propres bibliothèques détaillant comment les mettre à jour.

Tony Wall
la source
3

En plus des réponses sélectionnées,

Si vous utilisez Visual Studio , vous pouvez utiliser le remplacement Regex .
Dans Edition> Rechercher et remplacer> Remplacer dans les fichiers
ou Ctrl + Maj + H

Dans la fenêtre contextuelle Rechercher et remplacer, définissez ces champs

Rechercher quoi: \$\((.*)\)\.live\((.*),
Remplacer par: $(document.body).on($2,$1,
Dans les options de recherche, cochez "Utiliser les expressions régulières"

Maykol Rypka
la source
-1

jquery verision xxxjs ouvrir l'éditeur, trouver jQuery.fn.extend

ajouter du code

live: function( types, data, fn ) {
        jQuery( this.context ).on( types, this.selector, data, fn );
        return this;
    },

Exemple: jquery-2.1.1.js -> ligne 7469 (jQuery.fn.extend)

Exemple de vue d'images

Uğur Tosun
la source