javascript使用image.height和image.width獲取圖片寬高值為0,獲取失敗的原因
阿新 • • 發佈:2019-01-24
當我使用javascript建立一個圖片物件:
你可以使用
var image = new Image();
image.src = "apple.jpg";
我以為可以這樣獲取圖片的寬高值:
console.log("image", image); console.log("image.src", image.src); var height = image.height; console.log("image.height", height); console.log("image.naturalHeight", image.naturalHeight); var width = image.width; console.log("image.width", width); console.log("image.naturalWidth", image.naturalWidth);
在某些電腦上的谷歌瀏覽器和IE11瀏覽器上,以上程式碼工作正常。但是火狐在第一次開啟時卻報出寬高值均為0
。如果按F5重新整理頁面,火狐又能正確獲取寬高值了。按Ctrl+F5忽略快取的話,仍能復現這個問題。
這是因為火狐對於JS非同步執行非常快。當載入image.src = "apple.jpg";
時,火狐已經開始執行var height = image.height;
了。而且這與DOM無關,完全是javascript和瀏覽器的問題。
這個問題也與圖片不大相關。你可以用一個BASE64編碼的src做實驗,結論相同。
使用image.onload
避免這個問題。
image.onload = function() { console.log("image", image); console.log("image.src", image.src); var height = image.height; console.log("image.height", height); console.log("image.naturalHeight", image.naturalHeight); var width = image.width; console.log("image.width", width); console.log("image.naturalWidth", image.naturalWidth); }
你可以使用
test.html
中的程式碼來測試結果。
注意不僅僅是火狐有這個問題,Chrome和IE11都有這個問題。我在自己的電腦上執行以上程式碼,發現得到的結果與在公司電腦上執行的結果完全不同。
在我自己的電腦上,所有瀏覽器在沒有image.onload
的情況下都返回0
。谷歌瀏覽器即使在頁面和圖片都快取了的情況下也返回0
,而IE11返回0
或者正確值的情況隨機。
所以當你需要獲取圖片資訊時,記得使用事件image.onload
來保證結果正確。