【问题标题】:How to dynamically add script which will be executed right now?如何动态添加将立即执行的脚本?
【发布时间】:2016-04-19 16:37:44
【问题描述】:

有简单的页面:

<html>
  <head>
    <script type="text/javascript" src="scripts/x.js"></script>
  </head>
  <body>
    <script type="text/javascript">
      console.log($);
    </script>
  </body>
</html>

'scripts.x.js':

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https://code.jquery.com/jquery-1.12.3.min.js';
script.async = false;
script.defer = false;
document.currentScript.parentNode.insertBefore(script, document.currentScript.nextSibling);

这个脚本只是在当前脚本之后添加了一个新的外部脚本标签,但它不起作用,因为 'console.log' 写入错误 'index.html:8 Uncaught ReferenceError: $ is not defined'。我究竟做错了什么?提前致谢!

【问题讨论】:

  • 如您所见,我正在尝试动态添加 JQuery @RayonDabre
  • 那么在这种情况下,您的 JS 的其他一些部分在 jQ 加载之前正在执行...
  • 我明白了,但是为什么呢? 'scripts/x' 在自己之后添加 JQ,在 'console.log' 之前
  • 因为,正在添加script asynchronously..use promise

标签: javascript


【解决方案1】:

问题在于,由于 JavaScript 的异步 I/O 模型,该脚本没有按照您的预期执行。您可能认为在加载 jQuery 时脚本将停止执行,然后在加载外部脚本(在您的情况下为 https://code.jquery.com/jquery-1.12.3.min.js)后继续执行。

实际发生的是 I/O 操作由另一个线程完成,当 JS 解释器到达 console.log 调用时,I/O 还没有完成,因此 $ 还没有完成尚未初始化。

我建议你试试requirejs - 它异步处理外部脚本的加载。

【讨论】:

  • 没有requirejs可以做到吗
猜你喜欢
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多