【问题标题】:Is there a way to deal with slow-loading document.write scripts?有没有办法处理加载缓慢的 document.write 脚本?
【发布时间】:2012-01-09 14:18:45
【问题描述】:

来自第三方聊天网站的嵌入代码推荐嵌入代码如下:

document.write(unescape("%3Cscript src='https://site.com/script.js' type='text/javascript'%3E%3C/script%3E"));

并且外部 Javascript 本身也包含document.write 代码。这意味着传统的延迟加载策略会阻止脚本完全运行。没有延迟加载是一个问题,因为脚本有时可能需要长达 90 秒才能加载,这会阻止整个页面的 DOMReady 事件。

我可以在自己的网站上做些什么(鉴于我无法控制嵌入式脚本)来处理性能问题?如果解决方案不适用于所有浏览器,请不要介意。

【问题讨论】:

    标签: javascript html


    【解决方案1】:

    您可以做的最好的事情是把脚本标签尽可能靠近文档的末尾(在标签之前)。你可以通过这样的功能添加你的脚本:

    function loadScript(url, callback) {
            var script = document.createElement("script");
    
            script.type = "text/javascript";
    
            //callback functionality
            if (!!callback && Ext.isFunction(callback)) {
                if (script.readyState) { //IE
                    script.onreadystatechange = function() {
                        if (script.readyState === "loaded" || script.readyState === "compleate") {
                            script.onreadystatechange = null;
                            callback();
                        }
                    };
                } else { //other browsers
                    script.onload = function() {
                        callback();
                    }
                }
            }
    
            script.src = url;
            document.getElementsByTagName('head')[0].appendChild(script);
        }
    

    而不是使用

    document.write('...')
    

    【讨论】:

    • 我已经说过这行不通,因为脚本本身使用了 document.write。
    【解决方案2】:

    您可以将它放在 iframe 中 - 即使它会阻塞,它也会阻塞不同的文档。您也可以将它放在页面底部(这样它不会延迟页面),然后将生成的 HTML 在 DOM 中移动到您想要的位置 - 这是一种更危险的策略,因为它可能会搞砸聊天代码。

    【讨论】:

    • 它已经在页面底部 - 因为脚本在 document.write 中立即执行,DOMReady 事件被阻止。所以这无济于事。
    • iFrame 是一个有趣的想法,看看我能不能做点什么。
    • ahhh... 对,将脚本移动到底部有助于不延迟页面内容,但对 DOMLoad 没有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2018-11-06
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多