Saya membuat plugin jQuery.
Bagaimana cara mendapatkan lebar dan tinggi gambar asli dengan Javascript di Safari?
Berikut ini berfungsi dengan Firefox 3, IE7 dan Opera 9:
var pic = $("img")
// need to remove these in of case img-element has set width and height
pic.removeAttr("width");
pic.removeAttr("height");
var pic_real_width = pic.width();
var pic_real_height = pic.height();
Tetapi di browser Webkit seperti Safari dan Google Chrome nilainya 0.
javascript
jquery
safari
google-chrome
webkit
Frank Bannister
sumber
sumber
Jawaban:
Browser Webkit mengatur properti tinggi dan lebar setelah gambar dimuat. Alih-alih menggunakan timeout, saya sarankan menggunakan event yang memuat gambar. Ini contoh singkatnya:
Untuk menghindari efek CSS pada dimensi gambar, kode di atas membuat salinan memori dalam gambar. Ini adalah solusi yang sangat cerdas yang disarankan oleh FDisk .
Anda juga dapat menggunakan atribut
naturalHeight
dannaturalWidth
HTML5.sumber
width
danheight
Anda mungkin harus juga menghapusmin-width
,min-height
,max-width
danmax-height
karena mereka juga dapat mempengaruhi dimensi gambar.window.onload
, tinggi / lebar 0 dapat dikembalikan. Bagaimanapun, saya sudah mengintegrasikan ide FDisk ke dalam solusi di atas.load()
akan dieksekusi secara tidak sinkron jadi jika Anda ingin mengakseswidth
danheight
- mereka mungkin belum ditetapkan. Alih-alih lakukan "keajaiban" dalamload()
dirinya sendiri!Gunakan atribut
naturalHeight
dannaturalWidth
dari HTML5 .Sebagai contoh:
Bekerja di IE9 +, Chrome, Firefox, Safari dan Opera ( statistik ).
sumber
Anda tidak perlu menghapus gaya dari atribut dimensi gambar atau gambar. Cukup buat elemen dengan javascript dan dapatkan lebar objek yang dibuat.
sumber
Image
objek baru , lalu melihatwidth
propertinya. Ini adalah pendekatan yang sederhana dan elegan. FDisk, Anda pilih saya. :)window.onload
, lebar 0 dapat dikembalikan.Masalah mendasarnya adalah browser WebKit (Safari dan Chrome) memuat informasi JavaScript dan CSS secara paralel. Dengan demikian, JavaScript dapat dijalankan sebelum efek gaya CSS telah dihitung, menghasilkan jawaban yang salah. Di jQuery, saya telah menemukan bahwa solusinya adalah menunggu hingga document.readyState == 'complete', .eg,
Sejauh lebar dan tinggi berjalan ... tergantung pada apa yang Anda lakukan, Anda mungkin ingin offsetWidth dan offsetHeight, yang mencakup hal-hal seperti batas dan bantalan.
sumber
$(window).load(function(){ ... });
membantu dalam kasus sayaAda banyak diskusi dalam jawaban yang diterima tentang masalah di mana
onload
acara tidak menyala jika gambar dimuat dari cache WebKit.Dalam kasus saya,
onload
kebakaran untuk gambar yang di-cache, tetapi ketinggian dan lebarnya masih 0. SederhanasetTimeout
memecahkan masalah bagi saya:Saya tidak dapat berbicara tentang mengapa
onload
acara tersebut diaktifkan bahkan ketika gambar diambil dari cache (peningkatan jQuery 1.4 / 1.5?) - tetapi jika Anda masih mengalami masalah ini, mungkin kombinasi dari jawaban saya danvar src = img.src; img.src = ""; img.src = src;
tekniknya akan kerja.(Perhatikan bahwa untuk tujuan saya, saya tidak peduli tentang dimensi yang telah ditentukan sebelumnya, baik dalam atribut gambar atau gaya CSS - tetapi Anda mungkin ingin menghapusnya, sesuai jawaban Xavi. Atau mengkloning gambar.)
sumber
ini bekerja untuk saya (safari 3.2), dengan menembak dari dalam
window.onload
acara:sumber
Anda dapat secara program mendapatkan gambar dan memeriksa dimensi menggunakan Javascript tanpa harus mengacaukan DOM sama sekali.
sumber
Bagaimana dengan
image.naturalHeight
danimage.naturalWidth
properti?Tampaknya berfungsi dengan baik kembali beberapa versi di Chrome, Safari dan Firefox, tetapi tidak sama sekali di IE8 atau bahkan IE9.
sumber
Bagaimana kami mendapatkan dimensi nyata yang benar tanpa gambar nyata yang berkedip:
Ini bekerja dengan <img class = "toreaddimensions" ...
sumber
Jquery memiliki dua properti yang disebut naturalWidth dan naturalHeight, yang dapat Anda gunakan dengan cara ini.
Di mana my-img adalah nama kelas yang digunakan untuk memilih gambar saya.
sumber
naturalWidth
(dan tinggi) adalah properti pada objek elemen gambar. developer.mozilla.org/en/docs/Web/API/HTMLImageElementSeperti yang dinyatakan sebelumnya, jawaban Xavi tidak akan berfungsi jika gambar ada di cache. Masalahnya menanggapi webkit yang tidak memecat acara pemuatan pada gambar yang di-cache, jadi jika attrs lebar / tinggi tidak diatur secara eksplisit dalam tag img, satu-satunya cara yang dapat diandalkan untuk mendapatkan gambar adalah dengan menunggu
window.load
acara dipecat.The
window.load
acara akan api selalu , sehingga aman untuk mengakses lebar / tinggi dari dan img setelah itu tanpa trik apapun.Jika Anda perlu mendapatkan ukuran gambar yang dimuat secara dinamis yang mungkin di-cache (dimuat sebelumnya), Anda dapat menggunakan metode Xavi ditambah string kueri untuk memicu penyegaran cache. The downside adalah bahwa hal itu akan menyebabkan permintaan lain ke server, untuk img yang sudah di-cache dan harus sudah tersedia. Webkit Bodoh.
ps: jika Anda sudah memiliki QueryString
img.src
, Anda harus menguraikannya dan menambahkan param tambahan untuk menghapus cache.sumber
Seperti yang dikatakan Luke Smith, pemuatan gambar berantakan . Itu tidak dapat diandalkan di semua browser. Fakta ini memberi saya rasa sakit yang luar biasa. Gambar yang di-cache tidak akan memadamkan acara sama sekali di beberapa browser, jadi mereka yang mengatakan "memuat gambar lebih baik daripada setTimeout" salah.
Solusi Luke Smith ada di sini.
Dan ada diskusi menarik tentang bagaimana kekacauan ini dapat ditangani di jQuery 1.4.
Saya telah menemukan bahwa cukup dapat diandalkan untuk mengatur lebar ke 0, kemudian menunggu properti "lengkap" menjadi kenyataan dan properti lebar menjadi lebih besar dari nol. Anda juga harus memperhatikan kesalahan.
sumber
Dari komentar Chris: http://api.jquery.com/load-event/
sumber
Situasi saya mungkin sedikit berbeda. Saya secara dinamis mengubah src gambar melalui javascript dan diperlukan untuk memastikan bahwa gambar baru berukuran proporsional agar sesuai dengan wadah tetap (di galeri foto). Saya awalnya hanya menghapus atribut lebar dan tinggi gambar setelah dimuat (melalui acara memuat gambar) dan mengatur ulang ini setelah menghitung dimensi yang diinginkan. Namun, itu tidak berfungsi di Safari dan mungkin IE (saya belum mengujinya di IE secara menyeluruh, tetapi gambarnya bahkan tidak muncul, jadi ...).
Lagi pula, Safari menyimpan dimensi gambar sebelumnya sehingga dimensi selalu satu gambar di belakang. Saya berasumsi bahwa ini ada hubungannya dengan cache. Jadi solusi paling sederhana adalah dengan hanya mengkloning gambar dan menambahkannya ke DOM (penting untuk ditambahkan ke DOM yang mendapatkan dengan dan tinggi). Berikan nilai visibilitas tersembunyi pada gambar (jangan gunakan tampilan karena tidak akan berfungsi). Setelah Anda mendapatkan dimensi, hapus klon.
Ini kode saya menggunakan jQuery:
Solusi ini berfungsi dalam hal apa pun.
sumber
Sekarang ada plugin jQuery
event.special.load
,, untuk menangani kasus-kasus di mana peristiwa pemuatan pada gambar yang di-cache tidak menyala: http://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.jssumber
Baru-baru ini saya perlu menemukan lebar dan tinggi untuk mengatur ukuran default .dialog mewakili grafik. Solusi yang saya gunakan adalah:
Bagi saya ini bekerja di FF3, Opera 10, IE 8,7,6
PS Anda mungkin menemukan beberapa solusi lagi mencari di dalam beberapa plugin seperti LightBox atau ColorBox
sumber
Untuk menambah jawaban Xavi, gitgub
Paul Irish,David Desandro, gitgub menawarkan fungsi yang disebut imagesLoaded () yang bekerja dengan prinsip yang sama, dan mengatasi masalah beberapa gambar cache peramban yang tidak mengaktifkan peristiwa .load () (dengan smart_src pintar -> data_uri -> switching original_src).Ini banyak digunakan dan diperbarui secara berkala, yang berkontribusi untuk itu menjadi solusi paling kuat untuk masalah ini, IMO.
sumber
imagesLoaded
fungsi di sini: github.com/desandro/imagesloadedIni berfungsi untuk gambar yang di-cache dan dimuat secara dinamis.
Untuk menggunakan skrip ini:
Demo: http://jsfiddle.net/9543z/2/
sumber
Saya telah melakukan beberapa fungsi utilitas pemecahan masalah, menggunakan plugin jquery imagesLoaded: https://github.com/desandro/imagesloaded
Anda dapat menggunakan ini dengan mengirimkan url, fungsi, dan konteksnya. Fungsi dilakukan setelah gambar dimuat dan mengembalikan gambar yang dibuat, lebar dan tinggi.
sumber
Jika gambar sudah digunakan, Anda sholud:
atur simulasi gambar ke awal
image.css ('lebar', 'awal'); image.css ('tinggi', 'awal');
dapatkan dimensi
var originalWidth = $ (this) .width (); var originalHeight = $ (ini) .height ();
sumber
Anda dapat menggunakan properti naturalWidth dan naturalHeight dari elemen gambar HTML. (Ini info lebih lanjut ).
Anda akan menggunakannya seperti ini:
Sepertinya ini berfungsi di semua browser kecuali pada IE dari versi 8 dan di bawah.
sumber
Saya memeriksa jawaban Dio dan itu berhasil untuk saya.
$('#image').fadeIn(10,function () {var tmpW = $(this).width(); var tmpH = $(this).height(); });
Pastikan Anda memanggil semua fungsi Anda juga. yang menangani dengan ukuran gambar dalam fungsi recaller fadeIn ().
Terima kasih untuk ini.
sumber
Saya menggunakan pendekatan yang berbeda, cukup buat panggilan Ajax ke server untuk mendapatkan ukuran gambar saat objek gambar sedang digunakan.
dan tentu saja kode sisi server:
sumber
Ini berfungsi lintas browser
dapatkan dimensi dengan menggunakan
Bersulang!
sumber
Saran lain adalah menggunakan plugin imagesLoaded .
sumber
// Kode ini membantu menampilkan gambar dengan dimensi 200 * 274
sumber
Berikut ini adalah solusi lintas peramban yang memicu peristiwa ketika gambar yang Anda pilih dimuat: http://desandro.github.io/imagesloaded/ Anda dapat melihat tinggi dan lebar dalam fungsi imagesLoaded ().
sumber
Menemukan thread ini mencoba menemukan jawaban untuk pertanyaan saya sendiri. Saya mencoba untuk mendapatkan lebar / tinggi gambar dalam fungsi SETELAH loader, dan terus menghasilkan 0. Saya merasa seperti ini yang mungkin Anda cari, meskipun, karena berfungsi untuk saya:
sumber
Lihat repositori ini di github!
Contoh yang bagus untuk memeriksa Lebar dan Tinggi menggunakan Javascript
https://github.com/AzizAK/ImageRealSize
--- Diedit diminta dari beberapa komentar ..
Kode Javascript:
dan kode HTML:
sumber
Untuk fungsi di mana Anda tidak ingin mengubah penempatan atau gambar asli.
sumber