Aku ingin melakukan:
$("img").bind('load', function() {
// do stuff
});
Tetapi acara memuat tidak menyala ketika gambar diambil dari cache. Dokumen jQuery menyarankan plugin untuk memperbaikinya, tetapi tidak berfungsi
jquery
image
jquery-events
jquery-load
Tom Lehman
sumber
sumber
Jawaban:
Jika
src
sudah diatur, maka acara menembak dalam kasus di-cache, bahkan sebelum Anda terikat event handler. Untuk memperbaikinya, Anda bisa mengulang memeriksa dan memicu acara didasarkan.complete
, seperti ini:Perhatikan perubahan dari
.bind()
ke.one()
sehingga event handler tidak berjalan dua kali.sumber
setTimeout(function(){//do stuff},0)
dalam fungsi 'memuat' ... 0 memberi satu centang tambahan sistem browser (DOM) untuk memastikan bahwa semuanya diperbarui dengan benar..load()
tidak memicu acara dan memiliki 1 argumen yang diperlukan, gunakan.trigger("load")
bukanDapatkah saya menyarankan Anda memuatnya kembali ke objek gambar non-DOM? Jika di-cache, ini tidak akan memakan waktu sama sekali, dan muatannya masih akan menyala. Jika tidak di-cache, itu akan mem-onload ketika gambar dimuat, yang harus menjadi waktu yang sama dengan versi DOM dari gambar selesai memuat.
Javascript:
Diperbarui (untuk menangani beberapa gambar dan dengan lampiran yang dipesan dengan benar):
sumber
load
pawang sebelum ditambahkan, juga ini tidak akan berfungsi tetapi untuk satu gambar, kode OP bekerja untuk banyak :)#img
adalah ID bukan elemen pemilih :) Jugathis.src
berfungsi, tidak perlu menggunakan jQuery di mana itu tidak diperlukan :) Tapi membuat gambar lain sepertinya berlebihan dalam IMO.imageLoaded
tmp.onload = imageLoaded.bind(this)
Solusi sederhana saya, tidak memerlukan plugin eksternal dan untuk kasus umum seharusnya sudah cukup:
gunakan seperti ini:
misalnya, untuk memudar pada gambar Anda saat memuat yang dapat Anda lakukan:
Atau sebagai alternatif, jika Anda lebih suka pendekatan seperti plugin jquery:
dan gunakan dengan cara ini:
sebagai contoh:
sumber
width
,max-height
dan tinggalkanheight:auto
, seringkali perlu mengatur lebar dan tinggi hanya jika Anda perlu meregangkan gambar; untuk solusi yang lebih kuat saya akan menggunakan plugin seperti ImagesLoadedApakah Anda benar-benar harus melakukannya dengan jQuery? Anda dapat melampirkan
onload
acara langsung ke gambar Anda juga;Itu akan menyala setiap kali gambar telah dimuat, dari cache atau tidak.
sumber
onload
handler menyala ketika gambar diambil untuk kedua kalinya dari cache?Anda juga dapat menggunakan kode ini dengan dukungan untuk memuat kesalahan:
sumber
load
handler terlebih dahulu dan kemudian memanggilnya nanti dalameach
fungsinya.Saya sendiri hanya mengalami masalah ini, mencari di mana-mana solusi yang tidak melibatkan mematikan cache atau mengunduh plugin.
Saya tidak melihat utas ini segera jadi saya menemukan sesuatu yang bukan perbaikan yang menarik dan (saya pikir) layak untuk diposkan di sini:
Saya sebenarnya mendapat ide ini dari komentar di sini: http://www.witheringtree.com/2009/05/image-load-event-binding-with-ie-using-jquery/
Saya tidak tahu mengapa ini bekerja tetapi saya telah menguji ini pada IE7 dan di mana ia rusak sebelum sekarang bekerja.
Semoga ini bisa membantu,
Edit
Jawaban yang diterima sebenarnya menjelaskan mengapa:
sumber
$image.load(function(){ something(); }).attr('src', $image.attr('src'));
mereset sumber aslinya.Dengan menggunakan jQuery untuk menghasilkan gambar baru dengan src gambar, dan menetapkan metode pemuatan langsung untuk itu, metode pemuatan berhasil dipanggil ketika jQuery selesai menghasilkan gambar baru. Ini berfungsi untuk saya di IE 8, 9 dan 10
sumber
Solusi yang saya temukan https://bugs.chromium.org/p/chromium/issues/detail?id=7731#c12 (Kode ini diambil langsung dari komentar)
sumber
Modifikasi pada contoh GUS:
Atur sumber sebelum dan sesudah onload.
sumber
src
sebelum memasangonload
handler, setelah itu sudah cukup.Cukup tambahkan kembali argumen src pada baris yang terpisah setelah img oject didefinisikan. Ini akan menipu IE untuk memicu event-lad. Ini jelek, tapi ini solusi paling sederhana yang saya temukan sejauh ini.
sumber
Saya bisa memberi Anda sedikit tip jika Anda ingin melakukan ini:
Jika Anda melakukan itu ketika peramban menyimpan gambar, tidak masalah selalu ditampilkan tetapi memuat gambar di bawah gambar asli.
sumber
Saya punya masalah dengan IE ini dimana e.target.width akan tidak terdefinisi. Acara memuat akan menyala tetapi saya tidak bisa mendapatkan dimensi gambar di IE (chrome + FF berfungsi).
Ternyata Anda perlu mencari e.currentTarget.naturalWidth & e.currentTarget.naturalHeight .
Sekali lagi, IE melakukan hal-hal dengan caranya sendiri (lebih rumit).
sumber
Anda dapat menyelesaikan masalah Anda menggunakan plugin JAIL yang juga memungkinkan Anda untuk malas memuat gambar (meningkatkan kinerja halaman) dan meneruskan panggilan balik sebagai parameter
HTML akan terlihat seperti
sumber
Jika Anda menginginkan solusi CSS murni, trik ini berfungsi sangat baik - gunakan objek transformasi. Ini juga berfungsi dengan gambar ketika di-cache atau tidak:
CSS:
HTML:
Contoh codepen
Contoh codepen KURANG
sumber