Dalam esei terakhir saya, saya menganalisis pembina jQuery Terdapat kaedah prototaip init dalam objek jQuery, yang merupakan pembina sebenar Objek prototaip init mengekalkan hubungan rujukan dengan objek prototaip jQuery itu Contoh boleh memanggil kaedah prototaip jQuery secara normal, sama seperti ia adalah contoh jQuery. Mari kita lihat bagaimana init pembina di belakang tabir ditulis:
init: function( selector, context, rootjQuery ) { ... }
Anda boleh melihat bahawa kaedah ini menerima 3 parameter, dua parameter pertama diluluskan oleh kaedah jQuery
var jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context, rootjQuery ); },
Pemilih pada dasarnya boleh memasukkan sebarang nilai, tetapi tidak semua nilai bermakna Hanya tidak ditentukan, elemen DOM, rentetan, fungsi, objek jQuery dan objek JavaScript biasa Parameter ini biasanya diisi tetapi tidak ralat akan dilaporkan jika anda tidak mengisinya
Konteks boleh dihantar sebagai konteks pelaksanaan atau skop pelaksanaan, atau ia boleh dihantar dalam salah satu elemen DOM, objek jQuery dan objek JavaScript biasa
Parameter rootjQuery: objek jQuery yang mengandungi objek dokumen, digunakan apabila document.getElementById() gagal ditemui, pemilih ialah ungkapan pemilih dan tiada konteks ditentukan, dan pemilih ialah fungsi, ia sebenarnya $(dokumen).
Perkara berikut dibahagikan kepada 12 situasi dan dibincangkan satu persatu mengikut parameter yang berbeza
1.pemilih boleh ditukar kepada palsu
// Handle $(""), $(null), or $(undefined) if ( !selector ) { return this; }
Komen dalam kod sumber telah ditulis dengan sangat jelas Dalam tiga situasi ini, kembalikan terus tanpa sebarang pemprosesan
2. Pemilih parameter ialah elemen DOM
Contohnya: $(dokumen)
// Handle $(DOMElement) if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; }
Selagi ia adalah elemen dom, ia mesti mempunyai jenis nod, dan kemudian tukar nod ini menjadi elemen pertama objek jquery dan tetapkan ia kepada konteks Atribut panjang ialah atribut prototaip jQuery dan lalai kepada 0
// Panjang lalai objek jQuery ialah 0
panjang: 0,
Selepas terdapat elemen di sini, tukar atribut panjang kepada 1. Pemulangan operasi ini menjadikan hasil pelaksanaan fungsi masih menjadi objek jQuery, supaya panggilan berantai seperti $(document).each() boleh dilaksanakan. Objek akhir yang diperoleh adalah serupa dengan {0:document,context:document,length:1....}. Malah, semua situasi akhirnya akan menjadi objek dalam bentuk ini, kecuali untuk sifat dan kaedah prototaip jQuery disusun mengikut urutan dengan angka Arab, jadi kita boleh menggunakan borang $(selector)[0] dan bukannya $(selector).get(0) untuk mendapatkan objek DOM. Contohnya:
<!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. Parameter ialah rentetan khas "badan"
Memandangkan hanya terdapat satu elemen badan dalam objek dokumen, ia disenaraikan secara berasingan untuk diproses
// 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; }
Terdapat tiga syarat di sini yang mesti dipenuhi pada masa yang sama Saya tidak begitu memahami syarat kedua bahawa mesti tiada konteks Kaedah penulisan yang kelihatan seperti $('body',document) juga "diabaikan" oleh situasi ini
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] */
$(fungsi(){...})
atau
$(dokumen).sedia(fungsi(){...})
Sebenarnya, kedua-dua ini adalah sama dan memanggil kaedah yang sama DOM akan memuatkan bahagian ini dan menganalisisnya kemudian. Untuk ini kita boleh membuat kod html ujian seperti berikut:
<!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; }
Jenis keempat ialah rentetan selain daripada situasi rentetan yang disebutkan di atas Kami akan meninggalkan lebih banyak situasi dalam artikel seterusnya.
Di atas adalah keseluruhan kandungan artikel ini, saya harap anda semua menyukainya.