JavaScript加载另一个JS文件

3

我正在尝试从JS文件加载另一个JS文件。

从我的JavaScript文件run.js,我有以下内容:

document.write("<script type='text/javascript' src='my_script.js'></script>");
alert(nImages);

在我的 my_script.js 文件中,我有以下内容:

<SCRIPT language="JavaScript" type="text/javascript">
<!--
nImages = 6;
//-->
</SCRIPT>

但是我似乎无法让它从my_script.js文件中警报nImages


你难道不需要等到JS文件实际加载完成(除了“它不是HTML文件”这部分)? - Dave Newton
3个回答

6
你可以这样做:
var script = document.createElement('script');
script.src = 'my_script.js';
script.type = 'text/javascript';

script.onload = function () {
    alert(nImages);
};

document.getElementsByTagName('head')[0].appendChild(script);

3
您不应在脚本文件中使用HTML。您的脚本文件my_script.js应该只包含以下内容。
nImages = 6;

附注:您不需要使用language="JavaScript"<!--//-->。这些是旧的约定,现代浏览器(甚至IE6)不需要它们。我还建议您避免在JS中使用document.write(),因为它会影响性能。您可能希望查看像RequireJS这样的库,它提供了一种更好的方式来在页面中加载其他JS文件。
我还在Github上发布了一个代码片段,灵感来自Steve Souders,可以通过纯JS加载另一个文件。
var theOtherScript = 'http://example.com/js/script.js';

var el = document.createElement('script');
el.async = false;
el.src = theOtherScript;
el.type = 'text/javascript';

(document.getElementsByTagName('HEAD')[0]||document.body).appendChild(el);

这将把另一个脚本附加到页面的 <head> 元素(如果存在)或页面的 <body> 中。

仍然无法修复,但这是问题的一部分。 - Paul
@Jay 应该是什么,为什么? - Dave Newton
为了方便删除或替换脚本,您应该给它分配一个ID。 - Jay
这个文件存储在外部服务器上,无法更改。是否有方法可以在下载时删除它? - Aaron
@Jay,我还是不明白你想说什么,但好吧。 - Dave Newton
显示剩余2条评论

0
Javascript文件中不应该包含HTML代码。它们应该完全由Javascript代码组成,因此my_script.js文件应该只包含以下内容:
nImages = 6;

这仍然不起作用,因为当您将新的脚本标记写入文档时,它不会立即运行。保证在my_script.js开始之前run.js完成运行,因此当您警报它时nImages是未定义的,然后稍后变为6。您会看到这个可以工作:

document.write("<script type='text/javascript' src='my_script.js'></script>");

function call_on_load(){
    alert(nImages);
}

如果my_script.js的内容是:
nImages = 6;
call_on_load();

编辑

由于您在评论中表示无法编辑my_script.js,因此您可以尝试以下解决方案,虽然它并不是最好的解决方案:

// Force nImages to be undefined
var undefined;
window.nImages = undefined;

document.write("<script type='text/javascript' src='my_script.js'></script>");

(function is_loaded(cb){
    if(typeof window.nImages == 'undefined')
        setTimeout(function(){ is_loaded(cb); }, 100);
    else
        cb();
})(function(){
    // This is executed after the script has loaded
    alert(nImages);
});

这不是一个好的解决方案,因为如果加载脚本时出现错误,它将无限期地继续轮询。

编辑

您在评论中发布了要包含的文件,该文件在顶部具有<SCRIPT。这个文件是无用的,你不能在客户端做任何事情。您必须编写服务器端脚本以将文件作为文本加载,然后您可以仅解析所需的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接