大家先自己想一想已下代碼會輸出什麼?
<!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);