2009-02-16 159 views
1

我正在寫一個js腳本,人們通過將一行代碼添加到HTML的正文部分的頭部或末尾來添加到他們的網站。從外部js文件中加載

我的問題是如何在外部js文件上執行onload。下面的代碼是否工作?在載入文件並錯過onload事件之後它不能運行嗎?

function c_onload() { alert ('onload'); } 

if (window.attachEvent) {window.attachEvent('onload', c_onload);} 
else if (window.addEventListener) {window.addEventListener('load', c_onload, false);} 
else {document.addEventListener('load', c_onload, false);} 

(我不能使用jQuery或任何其他文庫)

+0

我知道這是一個非常老的線程,但我遇到了類似的問題,這裏的用戶幫助我解決了這個問題,而不需要任何第三方庫,即JQuery。 這是我的文章: http:// stackoverflow。com/questions/17401571/external-js-with-onload-event – 2013-07-01 12:25:38

回答

2

恐怕如果你不能使用jQuery或其他一些庫,你需要複製的方式很多功能。原因是瀏覽器以不同的方式處理onLoad事件。

我建議您下載jQuery代碼並查看documentready函數是如何實現的。

+0

+1,因爲重現jquery所做的事情本質上是OP必須做的事情 – annakata 2009-02-16 08:49:12

+0

-1:瀏覽器不會處理`onload` - 問題在於`DOMContentLoaded` – Christoph 2009-02-16 10:22:21

0

onLoad事件應該被加載它所連接的元件時運行。但是有些瀏覽器會誤解爲「beforeload」或「load time」,因此最安全的選項是確保在加載完所有html後運行,就是在HTML源代碼的底部添加一個調用函數,就像這樣:

... 
     <script type="text/javascript"> 
      c_onload(); 
     </script> 
    </body> 
</html> 

(*適用於Windows的Safari至少一些版本我beleave有這個問題)

4

你最後else -clause

else {document.addEventListener('load', c_onload, false); 

的是什麼?這是毫無用處的,恕我直言。

下應該是一個跨瀏覽器的解決方案:爲addEventListener(),然後attachEvent()它首先檢查並回落到onload = ...

function chain(f1, f2) { 
    return typeof f1 !== 'function' ? f2 : function() { 
     var r1 = f1.apply(this, arguments), 
      r2 = f2.apply(this, arguments); 
     return typeof r1 === 'undefined' ? r2 : (r1 && r2); 
    }; 
} 

function addOnloadListener(func) { 
    if(window.addEventListener) 
     window.addEventListener('load', func, false); 
    else if(window.attachEvent) 
     window.attachEvent('onload', func); 
    else window.onload = chain(window.onload, func); 
} 

此外,什麼kgiannakakis說

的原因是瀏覽器以不同的方式處理onLoad事件。

是不正確的:所有主流瀏覽器處理window.onload以同樣的方式,即監聽功能獲取外部資源後執行 - 包括你的外部腳本 - 已加載。問題在於DOMContentLoaded - 這是與doScroll(),defer,onreadystatechange和任何其他人已煮熟的黑客來玩的地方。


根據您的目標受衆,您可能希望刪除後備代碼或者甚至獨佔使用它。我的投票將放棄它。