Les deux delegate()
et bind()
appellent simplement on()
. Voici un extrait de la jQuery 1.9.0 source:
bind: function(types, data, fn) {
return this.on(types, null, data, fn);
},
delegate: function(selector, types, data, fn) {
return this.on(types, selector, data, fn);
},
Alors on()
devrait être légèrement plus rapide que les deux autres fonctions, car il est un appel de fonction moins. L'invocation réelle du gestionnaire devrait être identique quelle que soit la manière dont il était lié. Mais assurez-vous de comparer des pommes avec des pommes. Si vous attribuez un argument selector
à delegate
ou bind
, l'appel du gestionnaire sera plus lent car il doit vérifier si la cible satisfait le sélecteur.
La raison de votre résultat de référence est parce que
$("p").on('click',$.noop);
équivaut à quelque chose comme:
$("p").each(function() {
$(this).on('click', $.noop);
});
Il doit trouver tous les éléments correspondants et lier un gestionnaire à eux. L'appel delegate()
doit uniquement lier un gestionnaire à un élément (le document); au lieu de trouver tous les éléments au moment de la liaison, au moment où l'événement se produit, il fait quelque chose comme:
if ($(event.target).is("p")) { ... }
L'utilisation de on()
qui est équivalent à delegate()
serait:
$(document).on('click', 'p', $.noop);
Lorsque vous déléguez de un gros élément comme document
, vous appelez le gestionnaire interne chaque fois que vous cliquez n'importe où dans le document, ce qui vous fait perdre du temps si vous avez dépassé p
. C'est pourquoi vous devriez essayer de limiter la portée de l'élément utilisé dans delegate
au plus petit élément statique qui contient tous les éléments dynamiques que vous souhaitez déléguer.
Essayez de définir 'delegate' sur quelque chose que vous devez rechercher. – Musa
Puisque 'delegate()' appelle 'on()' (ils sont équivalents à l'exception de l'ordre des arguments), il n'y a aucun moyen de le rendre plus efficace. – Barmar
Notez que le problème n'est pas de rechercher les éléments 'p': http://jsperf.com/test-on-click-delegate/2 –