通過自學進入了前端的行列,只知道在js中,一開頭就寫一個:
window.onload = function(){ //doing sth}
然后所有的亂七八糟的代碼全塞里面,大概知道window.onload就是等頁面全加載后再執行,具體細節不知。
今天做項目時遇到一個問題,用的是jq,簡單的道理是通過動態獲取圖片的高度(因為是手機端,寬高是自適應的),來調整圖片下面main_body的top值(因為圖片跟mian_body有需要拼接的地方),代碼如下:
$(function(){
var img_h = $(".ban").height();//ban的樣式給的是一張圖片
$(".main_body").css({"top":img_h / 1.5});
console.log(img_h);//查看讀取的高度
})
可發現,會出現獲取的圖片的高度為0的情況出現,想到可能會是圖片還未加載完畢,jq代碼就已經執行了。
於是網上查找了下$(document).ready()與$(window).load(). 發現好多好的博客文章,分享大家,感謝博主辛苦寫博分享。
http://www.jb51.net/article/59154.htm
http://www.jb51.net/article/86155.htm
簡單說:ready()方法 是針對dom結構加載完觸發,我的理解是就是標簽全部加載之后(不對請批評指正);
load()方法 是需要頁面完全加載完成才可以觸發,所謂的完全加載完,不僅僅是dom結構加載完,還需要所有的鏈接引用都加載完才可以。比如頁面中有大量圖片,必須等每一個圖片都加載完成,才叫完全加載完。
以下轉別人的文字:
------------------------------------------------------------------------------------
先說load,load事件主要就是用來代替原生的window.onload,它只能用在兩個場景下:
· window對象上。比如$(window).load(fn);。
· 帶有URL的元素(images, scripts, frames, iframes)。比如$(“img”).load(fn);。
除此之外,任何元素都沒有load事件,比如:$(document).load(fn);這是錯誤的寫法,根本不會執行。
load事件需要頁面完全加載完成才可以觸發,所謂的完全加載完,不僅僅是dom結構加載完,還需要所有的鏈接引用都加載完才可以。比如頁面中有大量圖片,必須等每一個圖片都加載完成,才叫完全加載完。
最重要的還沒說,jQuery官方文檔明確說明load事件的跨瀏覽器兼容性很差(It doesn't work consistently nor reliably cross-browser)。經過小菜測試,谷歌瀏覽器僅僅支持$(window).load(fn);,而火狐瀏覽器支持$(window).load(fn);和$(“img”).load(fn);。
所以,除非必要情況下,否則強烈不推薦使用load事件。
最后說說ready,ready事件可以加在任意元素上,比如$(window).ready(fn);、$(document).ready(fn);、$(“div”).ready(fn);等等。
ready事件不要求頁面完全加載完,只需要加載完dom結構即可觸發。
------------------------------------------------------------------------------------
於是我將原來的代碼改動如下:
$(window).load(function(){
var img_h = $(".ban").height();//ban的樣式給的是一張圖片
$(".main_body").css({"top":(img_h * 362 / 415)});
console.log(img_h);
})
試了很多次,不會出現獲取不到高度的情況了;
猜想以下的代碼也可以(未測試):
$('.ban').load(function(){
var img_h = $(".ban").height();//ban的樣式給的是一張圖片
$(".main_body").css({"top":(img_h * 362 / 415)});
console.log(img_h);
})
他人博客上說少用.load()事件,那看來獲取圖片高度盡量少用,以后再研究這些情況。
document與window的細節還需要深研究。為自己加油
