【发布时间】:2011-04-26 17:27:15
【问题描述】:
我正在尝试做的是从 Javascript 中动态包含一个或多个 js 文件。我知道有很多技术可以解决这个问题,但我正在寻找遵循以下规则的解决方案:
1) 不使用任何 JS 框架或库(jQuery、Prototype 等)。
2) 脚本应该停止执行,直到外部 js 文件被浏览器完全加载和解析。
#2 背后的原因是外部 js 文件将包含需要在包含脚本后立即使用的函数定义。在我开始调用这些函数之前,大部分时间浏览器都没有时间解析 js 文件。
我不介意使用回调来知道脚本何时完成加载,但是:
1) 我不知道要动态包含多少脚本,所以我不想也不能写一堆嵌套的回调。我只需要知道它们何时完成加载。
2) 我的措辞是,如果浏览器缓存了 JavaScript,那么尝试使用某种“加载”事件来触发回调可能不起作用。
编辑我应该从一开始就提到这是针对插件系统的,但我想让我的问题/答案足够通用,以便对其他人有所帮助。
用户可以定义他们想要在数组中加载哪些插件。
plugins = [ 'FooPlugin', 'BarPlugin' ];
然后我会遍历数组,并为每个插件加载 js 脚本:
for(var i = 0; i < plugins.length; i++) {
loadScript('plugins/' + plugins[i] + '.js');
}
每个插件都将自己推送到 loaded_plugins 数组(这是 FooPlugin.js 的示例)
load_plugins.push({
name: 'FooPlugin',
// Other plugin methods and properties here
});
【问题讨论】:
-
不确定这个答案,所以只是将其作为评论发布。您是否尝试过使用 AJAX 将 javascript 的内容加载到客户端变量中,然后使用
eval()?由于您必须等待 AJAX 返回 200/OK 消息,因此您知道整个脚本已加载,eval()在完成整个脚本运行之前不应将您踢到下一行。 -
你能确定页面加载过程中需要哪些脚本吗?如果是这样,那么@Paul 的解决方案是理想的。否则,您的解决方案将取决于您想要支持的浏览器以及脚本是否与您的页面位于同一域中。
-
@steven_desu - 加载脚本中的函数/变量不会最终出现在调用 eval() 的上下文中吗?这意味着它们在使用 eval 的函数之外不可用。
标签: javascript ajax