-
.load()
est surchargé avec un comportement entièrement différent selon les arguments passés
-
.toggle()
est surchargé avec un comportement entièrement différent selon les arguments passés
-
une surcharge trop importante de la jQuery()
fonction peut-être.
-
le site .attr()
que vous avez mentionné. La distinction avec les propriétés aurait dû être immédiate, selon l'OMI.
-
.map( key,val )
mais $.map( val,key )
et le this
sont différentes.
-
Les sélecteurs non standard auraient dû être tenus à l'écart de Sizzle IMO. Les moteurs de sélection basés sur Javascript devraient devenir obsolètes dans quelques années, et les personnes accrochées aux sélecteurs propriétaires auront une transition plus difficile.
-
mauvaise dénomination des méthodes comme .closest()
ou .live()
. Que font-ils exactement ?
-
J'ai récemment découvert que vous ne pouvez pas fixer la norme width
et height
par l'intermédiaire du props
lors de la création d'un nouvel élément. jQuery exécute son propre argument de type width
et height
à la place. OMI, les attributs de la spécification auraient dû être prioritaires, d'autant plus que width
et height
peut être réglé via css
.
$('<img/>', {
css:{width:100, height:100},
width:100, // <-- calls method, why?
height:100, // <-- calls method, why?
});
-
$.get()
et .get()
sont totalement différentes.
-
.get()
et .toArray()
sont identiques lorsqu'ils ne passent aucun argument
-
toArray()
et $.makeArray()
font effectivement la même chose. Pourquoi ne leur ont-ils pas donné le même nom comme .each()
et $.each()
?
-
deux différents délégation d'événements méthodes. .delegate()
la personne sensible, et .live()
la magie "wow, ça marche !" un.
-
.index()
est surchargé de 3 comportements, mais leurs différences peuvent être déroutantes
// v---get index v---from collection (siblings is implied)
$('selector').index();
// v---from collection v---get index
$('selector').index(element);
// v---get index v---from collection
$('selector').index('selector');
La première est compréhensible si l'on se rappelle qu'elle n'opère que sur le premier élément
La seconde est la plus logique puisque les méthodes jQuery généralement opérer sur une collection entière.
La troisième est totalement confuse. La méthode ne donne aucune indication sur le sélecteur qui représente la collection et sur le sélecteur qui représente l'élément dont vous voulez l'index dans la collection.
Pourquoi ne pas simplement éliminer le troisième, et faire en sorte que les gens utilisent le deuxième comme ceci :
// v---from collection v---get index
$('selector').index( $('selector') );
De cette façon, il s'intègre mieux au reste de jQuery où .index()
opère sur l'ensemble de la collection.
Ou au moins inverser le sens des sélecteurs pour mieux s'intégrer :
// v---from collection v---get index
$('selector').index('selector');
En voici une autre à laquelle vous pouvez réfléchir.
J'ai quelques inquiétudes concernant le système de gestion des événements et de stockage des données de JQuery. Il est loué parce qu'il n'ajoute pas de fonctions à on[event]
qui peuvent se refermer autour d'autres éléments, créant ainsi des fuites de mémoire dans IE. Au lieu de cela, il place une propriété expando légère, qui correspond à une entrée dans le fichier jQuery.cache
qui contient les gestionnaires et d'autres données.
Je crois qu'il attache ensuite un gestionnaire qui invoque à son tour le gestionnaire que vous avez assigné. Ou quelque chose comme ça.
Quel que soit le système, cela n'a pas vraiment d'importance. L'essentiel est que le lien entre l'élément ou les éléments et le(s) jQuery.cache
c'est cet expansif.
Pourquoi est-ce un problème ? D'un point de vue philosophique, jQuery n'est pas un framework, mais une bibliothèque. Il semblerait qu'en tant que bibliothèque, vous devriez pouvoir utiliser ou ne pas utiliser les fonctions jQuery sans vous soucier des effets négatifs. Pourtant, si vous sortez de jQuery lorsque vous supprimez des éléments du DOM, vous avez rendu orphelins tous les gestionnaires et autres données associés à ces éléments via l'expando, créant ainsi une fuite de mémoire agréable et entièrement inter-navigateurs.
Ainsi, par exemple, quelque chose d'aussi simple que el.innerHTML = ''
pourrait être très dangereux.
Ajoutez à cela le jQuery.noConflict()
caractéristique. Cela permet aux développeurs d'utiliser jQuery avec d'autres bibliothèques qui utilisent l'option $
espace de noms global. Et si l'une de ces bibliothèques supprime certains éléments ? Même problème. J'ai l'impression que le développeur qui a besoin d'utiliser une bibliothèque comme Prototypejs
à côté de jQuery ne connaît probablement pas assez JavaScript pour prendre de bonnes décisions de conception, et sera sujet à un problème tel que je l'ai décrit.
En ce qui concerne les améliorations dans le cadre de la philosophie de la bibliothèque, pour autant que je sache, leur philosophie est "Faire plus, écrire moins" ou quelque chose comme ça. Je pense qu'ils y parviennent très bien. Vous pouvez écrire un code très concis mais expressif qui fera une énorme quantité de travail.
Bien que ce soit une très bonne chose, d'une certaine manière, je le considère comme un point négatif. Vous pouvez faire tellement de choses, si facilement, qu'il est très facile pour les débutants d'écrire du très mauvais code. Il serait bon, je pense, qu'il y ait un "developer build" qui enregistre les avertissements de mauvaise utilisation de la bibliothèque.
Un exemple courant est l'exécution d'un sélecteur dans une boucle. La sélection DOM est très facile à faire, qu'il semble que vous pouvez simplement exécuter un sélecteur chaque fois que vous avez besoin d'un élément, même si vous avez juste exécuté ce sélecteur. Une amélioration serait, à mon avis, que le jQuery()
pour consigner les utilisations répétées d'un sélecteur et indiquer dans la console qu'un sélecteur peut être mis en cache.
Parce que jQuery est si dominant, je pense qu'il serait bon qu'ils ne se contentent pas de faciliter la tâche des programmeurs JavaScript/DOM, mais qu'ils les aident aussi à devenir meilleurs.