.bind () contre .on () de jQuery

207

J'ai trouvé deux excellents articles parlant de la nouvelle fonction .on(): jquery4u.com , elijahmanor.com .

Existe-t-il un moyen où l' .bind()alambic est préférable d'utiliser que .on()?

Par exemple, j'ai un exemple de code qui ressemble à ceci:

$("#container").click( function( e ) {} )

Vous pouvez noter que je n'ai qu'un élément récupéré par le sélecteur et dans mon cas, le <div>nom #containerexiste déjà lorsque ma page a été chargée; pas ajouté dynamiquement. Il est important de mentionner que j'utilise la dernière version de jQuery: 1.7.2.

Pour cet exemple, devrait .on()être utilisé au lieu de .bind()même si je n'utilise pas les autres fonctionnalités fournies par la .on()fonction?

Samuel
la source
5
ce deuxième article est des ordures. Il indique comment .bind()est mauvais pour lier plusieurs éléments, mais ne mentionne pas comment, .on()lorsqu'il est utilisé en mode liaison, fait exactement la même chose.
Alnitak

Réponses:

316

En interne, .bindcorrespond directement à .ondans la version actuelle de jQuery. (Il en va de même pour .live.) Il y a donc un impact sur les performances minuscule mais pratiquement insignifiant si vous utilisez à la .bindplace.

Cependant, .bindpeut être supprimé des futures versions à tout moment. Il n'y a aucune raison de continuer à utiliser .bindet toutes les raisons de préférer à la .onplace.

Blazemonger
la source
5
Probablement - il n'y a pas de raison de les supprimer, car ils correspondent simplement à une fonction existante. D'un autre côté, la mise à niveau par un numéro de version majeur signifie que vous pouvez faire à peu près n'importe quoi pour l'API, car la compatibilité descendante n'est pas nécessairement garantie à ce stade. Je dis juste.
Blazemonger
6
@Esailija, ces fonctions offrent toutes des raccourcis utiles pour traiter des types spécifiques de demandes asynchrones. .bindet .onsont identiques pour les événements non délégués; .bindne fournit aucun raccourci comme le $.getJSONfait
jackwanders
7
@jbabey, bien qu'il soit techniquement vrai qu'ils ne suppriment pas nécessairement toutes les fonctions, ils les déconseillent toujours et vous déconseillent de les utiliser. À l'avenir, ils pourraient toujours décider de les supprimer entièrement (sorte de la façon dont ils ont supprimé certains supports IE à partir des versions 2.x). Les fonctions obsolètes ne doivent pas être utilisées.
Hanna
8
impression de la fonction "jQuery.fn.bind.toString ()" sorties "(a, b, c) {retourner this.on (a, null, b, c)}"
Jowen
5
bind et unbind sont obsolètes à partir de jQuery 3.
Joe Mabel
58

Ces extraits effectuent tous exactement la même chose:

element.on('click', function () { ... });
element.bind('click', function () { ... });
element.click(function () { ... });

Cependant, ils sont très différents de ceux-ci, qui effectuent tous la même chose:

element.on('click', 'selector', function () { ... });
element.delegate('click', 'selector', function () { ... });
$('selector').live('click', function () { ... });

Le deuxième ensemble de gestionnaires d'événements utilise la délégation d'événements et fonctionnera pour les éléments ajoutés dynamiquement. Les gestionnaires d'événements qui utilisent la délégation sont également beaucoup plus performants. Le premier ensemble ne fonctionnera pas pour les éléments ajoutés dynamiquement et sont bien pires pour les performances.

La on()fonction de jQuery n'introduit aucune nouvelle fonctionnalité qui n'existait pas déjà, c'est juste une tentative de standardiser la gestion des événements dans jQuery (vous n'avez plus à choisir entre vivre, lier ou déléguer).

jbabey
la source
1
Je pense que vous voulez dire $('selector').live('click', function () { ... });que vous gardez le résultat aussi identique que possible.
andlrc
11

Les méthodes directes .delegatesont des API supérieures .onet il n'est pas prévu de les déprécier.

Les méthodes directes sont préférables car votre code sera moins typé en chaîne. Vous obtiendrez une erreur immédiate lorsque vous tapez mal un nom d'événement plutôt qu'un bug silencieux. À mon avis, il est également plus facile d'écrire et de lire clickqueon("click"

Le .delegateest supérieur à en .onraison de l'ordre de l'argument:

$(elem).delegate( ".selector", {
    click: function() {
    },
    mousemove: function() {
    },
    mouseup: function() {
    },
    mousedown: function() {
    }
});

Vous savez tout de suite que c'est délégué parce que, eh bien, ça dit délégué. Vous voyez également instantanément le sélecteur.

Avec .once n'est pas immédiatement clair si c'est même délégué et vous devez regarder à la fin pour le sélecteur:

$(elem).on({
    click: function() {
    },
    mousemove: function() {
    },
    mouseup: function() {
    },
    mousedown: function() {
    }
}, "selector" );

Maintenant, la dénomination de .bindest vraiment terrible et est à première vue pire que .on. Mais .delegatene peut pas faire d'événements non délégués et il y a des événements qui n'ont pas de méthode directe, donc dans un cas rare comme celui-ci, cela pourrait être utilisé mais uniquement parce que vous voulez faire une séparation nette entre les événements délégués et non délégués.

Esailija
la source
8
Depuis jQuery 3.0, .delegate () est obsolète.
dim
6

De la documentation jQuery:

Depuis jQuery 1.7, la méthode .on () est la méthode préférée pour attacher des gestionnaires d'événements à un document. Pour les versions antérieures, la méthode .bind () est utilisée pour attacher un gestionnaire d'événements directement aux éléments. Les gestionnaires sont attachés aux éléments actuellement sélectionnés dans l'objet jQuery, donc ces éléments doivent exister au moment où l'appel à .bind () se produit. Pour une liaison d'événement plus flexible, consultez la discussion sur la délégation d'événement dans .on () ou .delegate ().

http://api.jquery.com/bind/

Faust
la source
1
Gardez à l'esprit, les conseils de la documentation proviennent de la même équipe qui vous a amené à lier, cliquer, vivre, déléguer ... et toute la confusion qui en résulte. Après avoir lu plusieurs sites sur cette question, mon avis est que les sites les meilleurs et les plus précis sont ceux qui décrivent «on» comme «enrobage de sucre», le sucre attire les insectes et le délégué est la voie à suivre.
DaveWalley du
4

Depuis Jquery 3.0 et supérieur, .bind est obsolète et préfère utiliser .on à la place. Comme @Blazemonger a répondu plus tôt, il peut être supprimé et c'est sûr qu'il le sera. Pour les anciennes versions, .bind appellerait également .on en interne et il n'y a aucune différence entre eux. Veuillez également consulter l'API pour plus de détails.

Documentation de l'API jQuery pour .bind ()

userG
la source