天天看點

前端開發日記之window.onload

大家先自己想一想已下代碼會輸出什麼?
           
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <script type="text/javascript">
        function abc(){
            var ele = document.getElementById("a");
            console.log(ele);
        }
        window.onload=abc();
        window.onload=function () {
            console.log("jmycanfly!");
        }
    </script>
</head>
<body>
    <input type="text" id="a" value="jmy" name="">
</body>
</html>
           

很奇怪吧,輸出結果為null和jmycanfly。為了說明為什麼會輸出這樣的結果我們有三個問題需要說明。window.onload,函數指派和文檔樹加載。

首先window.onload。

window.onload是一個事件,當文檔加載完成之後就會觸發該事件,可以為此事件注冊事件處理函數,并将要執行的腳本代碼放在事件處理函數中,于是就可以避免擷取不到對象的情況。

我們也可以把onload了解為window對象的一個屬性,也就是一個變量。是以window.onload隻能允許一次指派,不然後面的指派函數會覆寫掉前面的。想要多次使用,其實也是有辦法的。看下面代碼:

function _addLoadEvent(func)
{
    var oldonload=window.onload;
    if(typeof window.onload != 'function')
    {
        window.onload=func;
    }
    else
    {
        window.onload=function()
        {
            oldonload();
            func();
        }
    }
}
           

其實就是不直接将函數指派給window.onload,而是采用調用函數_addLoadEvent()。

回到我們的問題,既然window.onload會被覆寫,那為什麼會有“null”輸出呢?

其次是函數指派。看下面代碼:

var jmy = abc;//将函數abc指派給jmy
var jmy1 = abc();//将函數abc的執行結果指派給jmy1
           

那現在就好解釋了,window.onload的确被覆寫了,但它覆寫的是abc()函數執行後的傳回值,這裡的傳回值是null。

window.οnlοad=abc();//調用函數abc,然後再将abc的傳回值指派給window.onload。

最後文檔樹。

其實就是解決為什麼會輸出”null”,js代碼是放在head裡面的,會先執行,此時body還沒被加載,肯定會是null呀。

綜上所述:

1. JS檔案最好放在文檔的末尾,也就是body的末尾。

2. 用JQ架構吧,别用什麼window.onload,解決沖突聽麻煩的。

+function ($) {
        //content
    }(window.jQuery);