javascript - 动态加载 JavaScript 文件

标签 javascript file import include

如何可靠且动态地加载 JavaScript 文件?这可用于实现一个模块或组件,当“初始化”时,该组件将根据需要动态加载所有需要的 JavaScript 库脚本。

使用该组件的客户端不需要加载实现该组件的所有库脚本文件(并手动将 <script> 标签插入其网页) - 只需加载“主”组件脚本文件即可。

主流 JavaScript 库如何实现此目的(Prototype、jQuery 等)?这些工具是否将多个 JavaScript 文件合并到单个可重新分发的脚本文件“构建”版本中?或者他们是否动态加载辅助“库”脚本?

此问题的补充:加载动态包含的 JavaScript 文件后是否有办法处理该事件? 原型(prototype)有 document.observe用于文档范围的事件。示例:

document.observe("dom:loaded", function() {
  // initially hide all containers for tab content
  $$('div.tabcontent').invoke('hide');
});

脚本元素有哪些可用事件?

最佳答案

javascript中没有import/include/require,但是有两种主要方法可以实现你想要的:

1 - 您可以通过 AJAX 调用加载它,然后使用 eval。

这是最直接的方法,但由于 Javascript 安全设置,它仅限于您的域,并且使用 eval 会为错误和黑客攻击打开大门。

2 - 在 HTML 中添加带有脚本 URL 的脚本元素。

绝对是最好的方法。您甚至可以从外部服务器加载脚本,并且当您使用浏览器解析器来评估代码时,它是干净的。您可以将 script 元素放在网页的 head 元素中,或者放在 body 的底部。

此处讨论并说明了这两种解决方案。

现在,有一个大问题你必须知道。这样做意味着您远程加载代码。现代网络浏览器将加载文件并继续执行当前脚本,因为它们异步加载所有内容以提高性能。

这意味着,如果您直接使用这些技巧,您将无法在要求加载后的下一行使用新加载的代码,因为它仍在加载。

例如:my_lovely_script.js 包含 MySuperObject

var js = document.createElement("script");

js.type = "text/javascript";
js.src = jsFilePath;

document.body.appendChild(js);

var s = new MySuperObject();

Error : MySuperObject is undefined

然后按 F5 重新加载页面。它有效!令人困惑...

那么该怎么办呢?

好吧,您可以使用作者在我给您的链接中建议的技巧。综上所述,对于赶时间的人来说,他使用 en event 在脚本加载时运行回调函数。所以你可以把所有使用远程库的代码放在回调函数中。例如:

function loadScript(url, callback)
{
    // adding the script element to the head as suggested before
   var head = document.getElementsByTagName('head')[0];
   var script = document.createElement('script');
   script.type = 'text/javascript';
   script.src = url;

   // then bind the event to the callback function 
   // there are several events for cross browser compatibility
   script.onreadystatechange = callback;
   script.onload = callback;

   // fire the loading
   head.appendChild(script);
}

然后,在将脚本加载到 lambda 函数中后,编写要使用的代码:

var myPrettyCode = function() {
    // here, do what ever you want
};

然后你运行所有这些:

loadScript("my_lovely_script.js", myPrettyCode);

好的,我明白了。但写这些东西很痛苦。

那么,在这种情况下,您可以一如既往地使用出色的免费 jQuery 框架,它可以让您在一行中完成同样的事情:

$.getScript("my_lovely_script.js", function() {
    alert("Script loaded and executed.");
    // here you can use anything you defined in the loaded script
});

关于javascript - 动态加载 JavaScript 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/312692/

相关文章:

javascript - 组数组对象

javascript - 延迟 Vue.JS 组件加载,直到 Promise 得到解决

eclipse - 导入现有项目

python - 导入错误:无法导入名称 _aligners [biopython]

logging - 如何在 Dart 中导入日志库?

javascript - THREE.FontLoader() 在三个 JS 中不起作用

Javascript:如何轻松地用第二个对象的数据替换对象值?

c - 我应该在哪里找到要在C中读取的txt文件

c - 我从位图文件中获取的大小是否正确?不匹配的属性

java - 将对象写入文件有什么好处?