Rumah  >  Artikel  >  hujung hadapan web  >  Mengendalikan jQuery.noConflict()_jquery dengan mudah

Mengendalikan jQuery.noConflict()_jquery dengan mudah

WBOY
WBOYasal
2016-05-16 15:15:451144semak imbas

jQuery ialah salah satu rangka kerja bahagian hadapan yang paling banyak digunakan, dan sejumlah besar perpustakaan dan pemalam pihak ketiga dibangunkan berdasarkannya. Untuk mengelakkan pencemaran ruang nama global, jQuery menyediakan kaedah jQuery.noConflict() untuk menyelesaikan konflik berubah. Kaedah ini, tanpa ragu, sangat berkesan. Malangnya, dokumentasi rasmi jQuery tidak menerangkan kaedah ini dengan cukup jelas, dan ramai pembangun tidak tahu apa sebenarnya yang berlaku apabila mereka memanggil jQuery.noConflict(), mengakibatkan banyak masalah apabila menggunakannya. Walaupun begitu, prinsip pelaksanaan di sebalik jQuery.noConflict() masih bernilai dipelajari dan dikuasai oleh pembangun web, dan ia boleh menjadi alat yang berkuasa untuk menyelesaikan masalah seperti pencemaran ruang nama global.

Apakah peranan jQuery.noConflict()?
jQuery.noConflict() wujud untuk satu tujuan sahaja: ia membenarkan anda memuatkan berbilang contoh jQuery pada halaman yang sama, terutamanya versi jQuery yang berbeza. Anda mungkin tertanya-tanya, mengapa anda perlu memuatkan/menggunakan pelbagai versi objek jQuery yang berbeza pada satu halaman? Secara umumnya, terdapat dua situasi. Dalam kes pertama, kod perniagaan anda menggunakan versi terkini pustaka jQuery, dan pemalam pihak ketiga yang anda pilih bergantung pada versi pustaka jQuery yang lebih awal, dalam kes kedua, anda mengekalkan sistem yang sudah ada; perniagaan Atas pelbagai sebab, kod tersebut merujuk versi lama perpustakaan jQuery, dan modul anda yang baru dibangunkan menggunakan versi lain pustaka jQuery. Dalam kedua-dua kes, anda perlu menghadapi masalah konflik objek/kaedah jQuery. Nasib baik, jQuery.noConflict() membantu anda menyelesaikan masalah ini.

Apa yang berlaku apabila jQuery dimuatkan?
Apabila jQuery dirujuk/dimuatkan oleh halaman, ia dirangkumkan dalam fungsi laksana sendiri (fungsi tanpa nama Semua pembolehubah, fungsi dan objek yang disediakannya berada dalam persekitaran boleh laku di dalam fungsi tanpa nama dan tidak boleh dipanggil oleh luaran). alam sekitar. Mencegah pencemaran ruang nama global.

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

jQuery mentakrifkan dua objek global: jQuery dan $ di dalam fungsi tanpa nama, mendedahkan dirinya kepada persekitaran luaran. Pelbagai kaedah awam yang digunakan oleh pembangun diakses melalui dua objek ini, seperti jQuery.ajax(), jQuery.css(), dsb. Pada mulanya, mereka menunjuk ke objek yang sama jQuery (pembolehubah peribadi) di dalam fungsi tanpa nama, di mana pembolehubah dan fungsi peribadi di dalam fungsi tanpa nama diakses. Ini membolehkan pembolehubah peribadi dalaman dan fungsi fungsi tanpa nama masih berada dalam memori selepas ia dilaksanakan dan tidak akan dikosongkan oleh mekanisme pengumpulan sampah JavaScript.

window.jQuery = window.$ = jQuery;

Apabila jQuery dimuatkan oleh halaman, halaman semasa mungkin sudah mempunyai dua pembolehubah global jQuery dan $ (sebagai contoh, perpustakaan pihak ketiga yang lain dimuatkan dan ia juga ditakrifkan secara dalaman), yang akan menyebabkan objek Sedia ada adalah ditimpa (pencemaran ruang nama global). Untuk menyelesaikan masalah ini, jQuery secara dalaman menyimpan pembolehubah global sedia ada dan menyimpannya dalam pembolehubah peribadi _jQuery dan _$ untuk panggilan seterusnya. Oleh itu, jika objek jQuery dan $ belum wujud apabila pustaka jQuery dimuatkan pada halaman, maka _jQuery dan _$ kedua-duanya tidak ditentukan jika tidak, mereka akan menyimpan rujukan kepada jQuery dan $ (mungkin dari pihak ketiga perpustakaan yang dirujuk sebelum ini) Atau versi perpustakaan jQuery yang berbeza). Selepas itu, jQuery akan menimpa dua pembolehubah global ini dan mendedahkan dirinya kepada persekitaran luaran seperti yang diterangkan di atas. Pada ketika ini, pembolehubah global jQuery dan $ pada halaman telah menunjuk kepada perpustakaan jQuery yang baru diperkenalkan.

// Map over jQuery in case of overwrite
_jQuery = window.jQuery,

// Map over the $ in case of overwrite
_$ = window.$,

// Otherwise expose jQuery to the global object as usual
window.jQuery = window.$ = jQuery;

Kesan ajaib jQuery.noConflict()?
 Andaikan sistem yang anda uruskan sudah merujuk perpustakaan jQuery versi 1.7.0, dan anda merujuk perpustakaan jQuery versi 1.10.2 dalam fungsi yang baru ditambah. Jadi, adakah cara untuk menggunakan semula jQuery 1.7.0 atau menggunakan kedua-dua versi perpustakaan jQuery pada masa yang sama? Jawapannya ya, iaitu jQuery.noConflict(). Malah, menggunakan jQuery.noConflict(), anda boleh segera mengubah hala pembolehubah global jQuery dan $ ke objek yang dirujuk sebelum ini. Menakjubkan, bukan? Inilah sebabnya mengapa jQuery secara dalaman menyimpan objek yang dirujuk sebelum ini sebelum mendedahkan dirinya kepada dunia luar.
− jQuery.noConflict() menerima parameter Boolean pilihan, biasanya nilai lalai adalah palsu. Apakah kesan yang akan diberikan oleh parameter ini? Sebenarnya, ia sangat mudah. Jika jQuery.noConflict() atau jQuery.noConflict(false) dipanggil, hanya pembolehubah global $ akan ditetapkan semula kepada nilai rujukan sebelumnya jika jQuery.noConflict() atau jQuery.noConflict(true) dipanggil, maka pembolehubah global; $ akan ditetapkan semula kepada nilai rujukan sebelumnya, kedua-dua jQuery dan $ akan ditetapkan semula kepada nilai rujukan sebelumnya. Ini sangat penting dan disyorkan untuk diingati. Apabila anda memanggil jQuery.noConflict(false/true), ia akan mengembalikan contoh jQuery semasa Menggunakan ciri ini, kami boleh menamakan semula jQuery.

// "Renaming" jQuery
var jayquery = jQuery.noConflict( true );
// Now we can call things like jayquery.ajax(), jayquery.css(), and so on

Mari kita lihat coretan kod lain untuk menguji sama ada kita benar-benar memahami noConflict() yang ajaib



<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>