2

我正在编写一个 js 脚本,人们将通过在 HTML 正文部分的标题或末尾添加一行代码来将其添加到他们的网站中。

我的问题是如何在外部 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 或任何其他库)

4

3 回答 3

4

你的最后一个else子句是什么

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)之后执行侦听器函数。问题在于- 这就是 , 和其他任何人编造出来的黑客攻击的地方。DOMContentLoadeddoScroll()deferonreadystatechange


根据您的目标受众,您可能想要删除后备代码,甚至专门使用它。我的投票赞成放弃它。

于 2009-02-16T10:21:35.757 回答
2

恐怕如果你不能使用 jQuery 或其他一些库,你需要重现它们的大量功能。原因是浏览器处理 onLoad 事件的方式不同。

推荐你下载jQuery的代码,看看documentready函数是怎么实现的。

于 2009-02-16T08:35:11.987 回答
0

onLoad事件应该在加载它所附加的元素时运行。但是有些浏览器*将此误解为“加载前”或“加载期间的某个时间”,因此确保在加载所有 html 后运行某些内容的最安全选项是在 HTML 源代码的底部添加对函数的调用,如下所示:

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

(* 至少某些版本的 Safari for Windows 我确实相信有这个问题)

于 2009-02-16T08:24:33.510 回答