In meinem letzten Aufsatz habe ich den Konstruktor von jQuery analysiert. Es gibt eine Prototyp-Methode init im jQuery-Objekt, die der eigentliche Konstruktor ist. Das Prototyp-Objekt von init unterhält eine Referenzbeziehung zum Prototyp-Objekt von jQuery Die Instanz kann die Prototypmethoden von jQuery normal aufrufen, als wäre sie eine Instanz von jQuery. Werfen wir einen Blick darauf, wie der Konstruktor init hinter den Kulissen geschrieben ist:
init: function( selector, context, rootjQuery ) { ... }
Sie können sehen, dass diese Methode 3 Parameter akzeptiert, die ersten beiden Parameter werden von der jQuery-Methode übergeben
var jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context, rootjQuery ); },
Selektor kann im Prinzip jeden Wert eingeben, aber nicht alle Werte sind gültig. Nur undefinierte DOM-Elemente, Zeichenfolgen, Funktionen, jQuery-Objekte und gewöhnliche JavaScript-Objekte sind normalerweise ausgefüllt, aber nein Wenn Sie
nicht ausfüllen, wird ein Fehler gemeldetDer Kontext kann als Ausführungskontext oder Ausführungsbereich oder in einem der DOM-Elemente, jQuery-Objekte und gewöhnlichen JavaScript-Objekte übergeben werden
Parameter rootjQuery: jQuery-Objekt, das das Dokumentobjekt enthält, wird verwendet, wenn document.getElementById() nicht gefunden werden kann, der Selektor ein Selektorausdruck ist und kein Kontext angegeben ist und der Selektor eine Funktion ist, es ist tatsächlich $(document).
Das Folgende ist in 12 Situationen unterteilt und wird nacheinander nach verschiedenen Parametern besprochen
1.selector kann in false konvertiert werden
// Handle $(""), $(null), or $(undefined) if ( !selector ) { return this; }
Die Kommentare im Quellcode wurden sehr klar geschrieben. In diesen drei Situationen kehren Sie direkt ohne Verarbeitung zurück
2. Der Parameterselektor ist ein DOM-Element
Zum Beispiel: $(document)
// Handle $(DOMElement) if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; }
Solange es sich um ein DOM-Element handelt, muss es einen Knotentyp haben. Anschließend wird dieser Knoten in das erste Element des JQuery-Objekts umgewandelt und dem Kontext zugewiesen. Das Längenattribut ist das Prototypattribut von JQuery und hat standardmäßig den Wert 0
// Die Standardlänge eines jQuery-Objekts beträgt 0
Länge: 0,
Nachdem hier ein Element vorhanden ist, ändern Sie das Längenattribut auf 1. Die Rückgabe dieser Operation macht das Ergebnis der Funktionsausführung weiterhin zu einem jQuery-Objekt, sodass Kettenaufrufe wie $(document).each() implementiert werden können. Das erhaltene endgültige Objekt ähnelt {0:document,context:document,length:1...}. Tatsächlich werden alle Situationen zu Objekten in dieser Form, mit Ausnahme der jQuery-Prototypeigenschaften und -Methoden nach arabischen Ziffern geordnet, sodass wir die Form $(selector)[0] anstelle von $(selector).get(0) verwenden können, um das DOM-Objekt zu erhalten. Zum Beispiel:
<!doctype html> <html> <head> <title></title> </head> <body> <div></div> <div></div> <div></div> </body> <script src='jquery-1.7.1.js'></script> <script> console.log($('div')); /*[div, div, div, prevObject: jQuery.fn.jQuery.init[1], context: document, selector: "div", constructor: function, init: function…] 0: div 1: div 2: div context: document length: 3 prevObject: jQuery.fn.jQuery.init[1]__proto__: jQuery[0] selector: "div" . */ </script> </html>
3. Der Parameter ist die spezielle Zeichenfolge „body“
Da es in einem Dokumentobjekt nur ein Körperelement gibt, wird es separat zur Verarbeitung aufgeführt
// The body element only exists once, optimize finding it if ( selector === "body" && !context && document.body ) { this.context = document; this[0] = document.body; this.selector = selector; this.length = 1; return this; }
Hier gibt es drei Bedingungen, die gleichzeitig erfüllt sein müssen. Die zweite Bedingung, dass es keinen Kontext geben darf, ist ebenfalls nicht ganz klar von dieser Situation „ignoriert“ werden
console.log($('body',document)); /* jQuery.fn.jQuery.init[1] 0: body context: document length: 1 prevObject: jQuery.fn.jQuery.init[1] selector: "body" __proto__: jQuery[0] */
$(function(){...})
oder
$(document).ready(function(){...})
Tatsächlich sind diese beiden gleich und rufen dieselbe Methode auf. Das DOM lädt diesen Teil und analysiert ihn später. Dazu können wir einen Test-HTML-Code wie folgt erstellen:
<!doctype html> <html> <head> <title></title> <script src='jquery-1.7.1.js'></script> <script> $('body') </script> </head> <body> <div></div> <div></div> <div></div> </body> </html>
console.log(selector+context+document.body); // The body element only exists once, optimize finding it if ( selector === "body" && !context && document.body ) { this.context = document; this[0] = document.body; this.selector = selector; this.length = 1; return this; }
Der vierte Typ sind andere Zeichenfolgen als die oben genannten Zeichenfolgen. Wir werden im nächsten Artikel auf weitere Situationen eingehen.
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er gefällt Ihnen allen.