如何将js文件包含在另一个js文件中?
如何将一个js文件包含在另一个js文件中,以坚持DRY原则并避免代码重复。
只能在 HTML 页面中包含脚本文件,而不能在另一个脚本文件中包含脚本文件。也就是说,您可以编写JavaScript,它将“包含的”脚本加载到同一页面中:
var imported = document.createElement('script');
imported.src = '/path/to/imported/script';
document.head.appendChild(imported);
但是,您的代码很有可能取决于您的“包含”脚本,在这种情况下,它可能会失败,因为浏览器将异步加载“导入”脚本。你最好的选择是简单地使用像jQuery或YUI这样的第三方库,这为你解决了这个问题。
// jQuery
$.getScript('/path/to/imported/script.js', function()
{
// script is now loaded and executed.
// put your dependent JS here.
});
我不同意这种技术(参见Vahan Margaryan的建议)。我喜欢(参见Matt Ball的建议),但有一个重要的问题:脚本执行顺序。document.write
document.getElementsByTagName('head')[0].appendChild(...)
最近,我花了很多时间重现一个类似的问题,甚至着名的jQuery插件也使用相同的技术(请参阅此处的src)来加载文件,但其他人也报告了这个问题。想象一下,你有一个JavaScript库,它由许多脚本组成,其中一个加载所有部分。有些部分相互依赖。假设您包含另一个脚本,该脚本使用 紧跟在 .问题是有时在 加载所有脚本之前执行。脚本内部的使用没有帮助。在 中使用级联事件处理程序将使脚本加载顺序而不是并行,并且会使脚本难以使用,这应该只是之后的某个地方的包含。loader.js
main.js
<script>
loader.js
loader.js
main.js
loader.js
$(document).ready(function () {/*code here*/});
main.js
onload
loader.js
main.js
loader.js
通过在我的环境中重现该问题,我可以看到**Internet Explorer 8中脚本的执行顺序在包含JavaScript*方面可能有所不同。如果您需要包含相互依赖的脚本,这是一个非常困难的问题。此问题在并行加载 Javascript 文件中进行了描述,建议的解决方法是使用 :document.writeln
document.writeln("<script type='text/javascript' src='Script1.js'></script>");
document.writeln("<script type='text/javascript' src='Script2.js'></script>");
因此,在“脚本并行下载但按照写入页面的顺序执行”的情况下,从技术更改为 ,我不再看到问题。document.getElementsByTagName('head')[0].appendChild(...)
document.writeln
所以我建议你使用.document.writeln
更新:如果有人有兴趣,他们可以尝试在Internet Explorer中加载(并重新加载)该页面(该页面使用该技术),然后与使用的固定版本进行比较。(页面的代码相对较脏,不是来自我,但它可用于重现问题)。document.getElementsByTagName('head')[0].appendChild(...)
document.writeln