Adi*_*kla 239 javascript
可能重复:
在.js文件中包含.js文件
如何将js文件包含到另一个js文件中,以便坚持DRY原则并避免重复代码.
Mat*_*all 258
您只能在HTML页面中包含脚本文件,而不能在其他脚本文件中包含脚本文件.也就是说,您可以编写JavaScript来将"包含"脚本加载到同一页面中:
var imported = document.createElement('script');
imported.src = '/path/to/imported/script';
document.head.appendChild(imported);
Run Code Online (Sandbox Code Playgroud)
您的代码很可能依赖于"包含"脚本,但在这种情况下,它可能会失败,因为浏览器将异步加载"导入"脚本.您最好的选择是简单地使用第三方库,如jQuery或YUI,它可以为您解决此问题.
// jQuery
$.getScript('/path/to/imported/script.js', function()
{
// script is now loaded and executed.
// put your dependent JS here.
});
Run Code Online (Sandbox Code Playgroud)
Ole*_*leg 18
我不同意document.write技术批评者(见Vahan Margaryan的建议).我喜欢这种方式document.getElementsByTagName('head')[0].appendChild(...)(参见Matt Ball的建议),但有一个重要的问题:顺序执行脚本的顺序.我必须在下面更准确地描述问题.
最近我花了很多时间重现一个接近的问题.众所周知的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中执行脚本的顺序可以是包含JavaScripts的顺序.如果你需要包含一些依赖于另一个脚本的脚本,这是一个非常难的问题.这个问题在并行加载Javascript文件中有所描述.建议使用变通方法document.writeln:
document.writeln("<script type='text/javascript' src='Script1.js'></script>");
document.writeln("<script type='text/javascript' src='Script2.js'></script>");
Run Code Online (Sandbox Code Playgroud)
描述了"脚本是并行下载但按照它们写入页面的顺序执行"的情况.从document.getElementsByTagName('head')[0].appendChild(...)技术变为document.writeln我之前从未见过任何问题.
所以我建议你使用document.writeln.
已更新:如果有人有兴趣,他可以尝试加载(并重新加载)的页面在Internet Explorer(页面使用document.getElementsByTagName('head')[0].appendChild(...)的技术),并比较固定的版本使用document.writeln.(页面的代码相对较脏,不是来自我,但它可以用来重现我描述的问题).
无法直接进行。您也可以编写一些可以处理该问题的预处理器。
如果我对它的理解正确,那么以下是有助于实现这一目标的事情:
使用可以在您的JS文件中运行的预处理器,例如查找“ @import somefile.js”之类的模式,并将其替换为实际文件的内容。Nicholas Zakas(Yahoo)用Java编写了一个这样的库,您可以使用(http://www.nczonline.net/blog/2009/09/22/introducing-combiner-a-javascriptcss-concatenation-tool/)
如果您使用的是Ruby on Rails,则可以尝试使用Jammit资产包装,它使用asset.yml配置文件,您可以在其中定义包含多个文件的软件包,然后在实际的网页中按软件包名称进行引用。
尝试使用诸如RequireJS之类的模块加载器或诸如LabJs之类的脚本加载器,它们能够控制加载顺序以及利用并行下载的优势。
JavaScript当前不提供将JavaScript文件包含到另一个CSS(例如@import)中的“本机”方式,但是上述所有工具/方式都有助于实现您提到的DRY原理。我可以理解,如果您来自服务器端背景,可能会感觉不直观,但这就是事实。对于前端开发人员,此问题通常是“部署和打包问题”。
希望能帮助到你。
小智 5
您需要编写一个document.write对象:
document.write('<script type="text/javascript" src="file.js" ></script>');
Run Code Online (Sandbox Code Playgroud)
并将其放在您的主要javascript文件中
| 归档时间: |
|
| 查看次数: |
669524 次 |
| 最近记录: |