2009-02-16 143 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和任何其他人已煮熟的黑客来玩的地方。


根据您的目标受众,您可能希望删除后备代码或者甚至独占使用它。我的投票将放弃它。