【问题标题】:Dynamically and synchronously load JavaScript file from a different domain从不同的域动态同步加载 JavaScript 文件
【发布时间】:2011-02-16 18:51:21
【问题描述】:

我想通过代码同步包含来自不同域的 JavaScript 文件。这意味着使用同步 XMLHttpRequest 将不起作用。我还想避免document.write,因为我的代码将在文档完全加载时执行。这甚至可能吗?是否有任何现有的 JavaScript 库支持该功能?

基本上我希望它能够工作:

<script type="text/javascript">
  $(document).ready(function() {
      load("path_to_jQuery_UI_from_another_domain");
      console.log(jQuery.ui.version); //outputs the version of jQuery UI
  });
</script>

编辑: 我的想法是创建一个 jQuery 插件,它根据启用的功能加载其 JavaScript 文件。 jQuery 插件可以随时初始化,这意味着没有 document.write。异步加载 JavaScript 文件非常好,但人们希望他们的插件在调用 $("selector").something(); 后完全初始化。因此需要在没有 document.write 的情况下同步加载 JavaScript。我想我只是想要太多。

【问题讨论】:

  • “人们希望他们的插件完全初始化”。不,人们应该学习如何使用异步代码。你看过require.js吗?它为你解决了这一切。

标签: javascript jquery dynamic-script-loading


【解决方案1】:

同步加载文件的唯一方法是将 document.write 脚本标签写入您的页面。这通常被认为是一种不好的做法。可能有更好的方法来做你真正想做的事,但是,本着透明的精神:

document.write('<script src="http://otherdomain.com/script.js"></'+'script>')

应该可以解决问题。您必须转义结束脚本标记,以便解析器不会关闭您编写的脚本标记。

**请注意,您不能动态加载包含 document.write 的脚本

【讨论】:

  • 对于这个用例,这是正确的,但从技术上讲,您可以在 Workers 以及 onbeforeunload 和 onunload 事件中执行同步请求。 developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/…
  • 你可以做同步请求,但不包括同步脚本。因此,您可以将脚本请求为文本并同步对其进行评估,但这可能不是我推荐的。
【解决方案2】:

你应该可以使用.getScript()

编辑:跨域请求总是在 jQuery 中异步加载。

【讨论】:

  • 据我所知 getScript 只能异步处理文件。我想要同步加载。
  • 啊,你是对的,在挖掘之后。 jQuery.getScript() 只是 jQuery.get() 的代理,它只是 jQuery.ajax() 的代理。 .ajax() 有一个 async 属性,但是跨域请求总是异步的,所以它终究是行不通的。
  • 使用 JavaScript 跨域加载它们可能不走运。我在试图找出为什么不尊重跨域请求的 async false 时发现了bugs.jquery.com/ticket/6557。在服务器端加载它是一种选择吗?
  • 有趣,不知道这个。
【解决方案3】:

存在一个名为 YepNope 的出色库,用于从任何位置加载 javascript 依赖项 - 由 yayQuery 播客的成员开发。可以在这里找到:http://yepnopejs.com/

【讨论】:

  • 虽然我很高兴你喜欢 yepnope,但它始终是异步的,就像它应该是的那样:D
  • 好吧,他的编辑暗示了一个 jQuery 插件——所以也许 Yepnope 不是这里的方法,但总体思路是基于启用的功能获取和加载......这听起来像有条件填充物。超级粉丝,顺便说一句。
【解决方案4】:

无法在 URL 处同步执行脚本。进一步注意,当涉及网络(甚至文件系统!)时,同步任何东西都是一个坏主意。有时,某个地方的某个人的系统速度较慢,或网络速度较慢,或两者兼而有之,而您突然间就在此过程中挂起了他们的 UI。

同步不好。带回调的异步很好。

请注意,作为最坏情况的 hack,您可以使用自己的函数覆盖 $,该函数返回一个具有正确属性的对象,并且您可以半懒惰地评估所有实际调用。如果您开始依赖立即执行调用,或者依赖于它们的执行与参数的评估混合,这当然会中断,但在最坏的情况下,这并非完全不可信。

【讨论】:

    【解决方案5】:

    LABjs.js,是一个不错的库。我用过,效果很好。

    http://labjs.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 2010-10-20
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 2011-08-10
      相关资源
      最近更新 更多