动态加载 JavaScript 文件

2024-01-07

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

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

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

对这个问题的补充:有没有办法在加载动态包含的 JavaScript 文件后处理该事件?原型有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
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态加载 JavaScript 文件 的相关文章

  • 使用 javascript 调用 ViewComponent

    我有一个带有几个视图组件的网页 当我单击这些组件时 我会为其打开一个简单的编辑器 请参见下图 如果我编辑文本并按 Enter 键 我想重新渲染视图组件而不是孔页面 是否可以使用 javascript 调用视图组件来获得此行为 通过更新 您现
  • 如何在新的数据库服务器上导入 Oracle 11g RMAN 备份集?

    我有一个使用 RMAN 创建的 Oracle 11g 数据库的备份集 现在我想将备份集导入 恢复到新的空数据库服务器上 我知道创建备份集的命令是 run backup as compressed backupset database tag
  • 读取 .pdb 文件

    我有很多 pdb 格式的文件 其中一些已下载 但到目前为止我无法使用或读取其中的内容 因此我正在寻找如何从 MS Windows XP 读取和查看 pdb 文件格式 有谁知道怎么打开吗 如果您将 PDB 视为调试器使用的 程序数据库 PDB
  • JSDoc:如何在生成的文档中包含自定义 css 文件模板?

    JS文档docs https jsdoc app about configuring default template html say 将图像目录复制到输出目录 复制全部 将 myproject static 中的静态文件复制到输出目录
  • History.replaceState 仍然向“浏览历史记录”添加条目

    具体来说 调用以下代码片段 history replaceState undefined undefined value 正确地不会影响当前页面的后退按钮行为 但是will在 浏览历史记录 页面添加一个条目 这是我不想要的 下图是 Chro
  • Django 1.6 的静态文件

    我花了一整天但没有任何作用 我在这里看到了至少 20 篇关于同一主题的帖子 它们各不相同 有不同的建议 但没有一个对我有用 使用 Python 2 7 运行 Django 1 6 我正在尝试从 django 教程加载民意调查应用程序的 cs
  • Angular-Datatables + Angular-xeditable:取消可编辑行

    当组合 Angular DataTables 和 Angular XEditable 时 添加新行时会取消可编辑行 这是jsfiddle https jsfiddle net faj61h5d 10 示例操作如下 1 这是初始状态 2 将第
  • 如何在参数上使用 .reduce() 而不是特定的数组或对象?

    我想定义一个函数 flatten 将多个元素展平为一个数组 我知道以下是不可能的 但本质上我想这样做 var flatten function var flattened arguments reduce function acc elem
  • django ajax post 403被禁止

    使用 django 1 4 当我尝试从我的 javascript 做我的 django 服务器上的帖子时 我收到 403 错误 我的 get 工作正常 尽管问题仅出在帖子上 也尝试过 csrf exempt但没有运气 更新 我现在可以发布我
  • Rails 4 - 带有 dependent-fields-rails 的条件 JS

    我正在尝试弄清楚如何在我的 Rails 4 应用程序中使用 dependent fields rails gem 我迷路了 我已将 underscore js 包含在我的供应商 javascripts 文件夹中 并更新了我的 applica
  • 如何使用 selenium 获取 javascript 结果?

    我有以下代码 from selenium import selenium selenium selenium localhost 4444 chrome http some site com selenium start sel selen
  • 在外部单击时关闭弹出 div

    我有一个弹出 div 仅在单击特定按钮时显示 单击同一按钮时它甚至会隐藏 我的问题是 我还想在单击外部任何地方时隐藏 div 我无法这样做 因为弹出 div 位于主包装类内部 并且无法通过在包装类上使用 click 事件并使其隐藏来做到这一
  • 如何在 OpenLayers 3 中删除监听器

    我做了一个copy https gis stackexchange com questions 178222 how to delete a listener in openlayers 3我在 stackoverflow 上提出的问题 因
  • 如何使用 .append() 将 React 组件附加到 HTML 元素

    我正在尝试对我的博客实现无限滚动 我有 const articlesHTML document querySelector articles 作为容器 每次点击装载更多按钮 我想将新文章附加到主 html 元素 如下所示 const res
  • 获取 2 个日期之间的月份名称

    我有两个约会from and to 我想获取这两个日期之间的所有月份名称 以下是我的代码 var monthNames January February March April May June July August September
  • 如何在 ChartJS 中创建自定义图例

    我需要使用 ChartJS 库为我的圆环图创建自定义图例 我已经使用 ChartJS 提供的默认图例创建了甜甜圈 但我需要一些修改 我希望其价值高于汽车名称 另外 我不喜欢粘性图例 我想将其与甜甜圈分开 这样我就可以更改字体 框的样式 例如
  • 地址更改时如何停止 Angular 重新加载

    我正在使用 Angular 的scrollTo and anchorScroll像这样 app controller TestCtrl function scope location anchorScroll scope scrollTo
  • 如何在 jQuery 中检查复选框是否被选中?

    我需要检查checked复选框的属性 并使用 jQuery 根据选中的属性执行操作 例如 如果age复选框被选中 然后我需要显示一个文本框来输入age 否则隐藏文本框 但下面的代码返回false默认情况下 if isAgeSelected
  • jQuery fadeOut 一个 div,fadeIn 另一个 div 在其位置

    我正在尝试一个简单的 jQuery 脚本来淡出一个 div 并淡入另一个 div 但由于某种原因 第一个 div 永远不会淡出 这可能是代码的一个明显问题 但我似乎无法弄清楚 div div div div
  • html5 canvas 使用图像作为蒙版

    是否可以使用具有形状的图像作为整个画布或画布内图像的蒙版 我想将图像放置在画布中 并在图像上添加蒙版 然后将其另存为新图像 您可以使用 source in globalCompositeOperation 将黑白图像用作蒙版 首先 将蒙版图

随机推荐

  • Node.js 的 Rails 控制台的等效项

    我正在尝试 Node js Express 框架 并寻找允许我通过控制台与模型交互的插件 类似于 Rails 控制台 NodeJS 世界里有这样的东西吗 如果没有 我如何与 Node js 模型和数据交互 例如手动添加 删除对象 测试数据方
  • JavaFX Alert 截断消息? [复制]

    这个问题在这里已经有答案了 我注意到如果我尝试展示Alert对于很长的消息 它往往会被截断 在单词边界处 Example import javafx application Application import javafx scene c
  • C 中 : 运算符的使用 [重复]

    这个问题在这里已经有答案了 可能的重复 结构体字段后面的 number 是什么意思 https stackoverflow com questions 3029442 what does number after a struct fiel
  • 使用条件更改 numpy 数组中的每个值

    我有一个从图像中获得的二维数组 现在它有 0 和 255 我想将所有 255 更改为 1 这对于for loop for i in range lenX for j in range lenY if img i j 255 img i j
  • 我可以在源perl程序中插入断点吗?

    我想要 perl 程序在某些条件满足时启动调试器 其他一些语言有库支持的 debug 语句 perl 中是否有类似的语句 如果我理解正确 您需要在代码中使用特定的调试器变量 DB single 在代码中将其设置为真值将导致调试器在该行停止
  • 使用 Powermock 模拟类的构造函数时出现 ExceptionInInitializerError。如何修复它?

    这是我的案例 我有一个 AbstractController 类 它有一个子类Controller 在 AbstractController 的方法之一中 实例化了一个新的 ApplicationLock 我想在为控制器编写 ut 时模拟
  • 将 CURLOPT_CAINFO 与更新的 CA 捆绑包一起使用会导致证书验证失败

    我使用 cURL 在 WordPress 插件中验证 PayPal 交易 最近 我开始收到有关用户因无法验证交易而无法完成购买流程的错误报告 我追踪到错误 SSL certificate problem verify that the CA
  • 从 TextView 到 EditText 的共享元素转换错误

    我正在尝试在TextView and a EditText but when showing the resulting Activity the text in theEditViewhave been shifted up See at
  • 我可以调用 jdbc 中的存储过程来使用 mysql 返回表吗?

    我是使用 jdbc 执行 mysql 存储过程的新手 我的问题是 是否可以调用返回 jdbc 中的表的存储过程 我搜索了很多 我知道我可以使用返回一定数量的参数registerOutParameter使用过程 但是包含几行的整个表怎么样 我
  • Facebook 应用程序如何向用户的所有好友发送消息?

    我们正在尝试构建一个应用程序 该应用程序可以根据登录用户的请求并在应用程序中进行适当的祝福 向任何或所有用户的 FB 好友发送一条消息 声明他们已收到一份礼物 我们已经能够以墙贴的形式向少数朋友发送此消息 通知和消息在 API 中不可用 然
  • 如何编写像 init.d 中使用的那样的 bash 脚本?

    我必须编写一个 bash 脚本来制作很多东西 我想像初始化脚本一样打印消息 例如 Doing A OK Doing B ERROR 你知道有什么方法可以做到这一点吗 提前致谢 在我所有的 Linux 机器上 执行此操作的代码位于文件中 et
  • 如何将依赖项注入 iOS 视图控制器?

    我的视图控制器需要向几个模型对象发送消息 如何获取视图控制器内这些模型对象的引用 这些模型对象是 单例 因为系统中一次只能有它们的一份副本 并且它们由多个视图控制器使用 所以我无法在每个视图控制器的 init 方法中实例化它们 我无法使用构
  • 如何在vb.net中检索mysql数据?

    我试图检索具有特定列的 mysql 数据并显示到 vb net 中的文本框 我应该怎么做才能取回它 Dim connect As New MySqlConnection server localhost user id root passw
  • 如何测试父元素对组件绑定的更改?

    我有一个如下所示的组件 想测试一下 onChange方法在绑定的情况下执行myBinding变化 我尝试了一整个早上 但找不到解决这个问题的方法 angular module project myComponent component my
  • 如何成功导入pygame.locals

    你好 Stackoverflowers 我正在学习如何使用 Pygame 进行编程 并且正在尝试导入 pygame locals 根据我正在学习的教程 我是这样开始的 import pygame sys from pygame locals
  • VS 2017 构建工具失败,错误 MSB4019:找不到导入的项目“D:\Microsoft.Cpp.Default.props”

    我正在构建一个新的 TFS 构建服务器 并决定使用 VS 2017 构建工具 而不是安装完整版本的 VS 当我尝试构建 C 项目时 它抛出以下错误 Error MSB4019 The imported project D Microsoft
  • 如何在javascript中清除localstorage、sessionStorage和cookie?然后检索?

    如何彻底清除localstorage sessionStorage and cookies在 JavaScript 中 有什么办法可以在清除这些值后恢复它们吗 如何彻底清除本地存储 localStorage clear 如何彻底清除sess
  • 如何使 navigator.vibrate 在页面加载时在 Onload 上工作

    我想让手机 设备在页面加载时振动 现在只有当我们点击振动按钮时振动才起作用 But the onload标记它不工作 给我一个解决方案来解决这个问题 我什至厌倦了添加window onload example1 也 但仍然不起作用
  • django 将模型实例转换为字典

    我是 Django 的初学者 我需要将 Model 实例转换为类似于 Model objects values 的字典 并带有关系字段 所以我写了一个小函数来做到这一点 def get proper instance field if fi
  • 动态加载 JavaScript 文件

    如何可靠且动态地加载 JavaScript 文件 这可用于实现一个模块或组件 当 初始化 时 该组件将根据需要动态加载所有需要的 JavaScript 库脚本 使用该组件的客户端不需要加载所有库脚本文件 并手动插入