mata teras
- Gunakan Janji untuk memuatkan gambar secara asynchronously, membolehkan koleksi imej yang berbeza dimuatkan pada masa yang sama, dan melaksanakan kod selepas koleksi dimuatkan. Ini meningkatkan prestasi laman web dengan ketara dengan mengurangkan masa beban keseluruhan.
- Teknik ini melibatkan membuat preloader bersama untuk semua "kumpulan" imej (koleksi) yang beratur imej untuk dimuatkan. Preloader kemudian mula memuatkan gambar secara selari (bukan dalam urutan), mengelakkan perlu menunggu satu kumpulan selesai sebelum kumpulan seterusnya dimulakan.
- Setiap URL imej digantikan dengan janji, yang dihuraikan selepas penyemak imbas memuat imej. Anda kemudian boleh menggunakan kaedah
- untuk membuat janji untuk setiap kumpulan, yang dihuraikan selepas semua janji dalam array.
Promise.all()
Teknologi ini dapat diperbaiki lagi dengan menggunakan janji yang tertunda dan bukannya panggilan balik untuk memberitahu preloader apa yang perlu dilakukan selepas kumpulan dimuatkan. Ini membolehkan kawalan kemudian resolusi janji.
Dengan cara ini, dalam artikel ini, saya menganggap anda sudah biasa dengan konsep janji. Jika itu tidak berlaku, saya cadangkan anda membaca artikel ini.
tags
Dari sudut pandangan tag, kumpulan tidak lebih dari satu elemen (mis. Div), dengan kelas dek supaya kita dapat mencarinya, dan harta data-imej yang mengandungi pelbagai URL imej (sebagai JSON ).<div class="deck" data-images='["...", "...", "..."]'>...</div> <div class="deck" data-images='["...", "..."]'>...</div> <div class="deck" data-images='["...", "...", "...", "..."]'>...</div>
Penyediaan
Dalam JavaScript, ini - seperti yang diharapkan - agak rumit. Kami akan membina dua perkara yang berbeza: kumpulan kelas (sila letakkan ini di antara petikan yang sangat besar dan jangan pilih istilah) dan alat preloader . Kerana preloader mesti tahu semua gambar semua kumpulan untuk memuatkannya dalam urutan tertentu, ia perlu dikongsi di kalangan semua kumpulan. Kumpulan tidak boleh mempunyai preloader sendiri, jika tidak, kita akan mempunyai masalah awal: kod itu dilaksanakan secara berurutan, yang bukan apa yang kita mahu. Oleh itu, kita memerlukan preloader yang diluluskan kepada setiap kumpulan. Yang terakhir menambah imejnya ke barisan preloader, dan apabila semua kumpulan menambah item mereka ke barisan, preloader boleh memulakan preloading. Coretan pelaksanaan kod adalah seperti berikut:
// 实例化一个预加载器 var ip = new ImagePreloader(); // 从DOM获取所有组 var decks = document.querySelectorAll('.deck'); // 遍历它们并为每个组实例化一个新的组,将预加载器传递给每个组,以便组可以将它的图片添加到队列中 Array.prototype.slice.call(decks).forEach(function (deck) { new Deck(deck, ip); }); // 一旦所有组都将它们的项目添加到队列中,就预加载所有内容 ip.preload();
Saya harap setakat ini, ini masuk akal!
Build Group
Bergantung pada apa yang anda mahu lakukan dengan kumpulan, "kelas" ini mungkin agak lama. Untuk senario kami, satu -satunya perkara yang perlu kita lakukan ialah menambah kelas yang dimuatkan ke nod selepas imejnya dimuatkan. Tidak banyak kerja yang perlu dilakukan dalam fungsi dek: 1. Muatkan data (dari harta data); dimuatkan.
var Deck = function (node, preloader) { // 我们从`data-images`属性获取并解析数据 var data = JSON.parse(node.getAttribute('data-images')); // 我们调用预加载器的`queue`方法,将数据和回调函数传递给它 preloader.queue(data, function () { node.classList.add('loaded'); }); };
Setakat ini, ia berjalan lancar, bukan? Satu -satunya perkara yang tersisa adalah preloader, walaupun ia juga merupakan bahagian yang paling kompleks dalam kod dalam artikel ini.
Bina preloader
Kami sudah tahu bahawa preloader kami memerlukan kaedah giliran untuk menambah koleksi imej ke barisan, dan kaedah preload untuk memulakan preload. Ia juga memerlukan fungsi penolong untuk memelihara imej, yang dipanggil preloadimage. Mari mulakan di sini:
var ImagePreloader = function () { ... }; ImagePreloader.prototype.queue = function () { ... } ImagePreloader.prototype.preloadImage = function () { ... } ImagePreloader.prototype.preload = function () { ... }
Preloader memerlukan harta giliran dalaman untuk memegang kumpulan yang mesti dipredikasikan, dan panggilan balik masing -masing.
var ImagePreloader = function () { this.items = []; }
item adalah pelbagai objek, di mana setiap objek mempunyai dua kunci: - Koleksi mengandungi pelbagai URL imej yang akan dimuatkan;
Dengan ini, kita boleh menulis kaedah giliran.
<div class="deck" data-images='["...", "...", "..."]'>...</div> <div class="deck" data-images='["...", "..."]'>...</div> <div class="deck" data-images='["...", "...", "...", "..."]'>...</div>
Baiklah. Pada ketika ini, setiap kumpulan boleh menambah imejnya ke barisan. Kami kini perlu membina kaedah preload, yang akan bertanggungjawab untuk pramuat imej sebenar. Tetapi sebelum melompat ke kod, mari kita mundur untuk memahami apa yang perlu kita lakukan. Idea kami bukanlah untuk memuatkan semua gambar setiap kumpulan satu demi satu. Idea kami adalah untuk memuatkan imej pertama setiap kumpulan, maka imej kedua, kemudian imej ketiga, dan sebagainya. Preload Imej bermaksud membuat imej baru menggunakan JavaScript (menggunakan imej baru ()) dan memohon SRC kepadanya. Ini akan mendorong penyemak imbas untuk memuatkan sumber secara asynchronously. Oleh kerana proses tak segerak ini, kita perlu mendaftarkan janji, yang dihuraikan selepas penyemak imbas memuat turun sumber. Pada asasnya, kami akan menggantikan setiap URL imej dalam array kami dengan janji bahawa parses selepas penyemak imbas memuat imej yang diberikan. Pada ketika ini, kita akan dapat menggunakan janji. Semua (..) untuk mendapatkan janji akhir yang dihuraikan selepas semua janji dalam array. Ini benar untuk setiap kumpulan. Mari kita mulakan dengan kaedah preloadimage:
// 实例化一个预加载器 var ip = new ImagePreloader(); // 从DOM获取所有组 var decks = document.querySelectorAll('.deck'); // 遍历它们并为每个组实例化一个新的组,将预加载器传递给每个组,以便组可以将它的图片添加到队列中 Array.prototype.slice.call(decks).forEach(function (deck) { new Deck(deck, ip); }); // 一旦所有组都将它们的项目添加到队列中,就预加载所有内容 ip.preload();
sekarang adalah kaedah preload. Ia melakukan dua perkara (jadi mungkin dapat dibahagikan kepada dua fungsi yang berbeza, tetapi itu tidak dalam skop artikel ini): 1. Ia dalam urutan tertentu (imej pertama setiap kumpulan, kemudian yang kedua, kemudian di sana adalah yang ketiga ...) menggantikan semua URL imej dengan janji; untuk setiap kumpulan, ia mendaftarkan janji, dan memanggil panggilan balik kumpulan selepas semua janji dalam kumpulan itu dihuraikan (!).
var Deck = function (node, preloader) { // 我们从`data-images`属性获取并解析数据 var data = JSON.parse(node.getAttribute('data-images')); // 我们调用预加载器的`queue`方法,将数据和回调函数传递给它 preloader.queue(data, function () { node.classList.add('loaded'); }); };
itu sahaja! Lagipun, itu tidak rumit, adakah anda bersetuju?
lebih banyak promosi
Kod ini berfungsi dengan baik, walaupun menggunakan panggil balik untuk memberitahu preloader apa yang perlu dilakukan selepas kumpulan dimuatkan tidak begitu elegan. Anda mungkin mahu menggunakan Janji dan bukannya panggilan balik, terutamanya jika kami menggunakan Janji! Saya tidak pasti bagaimana menyelesaikan masalah ini, jadi saya harus mengakui bahawa saya bertanya kepada rakan saya Valérian Galliat untuk membantu saya menghadapi masalah ini. Apa yang kita gunakan di sini ialah Janji Kelewatan . Janji yang ditangguhkan bukanlah sebahagian daripada API Janji Asli, jadi kita perlu menambah polyfills kepadanya; Pada asasnya, janji yang tertunda adalah janji yang boleh dihuraikan kemudian. Memohon kepada kod kami hanya akan berubah sedikit. Pertama ialah kaedah .queue(..)
:
var ImagePreloader = function () { ... }; ImagePreloader.prototype.queue = function () { ... } ImagePreloader.prototype.preloadImage = function () { ... } ImagePreloader.prototype.preload = function () { ... }Analisis dalam kaedah
.preload(..)
:
var ImagePreloader = function () { this.items = []; }
Sudah tentu, pada akhirnya, bagaimana kita menambah data ke barisan!
// 如果没有指定回调,则为空函数 function noop() {} ImagePreloader.prototype.queue = function (array, callback) { this.items.push({ collection: array, // 如果没有回调,我们推送一个no-op(空)函数 callback: callback || noop }); };
Kami sudah selesai! Jika anda ingin melihat bagaimana kod itu sebenarnya berjalan, periksa demo di bawah: (pautan demo codepen harus dimasukkan di sini, kerana saya tidak dapat membenamkan codepen secara langsung)
Kesimpulan
Baiklah, kawan -kawan. Dengan kira -kira 70 baris kod JavaScript, kami berjaya memuatkan gambar dalam koleksi yang berbeza secara asynchronously dan melaksanakan beberapa kod selepas koleksi dimuatkan. Dari sini, terdapat banyak perkara yang boleh kita lakukan. Dalam contoh saya, tumpuannya adalah untuk menjalankan imej ini sebagai urutan gelung cepat (gaya GIF) apabila butang diklik. Oleh itu, saya melumpuhkan butang semasa memuatkan dan mengaktifkannya semula selepas kumpulan itu selesai memaksimumkan semua gambar. Oleh kerana penyemak imbas sudah cache semua imej, gelung pertama berjalan dengan lancar. Saya harap anda menyukainya! Anda boleh melihat kod di GitHub atau menggunakannya secara langsung pada Codepen. (Pautan github dan pautan codepen hendaklah dimasukkan di sini)
(bahagian Soalan Lazim harus ditambah di sini, yang konsisten dengan bahagian FAQ dalam teks input, tetapi beberapa pelarasan dan pengilat telah dibuat dalam ungkapan bahasa.)
Atas ialah kandungan terperinci Imej preloading selari dengan janji. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Aplikasi JavaScript di dunia nyata termasuk pembangunan depan dan back-end. 1) Memaparkan aplikasi front-end dengan membina aplikasi senarai TODO, yang melibatkan operasi DOM dan pemprosesan acara. 2) Membina Restfulapi melalui Node.js dan menyatakan untuk menunjukkan aplikasi back-end.

Penggunaan utama JavaScript dalam pembangunan web termasuk interaksi klien, pengesahan bentuk dan komunikasi tak segerak. 1) kemas kini kandungan dinamik dan interaksi pengguna melalui operasi DOM; 2) pengesahan pelanggan dijalankan sebelum pengguna mengemukakan data untuk meningkatkan pengalaman pengguna; 3) Komunikasi yang tidak bersesuaian dengan pelayan dicapai melalui teknologi Ajax.

Memahami bagaimana enjin JavaScript berfungsi secara dalaman adalah penting kepada pemaju kerana ia membantu menulis kod yang lebih cekap dan memahami kesesakan prestasi dan strategi pengoptimuman. 1) aliran kerja enjin termasuk tiga peringkat: parsing, penyusun dan pelaksanaan; 2) Semasa proses pelaksanaan, enjin akan melakukan pengoptimuman dinamik, seperti cache dalam talian dan kelas tersembunyi; 3) Amalan terbaik termasuk mengelakkan pembolehubah global, mengoptimumkan gelung, menggunakan const dan membiarkan, dan mengelakkan penggunaan penutupan yang berlebihan.

Python lebih sesuai untuk pemula, dengan lengkung pembelajaran yang lancar dan sintaks ringkas; JavaScript sesuai untuk pembangunan front-end, dengan lengkung pembelajaran yang curam dan sintaks yang fleksibel. 1. Sintaks Python adalah intuitif dan sesuai untuk sains data dan pembangunan back-end. 2. JavaScript adalah fleksibel dan digunakan secara meluas dalam pengaturcaraan depan dan pelayan.

Python dan JavaScript mempunyai kelebihan dan kekurangan mereka sendiri dari segi komuniti, perpustakaan dan sumber. 1) Komuniti Python mesra dan sesuai untuk pemula, tetapi sumber pembangunan depan tidak kaya dengan JavaScript. 2) Python berkuasa dalam bidang sains data dan perpustakaan pembelajaran mesin, sementara JavaScript lebih baik dalam perpustakaan pembangunan dan kerangka pembangunan depan. 3) Kedua -duanya mempunyai sumber pembelajaran yang kaya, tetapi Python sesuai untuk memulakan dengan dokumen rasmi, sementara JavaScript lebih baik dengan MDNWebDocs. Pilihan harus berdasarkan keperluan projek dan kepentingan peribadi.

Peralihan dari C/C ke JavaScript memerlukan menyesuaikan diri dengan menaip dinamik, pengumpulan sampah dan pengaturcaraan asynchronous. 1) C/C adalah bahasa yang ditaip secara statik yang memerlukan pengurusan memori manual, manakala JavaScript ditaip secara dinamik dan pengumpulan sampah diproses secara automatik. 2) C/C perlu dikumpulkan ke dalam kod mesin, manakala JavaScript adalah bahasa yang ditafsirkan. 3) JavaScript memperkenalkan konsep seperti penutupan, rantaian prototaip dan janji, yang meningkatkan keupayaan pengaturcaraan fleksibiliti dan asynchronous.

Enjin JavaScript yang berbeza mempunyai kesan yang berbeza apabila menguraikan dan melaksanakan kod JavaScript, kerana prinsip pelaksanaan dan strategi pengoptimuman setiap enjin berbeza. 1. Analisis leksikal: Menukar kod sumber ke dalam unit leksikal. 2. Analisis Tatabahasa: Menjana pokok sintaks abstrak. 3. Pengoptimuman dan Penyusunan: Menjana kod mesin melalui pengkompil JIT. 4. Jalankan: Jalankan kod mesin. Enjin V8 mengoptimumkan melalui kompilasi segera dan kelas tersembunyi, Spidermonkey menggunakan sistem kesimpulan jenis, menghasilkan prestasi prestasi yang berbeza pada kod yang sama.

Aplikasi JavaScript di dunia nyata termasuk pengaturcaraan sisi pelayan, pembangunan aplikasi mudah alih dan Internet of Things Control: 1. Pengaturcaraan sisi pelayan direalisasikan melalui node.js, sesuai untuk pemprosesan permintaan serentak yang tinggi. 2. Pembangunan aplikasi mudah alih dijalankan melalui reaktnatif dan menyokong penggunaan silang platform. 3. Digunakan untuk kawalan peranti IoT melalui Perpustakaan Johnny-Five, sesuai untuk interaksi perkakasan.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

SublimeText3 Linux versi baharu
SublimeText3 Linux versi terkini

Dreamweaver Mac版
Alat pembangunan web visual

ZendStudio 13.5.1 Mac
Persekitaran pembangunan bersepadu PHP yang berkuasa

SecLists
SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)