Saya menggunakan JavaScript dengan pustaka jQuery untuk memanipulasi gambar mini gambar yang terdapat dalam daftar tidak berurutan. Ketika gambar dimuat itu melakukan satu hal, ketika kesalahan terjadi itu melakukan sesuatu yang lain. Saya menggunakan jQuery load()
dan error()
metode sebagai acara. Setelah peristiwa ini, saya memeriksa elemen DOM gambar untuk .complete untuk memastikan gambar belum dimuat sebelum jQuery bisa mendaftarkan acara.
Ini berfungsi dengan benar kecuali ketika kesalahan terjadi sebelum jQuery dapat mendaftarkan acara. Satu-satunya solusi yang dapat saya pikirkan adalah dengan menggunakan onerror
atribut img untuk menyimpan "flag" di suatu tempat secara global (atau pada node itu sendiri) yang mengatakan itu gagal sehingga jQuery dapat memeriksa "store / node" itu ketika memeriksa .complete.
Adakah yang punya solusi yang lebih baik?
Sunting: Poin utama yang dicetak tebal dan menambahkan detail ekstra di bawah: Saya memeriksa apakah gambar sudah selesai (alias dimuat) SETELAH saya menambahkan acara memuat dan kesalahan pada gambar. Dengan begitu, jika gambar dimuat sebelum acara didaftarkan, saya akan tetap tahu. Jika gambar tidak dimuat setelah acara maka acara akan mengurusnya ketika itu terjadi. Masalahnya adalah, saya dapat dengan mudah memeriksa apakah suatu gambar sudah dimuat, tetapi saya tidak bisa memastikan apakah ada kesalahan yang terjadi.
sumber
Jawaban:
Pilihan lain adalah untuk memicu
onload
dan / atauonerror
peristiwa dengan membuat elemen gambar dalam memori dan mengatursrc
atributnya kesrc
atribut asli dari gambar asli. Berikut ini contoh yang saya maksud:Semoga ini membantu!
sumber
.attr
baris setelah itu.load
dan.error
garis. Kalau tidak, Anda berisiko bahwa gambar mungkin memuat (atau menemukan kesalahan) sebelum panggilan balik itu ditambahkan, dan mereka tidak akan dipanggil..load()
dan.error()
membingungkan dan sekarang ditinggalkan, menggunakan.on()
dan menggunakanload
danerror
sebagai acara.Periksa
complete
dannaturalWidth
properti, dalam urutan itu.https://stereochro.me/ideas/detecting-broken-images-js
sumber
Berdasarkan pemahaman saya tentang Spesifikasi HTML W3C untuk
img
elemen , Anda harus dapat melakukan ini menggunakan kombinasi atributcomplete
dannaturalHeight
, seperti:Dari spec untuk
complete
atribut:Jadi pada dasarnya,
complete
mengembalikan true jika gambar telah selesai memuat, atau gagal memuat. Karena kita hanya menginginkan case di mana gambar berhasil dimuat, kita perlu memeriksanauturalHeight
atributnya juga:Dan
available
didefinisikan seperti ini:Jadi jika gambar "rusak" (gagal dimuat), maka gambar itu akan dalam keadaan rusak, bukan keadaan yang tersedia, jadi
naturalHeight
akan menjadi 0.Karena itu, pengecekan
imgElement.complete && imgElement.naturalHeight !== 0
harus memberi tahu kami apakah gambar telah berhasil dimuat.Anda dapat membaca lebih lanjut tentang ini di Spesifikasi HTML W3C untuk
img
elemen , atau di MDN .sumber
Saya mencoba berbagai cara dan cara ini adalah satu-satunya yang berhasil untuk saya
Anda juga dapat menambahkan fungsi panggilan balik yang dipicu setelah semua gambar dimuat di DOM dan siap. Ini berlaku untuk gambar yang ditambahkan secara dinamis juga. http://jsfiddle.net/kalmarsh80/nrAPk/
sumber
Gunakan
imagesLoaded
perpustakaan javascript .Dapat digunakan dengan Javascript biasa dan sebagai plugin jQuery.
Fitur:
Sumber daya
sumber
complete
properti tampaknya tidak didukung dengan jelas: tidak dapat menemukan sumber info yang dapat dipercaya mengenai dukungan browser.complete
properti juga tampaknya tidak memiliki spesifikasi yang jelas: spesifikasi HTML5 adalah satu-satunya yang menyebutkannya & masih dalam versi konsep pada saat penulisan. Jika Anda menggunakannaturalWidth
&naturalHeight
hanya memiliki dukungan IE9 +, jadi jika Anda menggunakannya untuk mengetahui apakah gambar tersebut dimuat, Anda memerlukan beberapa trik "pintar" untuk membuatnya berfungsi di browser lama, & Anda harus memeriksa perilaku lintas-browser konsistenAmbil informasi dari elemen gambar di halaman.
Tes bekerja di Chrome dan Firefox.
Bekerja jsFiddle (buka konsol Anda untuk melihat hasilnya)
Catatan: Saya menggunakan jQuery , saya pikir ini dapat mencapai javascript penuh
Saya menemukan informasi yang bagus di sini OpenClassRoom -> ini adalah forum Perancis
sumber
Detektor jaringan waktu nyata - periksa status jaringan tanpa menyegarkan halaman: (ini bukan jquery, tetapi diuji, dan 100% berfungsi: (diuji pada Firefox v25.0))
Kode:
jika koneksi terputus cukup tekan tombol Lagi.
Pembaruan 1: Deteksi otomatis tanpa menyegarkan halaman:
sumber
Setelah membaca solusi menarik di halaman ini, saya membuat solusi yang mudah digunakan yang sangat dipengaruhi oleh pos SLaks dan Noyo yang tampaknya bekerja pada versi terbaru (saat penulisan) Chrome, IE, Firefox, Safari, dan Opera (semua di Windows). Juga, ini bekerja pada emulator iPhone / iPad yang saya gunakan.
Salah satu perbedaan utama antara solusi ini dan posting SLaks dan Noyo adalah bahwa solusi ini terutama memeriksa properti naturalWidth dan naturalHeight. Saya telah menemukan bahwa dalam versi browser saat ini, kedua properti tersebut tampaknya memberikan hasil yang paling bermanfaat dan konsisten.
Kode ini mengembalikan TRUE ketika gambar telah dimuat penuh DAN berhasil. Ini mengembalikan FALSE ketika gambar belum dimuat penuh ATAU gagal memuat.
Satu hal yang perlu Anda perhatikan adalah bahwa fungsi ini juga akan mengembalikan SALAH jika gambar tersebut adalah gambar 0x0 piksel. Tapi gambar-gambar itu sangat jarang, dan saya tidak bisa memikirkan kasus yang sangat berguna di mana Anda ingin memeriksa untuk melihat apakah gambar 0x0 piksel telah dimuat :)
Pertama kita lampirkan fungsi baru yang disebut "isLoaded" ke prototipe HTMLImageElement, sehingga fungsi tersebut dapat digunakan pada elemen gambar apa pun.
Kemudian, setiap saat kita perlu memeriksa status pemuatan gambar, kita cukup memanggil fungsi "isLoaded".
Per komentar giorgian tentang pos SLaks dan Noyo, solusi ini mungkin hanya dapat digunakan sebagai pemeriksaan satu kali pada Safari Mobile jika Anda berencana mengubah atribut SRC. Tetapi Anda dapat mengatasinya dengan membuat elemen gambar dengan atribut SRC baru alih-alih mengubah atribut SRC pada elemen gambar yang ada.
sumber
Ini adalah bagaimana saya membuatnya bekerja lintas browser menggunakan kombinasi metode di atas (saya juga perlu memasukkan gambar secara dinamis ke dalam dom):
Catatan: Anda harus menyediakan status boolean yang valid untuk variabel isIE.
sumber
// Atau Sebagai Plugin
sumber
Seperti yang saya mengerti properti .complete adalah non-standar. Ini mungkin tidak universal ... Saya melihat itu tampaknya bekerja secara berbeda di Firefox ayat IE. Saya memuat sejumlah gambar dalam javascript kemudian memeriksa apakah sudah selesai. Di Firefox, ini sepertinya bekerja dengan baik. Di IE, itu bukan karena gambar tampak memuat di utas lainnya. Ini hanya berfungsi jika saya menunda antara tugas saya ke image.src dan ketika saya memeriksa properti image.complete.
Menggunakan image.onload dan image.onerror juga tidak berfungsi untuk saya, karena saya perlu memberikan parameter untuk mengetahui gambar yang saya bicarakan ketika fungsi dipanggil. Cara apa pun yang tampaknya gagal karena sebenarnya tampaknya melewati fungsi yang sama, bukan contoh berbeda dari fungsi yang sama. Jadi nilai yang saya berikan untuk mengidentifikasi gambar selalu berakhir dengan nilai terakhir dalam loop. Saya tidak bisa memikirkan jalan keluar masalah ini.
Di Safari dan Chrome, saya melihat image.complete benar dan naturalWidth ditetapkan bahkan ketika konsol kesalahan menunjukkan 404 untuk gambar itu ... dan saya sengaja menghapus gambar itu untuk menguji ini. Tetapi hal di atas berfungsi baik untuk Firefox dan IE.
sumber
Cuplikan kode ini membantu saya memperbaiki masalah cache browser:
Saat cache browser dinonaktifkan, hanya kode ini yang tidak berfungsi:
untuk membuatnya berfungsi, Anda harus menambahkan:
sumber
Menggunakan
JavaScript
kode ini Anda dapat memeriksa gambar berhasil dimuat atau tidak.Coba ini
sumber
Saya punya banyak masalah dengan pemuatan lengkap gambar dan EventListener.
Apa pun yang saya coba, hasilnya tidak dapat diandalkan.
Tetapi kemudian saya menemukan solusinya. Secara teknis ini tidak bagus, tapi sekarang saya tidak pernah mengalami gagal memuat gambar.
Apa yang saya lakukan:
Alih-alih memuat gambar satu kali, saya hanya memuatnya langsung kedua kalinya setelah pertama kali dan keduanya berjalan melalui eventhandler.
Semua sakit kepala saya hilang!
By the way: Kalian dari stackoverflow membantu saya sudah lebih dari seratus kali. Untuk ini, terima kasih banyak!
sumber
Yang ini bekerja dengan baik untuk saya :)
sumber