Les deux sites delegate()
y bind()
appelez simplement on()
. Voici un extrait de la source de jQuery 1.9.0 :
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 );
},
Así que on()
devrait être légèrement plus rapide que les deux autres fonctions, puisqu'il s'agit d'un appel de fonction en moins. L'invocation réelle du gestionnaire devrait être identique, quelle que soit la manière dont il a été lié.
Mais assurez-vous que vous comparez des pommes avec des pommes. Si vous donnez à un selector
argument pour delegate
o bind
l'invocation du gestionnaire sera plus lente car il doit vérifier si la cible satisfait au sélecteur.
La raison de votre résultat de référence est que
$("p").on('click',$.noop);
est équivalent à quelque chose comme :
$("p").each(function() {
$(this).on('click', $.noop);
});
Il doit trouver tous les éléments correspondants et leur associer un gestionnaire. Le site delegate()
ne doit lier un gestionnaire qu'à un seul é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 du genre :
if ($(event.target).is("p")) { ... }
L'utilisation de on()
qui est équivalent à delegate()
serait :
$(document).on('click', 'p', $.noop);
Lorsque vous déléguez à partir d'un élément important comme document
vous invoquez le gestionnaire interne à chaque fois que vous cliquez n'importe où dans le document, ce qui vous fait perdre du temps pour vérifier si vous vous trouvez au-dessus d'une page de l'annuaire. 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 voulez déléguer.