Depuis le site de documentation de l'API jQuery pourready
Les trois syntaxes suivantes sont équivalentes:
- $ (document) .ready (gestionnaire)
- $ (). ready (handler) (ce n'est pas recommandé)
- $ (gestionnaire)
Après avoir fait mes devoirs - lire et jouer avec le code source , je ne sais pas pourquoi
$().ready(handler)
n'est pas recommandé. Les première et troisième méthodes sont exactement les mêmes, la troisième option appelle la fonction ready sur un objet jQuery mis en cache avec document
:
rootjQuery = jQuery(document);
...
...
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );
}
Mais la fonction ready n'a aucune interaction avec le sélecteur des éléments de nœud sélectionnés, Le ready
code source:
ready: function( fn ) {
// Attach the listeners
jQuery.bindReady();
// Add the callback
readyList.add( fn );
return this;
},
Comme vous pouvez le voir, il Justs ajouter le rappel à une file d' attente interne ( readyList
) et ne change pas ou utiliser les éléments dans l'ensemble. Cela vous permet d'appeler la ready
fonction sur chaque objet jQuery.
Comme:
- sélecteur régulier :
$('a').ready(handler)
DEMO - Sélecteur absurde :
$('fdhjhjkdafdsjkjriohfjdnfj').ready(handler)
DEMO - Indéfini sélecteur:
$().ready(handler)
DEMO
Enfin ... à ma question: pourquoi $().ready(handler)
n'est pas recommandé?
la source
$.ready
par exemple) et ne pas nécessiter la construction d'un objet jQuery en premier lieu..ready()
capacité pour des éléments individuels, il ne devrait y avoir aucune raison de construire un objet jQuery.$.ready
est déjà pris par une fonction jQuery interne, recherchez le code sourceready:
.Réponses:
J'ai eu une réponse officielle de l'un des développeurs jQuery:
$().ready(fn)
fonctionne uniquement parce que$()
c'était un raccourci vers$(document)
(jQuery <1.4)Il en
$().ready(fn)
était de même pour un code lisible.Mais les gens faisaient des choses comme
$().mouseover()
et toutes sortes d'autres folies.et les gens ont dû faire
$([])
pour obtenir un objet jQuery videDonc en 1.4 nous l'avons changé donc
$()
donne un jQuery vide et nous avons juste fait le$().ready(fn)
travail pour ne pas casser beaucoup de code$().ready(fn)
est littéralement maintenant juste patché dans le noyau pour le faire fonctionner correctement pour le cas hérité.Le meilleur endroit pour la
ready
fonction est$.ready(fn)
, mais c'est une décision de conception vraiment ancienne et c'est ce que nous avons maintenant.Je lui ai demandé:
Sa réponse a été:
la source
$()
en premier lieu (aussi maladroit que ce comportement ait pu être) . D'un autre côté, vous avez raison. Ils ne sont pas toujours aussi enclins à faire des changements de rupture, comme cela a été montré lorsqu'ils ont essayé de changer.attr()
, puis ils ont fait un retour rapide quelques jours plus tard. Cela les a liés à certaines de leurs malheureuses décisions de conception au début (et à la quarantaine).$(selector[, context])
et$(html[, ownerDocument])
. En fait, vous pouvez tout aussi bien utiliserjQuery()
plutôt que$()
si avoir à savoir que cela fonctionne est le problème. Ou pourquoi même utiliser jQuery?Étant donné que les différentes options font à peu près la même chose que vous le faites remarquer, il est temps de mettre le chapeau d'écrivain de la bibliothèque et de faire des suppositions.
Peut-être que les gens de jQuery aimeraient avoir
$()
disponible pour une utilisation future (douteux car il$().ready
est documenté pour fonctionner, même s'il n'est pas recommandé; cela polluerait également la sémantique de la$
casse spéciale).Une raison beaucoup plus pratique: la deuxième version est la seule qui ne finit pas par s'emballer
document
, il est donc plus facile de casser lors de la maintenance du code. Exemple:Comparez cela avec
Lié à ce qui précède:
ready
est un phénomène dans le sens où c'est (la seule?) Méthode qui fonctionnera de la même manière, peu importe ce que l'objet jQuery enveloppe (même s'il n'enveloppe rien comme c'est le cas ici). C'est une différence majeure par rapport à la sémantique des autres méthodes jQuery, il est donc déconseillé de s'y fier à juste titre.Mise à jour: Comme le souligne le commentaire d'Esailija, du point de vue de l'ingénierie, cela
ready
devrait vraiment être une méthode statique, exactement parce que cela fonctionne comme ça.Mise à jour n ° 2: En creusant à la source, il semble qu'à un moment donné, la branche 1.4 a
$()
été modifiée pour correspondre$([])
, tandis que dans la version 1.3, elle s'est comportée comme$(document)
. Ce changement renforcerait les justifications ci-dessus.la source
$(document).ready( function(){ //your code here } );
selector = selector || document
àif(!selector) return this
.Je dirais que c'est simplement le fait que
$()
retourne un objet vide , alors que ce$(document)
n'est pas le cas de votre applicationready()
à des choses différentes; cela fonctionne toujours, mais je dirais que ce n'est pas intuitif.la source
$()
.ready
parce que c'est un idiome bien établi de ne pas le faire. Bien sûr, il y a une chance théorique que quelqu'un fasse cela, mais je n'ai jamais vu de code faire cela (ce qui n'est pas un bon argument mais vous savez: D).Plus que probablement, il ne s'agit que d'un bogue de documentation et devrait être corrigé, le seul inconvénient de l'utilisation
$().ready(handler)
est sa lisibilité. Bien sûr, soutenez que$(handler)
c'est tout aussi illisible. Je suis d'accord, c'est pourquoi je ne l'utilise pas .Vous pouvez également affirmer qu'une méthode est plus rapide qu'une autre. Cependant, à quelle fréquence appelez-vous cette méthode suffisamment de fois de suite sur une seule page pour remarquer une différence?
En fin de compte, cela dépend de vos préférences personnelles. Il n'y a aucun inconvénient à utiliser
$().ready(handler)
autre que l'argument de lisibilité. Je pense que la documentation manque de précision dans ce cas.la source
Juste pour rendre évident qu'il y a une certaine incohérence dans les trois, j'ai ajouté le quatrième formulaire souvent utilisé:
(function($) {}(jQuery));
Avec ce balisage:
et ce code:
Les résultats affichés du div de la dernière instruction sont: 0: 9: 9: 9: undefined
SO, seules les versions Handler et Doc sont cohérentes avec la convention jQuery de renvoyer quelque chose d'utile lorsqu'ils obtiennent le sélecteur de document et avec le formulaire Passed, vous devez retourner quelque chose (je ne le ferais pas je pense, mais mettez-le simplement pour montrer "à l'intérieur" il y a quelque chose).
En voici une version violon pour les curieux: http://jsfiddle.net/az85G/
la source
null
donc de.find('*').length
retour 0 . Trouvez-vous quelque chose de mauvais avec ce comportement (évident)?if(!selector) return this
si vous donnez autre chose, il y aregex
et d'autres choses qui se passent ... Merci pour vos aimables paroles ... Je pense que je pourrais demander à l'équipe jQuery de répondez à ceci (bon sang, ce n'est pas ma bibliothèque:-)
).jQuery(document).ready(function(){});
formulaire dans notre base de code pour le moment car il existe différents niveaux d'expertise jQuery et il est "le plus évident" pour les nouveaux venus que c'est une fonction de gestionnaire d'événements pour jQuery.Je pense que c'est vraiment plus pour la lisibilité qu'autre chose.
Celui-ci n'est pas aussi expressif
comme
Peut-être essaient-ils de promouvoir une forme de jQuery idiomatique.
la source
$(document).ready(handler)
est plus lisible que$(handler)
ce qui est recommandé ...