在.js文件中包含.js文件

我想知道是否有可能在另一个.js文件中包含.js文件?

我想要这样做的原因是保持客户包括最低限度。 我有几个.js文件已经写入客户端所需要的function。 客户端将有一个他/她用.js文件pipe理的html文件(我的.js文件)。

我可以重新编写一个新的包含所有函数的.js文件,或者为了避免双重工作,找出一种方法来编写包含其他.js文件的.js文件。

我基本上这样做,创build新的元素,并将其附加到<head>

 var x = document.createElement('script'); x.src = 'http://example.com/test.js'; document.getElementsByTagName("head")[0].appendChild(x); 

您也可以使用onload事件来附加每个脚本,但请testing一下,我不太确定它是否可以跨浏览器使用。

 x.onload=callback_function; 

浏览器加载时间的最佳解决scheme是使用服务器端脚本将它们全部join到一个大的.js文件中。 确保gzip / minify最终版本。 单一的要求 – 很好,紧凑。

或者,您可以使用DOM来创build一个<script>标记并在其上设置src属性,然后将其附加到<head> 。 如果您需要等待该function加载,则可以使该脚本标记上的load事件调用JavaScript文件的其余部分。

这个函数基于jQuery $.getScript()

 function loadScript(src, f) { var head = document.getElementsByTagName("head")[0]; var script = document.createElement("script"); script.src = src; var done = false; script.onload = script.onreadystatechange = function() { // attach to both events for cross browser finish detection: if ( !done && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete") ) { done = true; if (typeof f == 'function') f(); // cleans up a little memory: script.onload = script.onreadystatechange = null; head.removeChild(script); } }; head.appendChild(script); } // example: loadScript('/some-other-script.js', function() { alert('finished loading'); finishSetup(); }); 

这样做没有直接的方法。

你可以做的是按需加载脚本。 (再次使用类似于伊格纳西奥提到的东西,但更清洁)。

检查这个链接了多种方式做到这一点: http : //ajaxpatterns.org/On-Demand_Javascript

我最喜欢的是(总是不适用):

 <script src="dojo.js" type="text/javascript"> dojo.require("dojo.aDojoPackage"); 

谷歌的封闭也提供了类似的function。

解决从HTML文件中减lessJavaScript引用问题的stream行方法是使用链接工具(如Sprockets) ,它将JavaScript源文件预处理并连接在一起。

除了减less来自HTML文件的引用数量,这也会减less到服务器的命中数量。

然后你可能想通过像jsmin这样的缩小工具来运行结果串联来缩小它。

我使用@ gnarf的方法,虽然我回到了document.writeln一个<script>标记为IE <7,因为我不能让DOM创build在IE6中可靠地工作(和TBH没有足够的精力投入很多努力它)。 我的代码的核心是:

  if (horus.script.broken) { document.writeln('<script type="text/javascript" src="'+script+'"></script>'); horus.script.loaded(script); } else { var s=document.createElement('script'); s.type='text/javascript'; s.src=script; s.async=true; if (horus.brokenDOM) s.onreadystatechange= function () { if (this.readyState=='loaded' || this.readyState=='complete') horus.script.loaded(script); }; else s.onload=function () { horus.script.loaded(script) }; document.head.appendChild(s); } 

其中horus.script.loaded()指出加载的JavaScript文件,并调用任何挂起的未调用例程(由自动加载器代码保存)。