Von der jQuery API-Dokumentensite fürready
Alle drei folgenden Syntaxen sind gleichwertig:
- $ (Dokument) .ready (Handler)
- $ (). ready (Handler) (dies wird nicht empfohlen)
- $ (Handler)
Nach den Hausaufgaben - Lesen und Spielen mit dem Quellcode - habe ich keine Ahnung warum
$().ready(handler)
ist nicht zu empfehlen. Die erste und dritte Möglichkeit sind genau gleich. Die dritte Option ruft die Ready-Funktion für ein zwischengespeichertes jQuery-Objekt auf mit document
:
rootjQuery = jQuery(document);
...
...
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );
}
Die Ready-Funktion hat jedoch keine Interaktion mit dem Selektor der ausgewählten Knotenelemente. Der ready
Quellcode:
ready: function( fn ) {
// Attach the listeners
jQuery.bindReady();
// Add the callback
readyList.add( fn );
return this;
},
Wie Sie sehen können, wird der Rückruf nur zu einer internen Warteschlange ( readyList
) hinzugefügt und die Elemente in der Gruppe werden nicht geändert oder verwendet. Auf diese Weise können Sie die ready
Funktion für jedes jQuery-Objekt aufrufen .
Mögen:
- regulärer Selektor:
$('a').ready(handler)
DEMO - Nonsense- Selektor:
$('fdhjhjkdafdsjkjriohfjdnfj').ready(handler)
DEMO - Undefinierter Selektor:
$().ready(handler)
DEMO
Zum Schluss ... zu meiner Frage: Warum $().ready(handler)
wird das nicht empfohlen?
quelle
$.ready
zum Beispiel) eine statische Methode sein und nicht erst das Erstellen eines jQuery-Objekts erfordern..ready()
Funktionen für einzelne Elemente bereitzustellen , sollte es keinen Grund geben, ein jQuery-Objekt zu erstellen.$.ready
wird bereits von einer internen jQuery-Funktion übernommen, suchen Sie den Quellcode nachready:
.Antworten:
Ich habe eine offizielle Antwort von einem der jQuery-Entwickler erhalten:
$().ready(fn)
funktioniert nur, weil es$()
früher eine Verknüpfung zu$(document)
(jQuery <1.4) war.Also
$().ready(fn)
war ein lesbarer Code.Aber die Leute machten Dinge wie
$().mouseover()
und alle möglichen anderen Wahnsinns.und die Leute mussten tun
$([])
, um ein leeres jQuery-Objekt zu erhaltenAlso haben wir es in 1.4 geändert, sodass
$()
eine leere jQuery entsteht, und wir haben einfach$().ready(fn)
gearbeitet, um nicht viel Code zu beschädigen$().ready(fn)
ist jetzt buchstäblich nur im Kern gepatcht, damit es für den Legacy-Fall richtig funktioniert.Der beste Ort für die
ready
Funktion ist$.ready(fn)
, aber es ist eine wirklich alte Designentscheidung und das ist es, was wir jetzt haben.Ich fragte ihn:
Seine Antwort war:
quelle
$()
an erster Stelle (wie doof wie das Verhalten gewesen sein mag) . Auf der anderen Seite hast du recht. Sie sind nicht immer so geneigt, wichtige Änderungen vorzunehmen, wie gezeigt wurde, als sie versuchten, Änderungen vorzunehmen, und.attr()
einige Tage später schnell zurückgingen. Dies hat sie an einige ihrer unglücklichen frühen (und mittleren) Designentscheidungen gebunden.$(selector[, context])
und$(html[, ownerDocument])
. In der Tat können Sie es genauso gut verwenden,jQuery()
anstatt$()
zu wissen, ob es darum geht, zu wissen, dass es funktioniert. Oder warum überhaupt jQuery verwenden?Da die verschiedenen Optionen fast dasselbe bewirken, wie Sie hervorheben, ist es an der Zeit, den Hut des Bibliotheksschreibers aufzusetzen und einige Vermutungen anzustellen.
Vielleicht möchten die jQuery-Leute
$()
für die zukünftige Verwendung zur Verfügung haben (zweifelhaft, da$().ready
dokumentiert ist, dass es funktioniert, auch wenn es nicht empfohlen wird; es würde auch die Semantik verschmutzen,$
wenn es sich um ein spezielles Gehäuse handelt).Ein viel praktischerer Grund: Die zweite Version ist die einzige, die nicht verpackt wird
document
, sodass sie bei der Pflege des Codes leichter zu brechen ist. Beispiel:Vergleichen Sie dies mit
Im Zusammenhang mit dem oben
ready
Gesagten: Ist ein Freak in dem Sinne, dass es (die einzige?) Methode ist, die unabhängig davon, was das jQuery-Objekt umschließt, gleich funktioniert (auch wenn es nichts umschließt, wie dies hier der Fall ist). Dies ist ein wesentlicher Unterschied zur Semantik anderer jQuery-Methoden. Daher wird zu Recht davon abgeraten, sich speziell darauf zu verlassen.Update: Wie Esailijas Kommentar hervorhebt, sollte aus technischer Sicht
ready
eine statische Methode sein, gerade weil sie so funktioniert.Update Nr. 2: Das Graben an der Quelle scheint irgendwann im 1.4-Zweig
$()
geändert worden zu sein$([])
, während es sich in 1.3 so verhalten hat$(document)
. Diese Änderung würde die obigen Rechtfertigungen verstärken.quelle
$(document).ready( function(){ //your code here } );
selector = selector || document
zuif(!selector) return this
.Ich würde sagen, es ist einfach die Tatsache, dass
$()
ein leeres Objekt zurückgegeben wird, während Sie$(document)
sich nichtready()
auf verschiedene Dinge beziehen. es funktioniert immer noch, aber ich würde sagen, es ist nicht intuitiv.quelle
$()
.ready
weil es eine gut etablierte Redewendung ist, dies nicht zu tun. Sicher, es gibt eine theoretische Chance, dass jemand dies tut, aber ich habe noch nie Code gesehen, der das tut (was kein gutes Argument ist, aber Sie wissen: D).Höchstwahrscheinlich handelt es sich nur um einen Dokumentationsfehler, der behoben werden sollte. Der einzige Nachteil bei der Verwendung
$().ready(handler)
ist die Lesbarkeit. Sicher, argumentieren Sie, dass$(handler)
das genauso unlesbar ist. Ich stimme zu, deshalb benutze ich es nicht .Sie können auch argumentieren, dass eine Methode schneller ist als eine andere. Wie oft rufen Sie diese Methode jedoch oft genug hintereinander auf einer einzelnen Seite auf, um einen Unterschied festzustellen?
Letztendlich kommt es auf die persönlichen Vorlieben an. Die Verwendung eines
$().ready(handler)
anderen als des Lesbarkeitsarguments hat keinen Nachteil . Ich denke, die Dokumentation ist in diesem Fall falsch.quelle
Nur um deutlich zu machen, dass die drei inkonsistent sind, habe ich die vierte häufig verwendete Form hinzugefügt:
(function($) {}(jQuery));
Mit diesem Markup:
und dieser Code:
Die angezeigten Ergebnisse des div aus der letzten Anweisung sind: 0: 9: 9: 9: undefiniert
SO, nur die Handler- und Doc-Versionen stimmen mit der jQuery-Konvention überein, etwas Nützliches zurückzugeben, wenn sie die Dokumentauswahl erhalten, und mit dem übergebenen Formular müssen Sie etwas zurückgeben (ich würde das nicht tun, würde ich denken, aber es einfach einfügen "innen" zu zeigen hat etwas).
Hier ist eine Geigenversion davon für Neugierige: http://jsfiddle.net/az85G/
quelle
null
also.find('*').length
return 0 . Finden Sie etwas Schlechtes an diesem (offensichtlichen) Verhalten?if(!selector) return this
wenn Sie etwas anderes geben, gibt esregex
und andere Dinge, die vor sich gehen ... Danke für freundliche Worte ... Ich denke, ich könnte das jQuery-Team darum bitten Antworte darauf (verdammt, es ist nicht meine Bibliothek:-)
).jQuery(document).ready(function(){});
derzeit, das Formular in unserer Codebasis zu sehen, da es unterschiedliche Ebenen von jQuery-Fachwissen gibt und es für neue Leute "am offensichtlichsten" ist, dass es sich um eine Event-Handler-Funktion für jQuery handelt.Ich denke, das ist wirklich mehr für die Lesbarkeit als alles andere.
Dieser ist nicht so ausdrucksstark
wie
Vielleicht versuchen sie, irgendeine Form von idiomatischer jQuery zu fördern.
quelle
$(document).ready(handler)
ist lesbarer als$(handler)
empfohlen wird ...