繁体   English   中英

Require.js和document.write()

[英]Require.js and document.write()

我想使用require.js异步加载.js文件,但我得到的是这个错误: 无法在'Document'上执行'write'无法从异步加载的外部脚本写入文档除非明确打开。

产生此错误的行位于此文件的最底部: https//code.google.com/p/blockly/source/browse/trunk/blockly_uncompressed.js?r = 1234

所以我尝试了一种解决方法:

var head = document.getElementById('head');
var myScript= document.createElement('script');
script1.innerHTML = "...";
head.appendChild(myScript);

这会产生错误: Uncaught TypeError:无法读取未定义的属性'addDependency' (第27行)

我怎么能解决这个问题? 非常感谢。

您尝试加载的库是为了使用Google Closure Library而构建的,该具有自己的模块依赖系统。 更具体地说,它正在做的是:

  1. 假设它是同步加载的(在页面加载期间运行)。
  2. 删除已加载的任何现有GCL对象。
  3. 安装自己的GCL副本(同步加载)。
  4. 为其目的配置其自安装的GCL对象。

它通过使用document.write创建<script>标记来完成这些步骤。 在页面仍然被加载时调用document.write导致写入的HTML被附加到页面,而在页面完成加载后调用它将覆盖页面。 如果脚本是异步加载的,它会在脚本加载和页面加载之间创建竞争条件,因此禁止在这种情况下使用document.write ,并且您会收到错误:

无法在'Document'上执行'write':除非明确打开,否则无法从异步加载的外部脚本写入文档。

通过解决方法,您的代码将异步加载,因此库创建的<script>标记也会异步加载。 GCL加载已启动,但是当它立即尝试使用GCL的addDependency函数时,它会失败,因为GCL尚未完成加载,并且您收到错误:

未捕获的TypeError:无法读取未定义的属性'addDependency'(第27行)

将GCL与RequireJS混合可能是可能的,但正如您所看到的那样,它会变得混乱。 由于您必须为此库使用GCL,因此您最好只使用GCL进行所有操作。 如果你不能这样做,下面的黑客可能会起作用:

  1. 在RequireJS之外同步加载带有普通<script>标记的GCL。
  2. 将库代码复制到异步加载的模块中。
  3. 用just: window.BLOCKLY_BOOT();替换最后三行( document.write s window.BLOCKLY_BOOT();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM