/ / Pourquoi ces deux manières d’écrire un équivalent de plug-in jQuery? - javascript, jquery, jquery-plugins

Pourquoi ces deux manières d'écrire un équivalent de plug-in jQuery? - javascript, jquery, jquery-plugins

Pourquoi ces deux manières d'écrire un équivalent de plug-in jQuery?


Première manière:

$.fn.myplugin = function () {
return $(this).each(function() {
return $(this).bind("click", function () {
console.log("Hi");
});
});
};

Deuxième manière:

$.fn.myplugin = function () {
return this.bind("click", function () {
console.log("Hi2");
});
};

Réponses:

7 pour la réponse № 1

Réduisons de l’un à l’autre:

$.fn.myplugin = function () {
return $(this).each(function() {
return $(this).bind("click", function () {
console.log("Hi");
});
});
};

Quand vous commencez votre fonction this est un objet jQuery, donc $(this) ne vous achète rien, il pourrait facilement devenir:

$.fn.myplugin = function () {
return this.each(function() {
return $(this).bind("click", function () {
console.log("Hi");
});
});
};

Vous dites donc "Pour chaque élément de l'objet jQuery, créez un objet jQuery et liez un événement à cet objet".

Si vous regardez dans bind, il appelle on, qui exécute une certaine logique et effectue finalement cette ligne:

return this.each( function() {
jQuery.event.add( this, types, fn, data, selector );
});

Cela signifie que l'événement sera appliqué à chaque élément de cet objet jQuery. Vous dites donc:

Donc, vous dites "Pour chaque élément de l'objet jQuery, créez un objet jQuery, et pour chaque élément de cet objet jQuery lier un événement à cet élément ".

Vous faites maintenant une boucle deux fois, une fois dans une liste de N des éléments et ensuite N fois dans les listes de 1 élément. En fait, vous pouvez tout simplement lier directement:

$.fn.myplugin = function () {
return this.bind("click", function () {
console.log("Hi2");
});
};

Et c'est bien sûr le code final.


3 pour la réponse № 2

Dans votre cas, il n'y a pas de réelle différence, à part le fait que vous créez un nouvel objet jQuery dans votre premier extrait sans raison valable (this est un objet jQuery, donc pas besoin d'utiliser $(this)).

En général, c’est une bonne idée d’utiliser return this.each(...); dans votre fonction plugin pour que tout reste chaînable et que votre code fonctionne, quel que soit le nombre d’éléments présents dans l’objet jQuery sur lequel la fonction de votre plugin a été appelée.

Retour this.bind(...) conserve également la possibilité de chaînage, mais pour un plugin plus complexe qui ne lie pas simplement un événement, les choses sont souvent plus lisibles avec each boucle.


1 pour la réponse № 3

Il n'y a aucune différence entre les deux.

Pour une raison quelconque, dans l’un d’eux, vous faites une boucle, mais au final, ils ont le même résultat.


1 pour la réponse № 4

Ils sont équivalents car dans un plugin jQuery, this est l'objet jQuery, donc faire $(this) ne fait rien.

.bind travaillera sur tous les éléments d'un objet jQuery, et quand vous le ferez .each vous appelez .bind sur chaque élément individuellement.

Ils sont donc équivalents, car ils lient les éléments et leur lient des événements.

Je suggère d’utiliser le deuxième, c’est plus propre et plus rapide.