【问题标题】:JS Asynchron script faild to executeJS 异步脚本执行失败
【发布时间】:2014-08-26 17:30:20
【问题描述】:

我想包含一个带有 javascript 的 adserver js 脚本并异步加载它。但是每次尝试都以警告结束,并且脚本没有被执行。

我收到以下错误消息: “在‘​​文档’上执行‘写入’失败:除非显式打开,否则无法从异步加载的外部脚本写入文档。”

我尝试了以下变体:

    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = "http://example.com/test.js";
    document.body.appendChild(script);

或者我使用了 HTML Script 属性 async

<script src="http://example.com/test.js" async></script>

但没有任何效果,因为外部脚本使用 document.write。还有其他方法可以包含此类脚本吗?

如何“显式打开”页面(“除非显式打开” - 请参阅警告)?

【问题讨论】:

    标签: javascript ads


    【解决方案1】:

    一种方法是暂时覆盖document.write,直到脚本执行完毕,然后替换原来的功能。

    var tempDocWrite = document.write;
    document.write = function(el){
        var div = document.createElement('div');
        div.innerHTML = el;
        document.body.appendChild(div)
    }
    
    var script = document.createElement('script');
    script.onload = function(){
        document.write = tempDocWrite
    }
    script.type = 'text/javascript';
    script.src = "http://example.com/test.js";
    document.body.appendChild(script);
    

    注意:上面的代码没有测试过

    【讨论】:

    • 谢谢。我得到“未捕获的 RangeError:超出最大调用堆栈大小”。顺便提一句。在第 3 行,你应该用 el 替换 msg。
    • 哦,干得好!但是根据您的代码,我还有另一个问题。请参阅 jsfiddle 示例(它不起作用,因为 jsfiddle 根本不允许 document.write,而只是用于代码格式化)jsfiddle.net/02h6ss7h。如何动态控制插入代码的位置。在您的示例中,它位于页面顶部,在我的示例中,我在函数中添加了硬编码位置,但是如果我想将脚本 1 放在 #top 和脚本 2 中,如何将其与 2 个不同的脚本一起使用在#middle?
    • @leftjustified 这听起来像是一个完全不同的问题,我建议您为此创建一个新问题。