window.onload


 

<button class="btn"  onclick="fn()">按鈕</button>
      window.onload=function(){
                //觸發不了 fn未定義  fn is not defined
                //var btn=document.getElementsByClassName('btn')[0];
                //function fn(){
                //        alert('666')
                //}
            }
                //可以觸發
                function fn(){
                        alert('666')
                }

為什么會這樣呢?window.onload事件難道不是在頁面加載完時候就去執行嗎?

沒錯,我們來理一下其中的思路。

首先,window.onload事件是在整個頁面包括dom結構、圖片等等全部加載完成之后才會觸發。

其次,HTML加載時由上往下的,在HTML加載的時候,遇到function關鍵字,聲明一個函數的時候,就會在內存中開辟一個新的空間來對函數進行存儲,方便以后進行調用。

所以,當將function f()寫到window.onload()=function(){}內部的時候,需要整個頁面加載完成的之后,才聲明這個函數,

也就意味着,當HTML加載到onclick="f()"的時候,window.onload=function(){}里面的函數f還沒有被聲明,這時候內存中就找不到function f(),於是就會報錯。

那么,將function f()移到window.onload()=function(){}外,則HTML加載到<head></head>的時候就會聲明函數f了,

所以進行onclick綁定的時候就能夠在內存中找到f()並進行調用。

除了這是涉及HTML加載順序的問題,還有一點就是可以從函數作用域這方面去考慮。

寫在window.onload()=function(){}內部的function f()就是在一個匿名函數內部的局部函數,並不是全局函數,所以onclick="f()"調用的時候是調用不到的。

但是如果你在第一段代碼中,function f()函數后面加上obj.onclick = f;那程序就又能正常運行了。

這是因為直接將函數f綁定給obj對象點擊事件上了,所以就不在window.onload()=function(){}的作用域下,就可以成功調用該函數了!

提到window.onload事件,補充說明一下它與jquery中的$(document).ready()的區別:

$(document).ready()是在DOM結構繪制完畢之后就執行內部的語句了,不用像window.onload一樣,需要等到全部元素都加載完畢才執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM