Il y a quelques bonnes raisons à cela, la "chaînabilité" est le moteur principal, la capacité d'écrire du code très laconique par chaînage ne doit pas produire d'erreurs pour fonctionner sans problème, par exemple :
$("#divMenuContainer:visible").hide("explode").add("#another").fadeIn();
Chaque objet de la chaîne, même s'il ne fait référence à aucun élément du DOM, peut en avoir d'autres ajoutés ultérieurement, ou prenons un autre exemple :
$("#divMenuContainer:visible").live("click", function() { ... });
Dans ce cas, nous ne nous soucions pas des éléments que le sélecteur a trouvés, mais du sélecteur lui-même. En voici un autre :
$("#divMenuContainer:visible").find(".child").hide("explode").end().fadeOut();
Même s'il n'y a pas d'enfants, nous pouvons vouloir revenir en arrière dans la chaîne par la suite, en continuant à utiliser l'élément .prevObject
référence pour remonter la chaîne.
Il y a des dizaines de cas distincts comme celui-ci qui montrent les avantages de la bibliothèque telle qu'elle est. Quant à la pourquoi à partir d'interviews de John Resig qui est le créateur de jQuery, il déclare que c'est comme ça que ça s'est passé. Il cherchait un code aussi concis que possible, et le modèle de chaînage est ce qui en est ressorti. Il se trouve qu'il présente également de nombreux avantages, dont l'exemple ci-dessus.
Pour être clair, je ne dis pas chaque L'attribut de l'enchaînement est bon, il y a juste beaucoup d'avantages à cela.
Prenons cette page comme exemple, et si nous avions quelque chose comme ceci :
$(".comment").click(replyToFunction);
Devrait qui échoue parce qu'il n'y a pas encore de commentaires ? Eh bien non, pas vraiment, c'est prévu, je ne voudrais pas qu'une erreur se produise ici... si l'élément existe, faites-le, sinon, ne le faites pas. Ce que je veux dire, c'est que, du moins d'après mon expérience, no Lancer une erreur à cause d'un élément manquant est énormément plus utile que d'en lancer une.
Le sélecteur dans votre question, le #ID
sélecteur est un cas très particulier où l'on ne s'attend qu'à un seul élément, donc on pourrait peut-être argumenter qu'il devrait échouer là... mais cela ne serait pas cohérent avec les autres sélecteurs, et on veut qu'une bibliothèque soit cohérente.
Avec à peu près n'importe quel autre sélecteur vous vous attendez à des éléments 0-many, donc échouer lorsque vous ne trouvez aucun élément serait nettement moins souhaitable dans la plupart des situations, et encore plus dans les cas tels que .live()
ci-dessus.
13 votes
D'accord, j'adore les questions de ce genre. "Voilà ce qui se passe quand je fais ça... pourquoi ?" est nettement plus intéressant que "C'est cassé, répare-le !".
0 votes
Si vous posez cette question sur la liste de diffusion de jquery, vous obtiendrez probablement des réponses plus informées à moins que jeresig ne soit ici :)
7 votes
@Here - Il l'est : stackoverflow.com/users/6524/john-resig
0 votes
Si vous trouvez la réponse ici, c'est formidable. Si vous la trouvez ailleurs, veuillez la mettre à jour dans cette question. Je me suis souvent demandé la même chose ! Excellente question !
1 votes
Je ne suis pas sûr. pourquoi mais je suis heureux que ce soit le cas !
0 votes
Je viens de voir un exemple où il est logique qu'aucune erreur ne soit lancée. stackoverflow.com/questions/3677913/
0 votes
Voir "jQuery est une monade" (en particulier, la section "Calculs prudents").
3 votes
C'est exactement pourquoi j'ai écrit ce petit script : github.com/mikeycgto/jquery.whiny.js
0 votes
@mikeycgto J'ai fait quelque chose de très similaire : stackoverflow.com/a/11028438/109561 Les gars de jQuery devraient vraiment ajouter une option à utiliser pendant le développement.