8
votes

JQuery - Pourquoi "Live" est-il inefficace? Et comment pouvons-nous mesurer cela?

Pourquoi les programmeurs disent-ils que "Live" est inefficace?

  1. alors quelle est l'alternative Méthodes pour reproduire cette fonction qui sont plus efficaces?
  2. Comment pouvons-nous mesurer l'impact de combien il ralentit les choses?

1 commentaires

Quels programmeurs? À propos de ce que "vivre"? Quelles méthodes de reproduction?


3 Réponses :


6
votes

Je suppose que c'est inefficace car le gestionnaire est placé sur le nœud racine et repose sur des bouillons pour attraper l'événement et exécuter le gestionnaire approprié.

Une alternative serait simplement lier code> votre Hangler à vos éléments créés dynamiquement lorsqu'ils sont créés et ajoutés à la DOM. P>

Une autre alternative consiste à lier un seul gestionnaire à un conteneur et laissez vos événements à la bulle à ce sujet. Cela peut être agréable si vous avez beaucoup d'éléments identiques ajoutés à un conteneur. P>

$('#myContainer').delegate('.myElement', 'click' function() { alert($(this).text()); });


5 commentaires

J'aurais mentionné .Delegate () ici, un moyen beaucoup plus propre de faire votre deuxième exemple :)


@Nick cravraver - ne pas .Delegate () lie un gestionnaire à chaque élément? Une bonne chose à propos de la méthode que j'ai mentionnée est que vous n'avez pas les frais généraux des gestionnaires sur plusieurs éléments.


+1 Si vous donnez un exemple :) Votre balisage actuel utiliserait ceci: $ ('# myContainer'). Délégué ('. Myelement', "Cliquez sur" Fonction () {Alerte ($ (This). );});


@patrick - Il lie un gestionnaire juste comme .Live () à l'aide d'un contexte ( .Delegate () appels .Live () interne) Au lieu d'écouter sur document pour des bulles, il écoute sur l'élément que vous avez lié. C'est donc le même comportement, attrape la bulle beaucoup plus tôt.


@Nick Craver - Merci beaucoup. Je viens de jeter un coup d'œil aux docs aussi, et j'ai mal compris .Delegate () . Merci pour le conseil. J'ai inclus votre solution.



1
votes

live () pourrait seulement être considéré comme inefficace si:

  1. Il y a une petite quantité d'éléments à être liés à un événement (<5, disons).
  2. Le nombre de ces éléments cibles reste fixe.

    Si votre cas d'utilisation répond aux critères ci-dessus (notamment n ° 2), vous devez vous en tenir à la liaison directe sur les éléments et éviter live () . .

    Un exemple d'analyse comparative des performances de Live () Vous pouvez essayer consiste à profiler un fragment de code utilisant live () pour lier un cliquer sur < / Code> Handler à un élément et profilez également un autre fragment de code qui utilise Cliquez sur () pour se lier à ce même élément.

    Je ne suis pas trop sûr du résultat final, mais je suis sûr que ce sera intéressant.


0 commentaires

1
votes

Comme @Patrick le suggère peut être inefficace car elle nécessite un traitement pour tous les événements sur le document, que la bulle atteigne votre élément ou non.

C'est là que Délégué peut vous aider, car il fonctionne de la même manière que la vie, mais lui permet de ne faire qu'une plus petite proportion du document en la limitant à un parent commun

(en utilisant son exemple) xxx


0 commentaires