jQuery ready vs load

在使用Javascript操作HTML DOM時,記得要養成網頁載入後才動手的好習慣,不然會有可怕的事發生… (可參考邊做邊學 jQeury 系列 3-jQuery 常用的 Javascript 技巧教學影片,在5分02秒的示範)

在jQuery中,要做到"等網頁載入後再執行",我們有兩種選擇:

$(document).ready(fn)$(window).load(fn)

二者的差別在於$(document).ready(fn)發生在"網頁本身的HTML"載入後就觸發,而$(window).load(fn)則會等到"網頁HTML標籤中引用的圖檔、內嵌物件(如Flash)、IFrame"等拉哩拉雜的東西都載入後才會觸發。

我寫了一段示範程式突顯二者的區別。由於Sky_angmap_4.jpg是一張1.2MB的大型圖檔,實際執行時,可以觀察到 “ready event!” –> 圖檔緩慢顯現 -> "load event!”的過程。(嫌下載時間太短,差別不夠明顯的話,可以試試Sky_angmap_7.jpg,XD)

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript"
     src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js">
</
script>
    <script type="text/javascript">
        $(function() {
            alert("ready event!");
        });
        $(window).load(function() {
            alert("load event!");
        });
    </script>
</head>
<body>
<img src="http://blender-archi.tuxfamily.org/images/Sky_angmap_4.jpg" />
</body>
</html>

一般來說,等網頁全部元素都載入才執行程式時機有點晚,因為在此之前,使用者已經可以點選操作網頁,跳脫我們程式的掌控範圍。因此,我們幾乎都是將程式放在$(document).read(function() { ... })中(即$(function() { … }))。

$(window).load(fn)適合執行一些要等待圖檔或元素全部載入才可進行的動作,例如: 檢查圖檔長寬。換句話說,上回的大圖自動縮小Script可以透過$(window).load(fn)改寫得更簡單,完全不用擔心圖檔沒下載完成時的特殊處理,算是一個很好的應用範例。

    function GM_wait() {
        if(typeof unsafeWindow.jQuery == 'undefined') 
            window.setTimeout(GM_wait,100);
        else 
        { 
            $ = unsafeWindow.jQuery; 
            $(window).load(resizeHugeImage);
        }
    }
    GM_wait();
 
    // All your GM code must be inside this function
    function resizeHugeImage() {
        $("img").each(function() {
            var img = $(this);
            var w = img.width(), h = img.height();
            var longSide = (w > h ? w : h);
    //...以下省略...
歡迎推文分享:
Published 05 June 2009 09:51 AM 由 Jeffrey
Filed under:


意見

# A*lan~ said on 05 June, 2009 11:17 AM

黑大,以您對jQuery實戰經驗以及了解,有考慮出書嗎?

針對主題性或是大補帖之類的實戰文章,因為您的文字精要簡潔有趣勵志真是不可多得的良師啊!之前我學Regular Expression只看了您寫的PDF內有RE使用規則和三個簡短範例,只花一個晚上就學會了,真的是一個範例勝過千言萬語啊。只要您出書,不管內容是什麼,我一定買,您可以做個問卷嗎?問問大家的意見,預購的話可以附上您的親筆簽名嗎?

# Jeffrey said on 07 June, 2009 03:24 PM

to A*lan, 每每看到讀者支持的留言,總是讓我熱淚盈眶... @&#^$ <---不是罵髒話,是淚水滴進Keyboard秀逗了 XD

當一個兼職書籍作家需要過人的體力與毅力,還有要犠牲掉一部分生活品質、家庭幸福甚至身體健康的心理準備,縱使熱血滿懷,年屆不惑的中年人顧忌的事還挺多的,只能暫且打消念頭。但各位朋友的情義相挺,小弟點滴在心頭,由衷感激~~~

寫寫Blog或雜誌文章只需犠牲幾個清晨的睡眠,還在中年人僅存的一丁點熱血可以硬撐的範圍內,目前就只會採行這種模式與大家同樂吧!

既然提到了 "只要您出書,不管內容是什麼,我一定買" --> 真巧,要不要參考一下這個http://www.plurk.com/p/yqg38

# HowieWen said on 18 June, 2009 02:16 AM

若是需要判斷兩個iframe裡面文件的高度來設定iframe高度該怎麼做呢?小弟目前用很笨的

$("iFrame#Frame_Left").load(function()  {

           $("iFrame#Frame_Right").load(function()  {

           var LeftHeight=document.frames("Frame_Left").document.body.scrollHeight+20;

           var RightHeight=document.frames("Frame_Right").document.body.scrollHeight+20;

           if (LeftHeight>=RightHeight){

               $("iFrame#Frame_Left").height(LeftHeight);

               $("iFrame#Frame_Right").height(LeftHeight);

               }

               else{

               $("iFrame#Frame_Left").height(RightHeight);

               $("iFrame#Frame_Right").height(RightHeight);                

               }

           });  

       });

應該有很大的改進空間吧?!

# lupus said on 02 September, 2009 12:44 AM

有個疑問,如果是引用js檔,那應該是ready或者load呢?

<script language="javascript" src="xx.js"></script>

# 嵐曦 said on 20 October, 2009 08:05 PM

你好

想請教

我掛載了一個js

$("window").load(function()  {

var a = function() { ... };

});

如果想在html執行這個fn

像這樣

<a href="#" id="run" onClick="a()">123</a>

應該怎麼寫?

我這樣是錯誤的ˊˋ

# Jeffrey said on 20 October, 2009 11:09 PM

to 嵐曦, 我會寫成$(function() { $("#run").click(function() { ... }); }); 如果你一定要用onClick="a()"的話,請寫成window.a = function() { ... },或直接在$("window")上方寫成function a() { ... }

# hosting said on 25 December, 2009 11:39 PM

真的是一個範例勝過千言萬語啊

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 

請輸入以上的數字:

搜尋

Go

<June 2009>
SunMonTueWedThuFriSat
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011
 
RSS
【工商服務】

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


BlogLook Score and Rank

Syndication