Javascript Can';如果使用document.write,则不能以编程方式插入js

Javascript Can';如果使用document.write,则不能以编程方式插入js,javascript,jquery,include,javascript-injection,Javascript,Jquery,Include,Javascript Injection,我正在尝试使用jquery和类似的工具以编程方式插入js文件: var script = document.createElement( 'script' ); script.type = 'text/javascript'; script.src = 'http://someurl/test.js'; $('body').append(script); 它工作正常,如果test.js包含一个警报或一些简单代码,它工作正常,但是如果test.js文件包含document.write,并且包含j

我正在尝试使用jquery和类似的工具以编程方式插入js文件:

var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.src = 'http://someurl/test.js';
$('body').append(script);
它工作正常,如果test.js包含一个
警报
或一些简单代码,它工作正常,但是如果test.js文件包含
document.write
,并且包含js的文件托管在test.js以外的另一个域(或localhost),则不会发生任何事情,firebug显示错误:

从异步加载的外部文件调用document.write() 脚本被忽略

如果test.js和包含它的文件托管在同一个域中,那么在chrome上它仍然无法工作,但在firefox上,
文档执行得很好。write
页面将永远处于“加载”状态,并且嗅探器将请求显示给所有处于“挂起”状态的文件


我还可以尝试其他哪些方法以编程方式包含js文件?Document.write仅用于加载html时的同步任务(这是第一次),而不用于您尝试执行的异步任务。

使用
innerHTML
而不是使用
Document,write

并使用以下代码注册脚本

(function() {
    var jq = document.createElement('script');
    jq.type = 'text/javascript';
    jq.async = true;
    jq.src = 'http://someurl/test.js';
    var s = document.body.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(jq, s);
})();

插入JavaScript的方法没有任何问题<代码>文档。写有点糟糕。它只用于同步任务,因此将
document.write
放在单独的脚本文件中会带来麻烦。不管怎样,人们都会这样做。我经常看到的解决方案是重写
文档。编写

您要做的是在HEAD元素中动态插入
DOM元素。我有这个剧本。举个例子,这是一个比赛条件,但你明白了。使用URL调用
load_js
。许多现代API都是这样做的,它是跨域JavaScript的最佳朋友

<html>
    <head>
        <script>
            var load_js = function(data, callback)
            {
                    var head = document.getElementsByTagName("head")[0];

                    var script = document.createElement("script");
                    script.type = "text/javascript";
                    script.src = data;
                    head.appendChild(script);

                    if(callback != undefined)
                            callback();
            }

            load_js("http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js");

            setTimeout(function() {
                $('body').html('loaded');
            }, 1000);
        </script>
    </head>

    <body></body>
</html>

var load_js=函数(数据,回调)
{
var head=document.getElementsByTagName(“head”)[0];
var script=document.createElement(“脚本”);
script.type=“text/javascript”;
script.src=数据;
head.appendChild(脚本);
如果(回调!=未定义)
回调();
}
加载_js(“http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js");
setTimeout(函数(){
$('body').html('loaded');
}, 1000);

问题不在于如何包含文件,而是页面加载后执行了一个
document.write()
。这是正确的;但是如果可以修改外部脚本,请使用innerHTML而不是document.write,就像@ChamikaSandamal说的那样。嗨,Eric,1>这会加载jQuery,但是如果我将任何函数作为第二个参数传递给load_js(),则加载js后不会调用该函数。2> 在什么时候调用load_js和setTimeout?你能告诉我这里的执行流程吗?Umesh,加载JS之后,第二个参数不会被调用,就在注入DOM元素之后。为了在加载脚本后获得回调,需要JSONP。如果您使用谷歌的JSAPI,它会为您处理这些问题,但上面只是一个例子。这里:一旦您有了jQuery,您就可以使用如下内容向jQuery注入更多的:$('').attr('src','mysite.com/myjs.js')。appendTo('head');埃里克,你说的这真是太棒了:)我在关注你的博客..你为什么不写更多这样的东西。。