Require.js和document.write()

时间:2015-05-04 16:58:32

标签: javascript jquery html requirejs blockly

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

产生此错误的行位于此文件的最底部: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行)

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

1 个答案:

答案 0 :(得分:3)

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

  1. 假设它正在同步加载(在页面加载期间运行)。
  2. 删除已加载的任何现有GCL对象。
  3. 安装自己的GCL副本(同步加载)。
  4. 为其目的配置其自安装的GCL对象。
  5. 它使用document.write创建<script>标记来完成这些步骤。在页面仍然被加载时调用document.write会导致写入的HTML被附加到页面,而在页面完成加载后调用它将覆盖页面。如果脚本是异步加载的,它会在脚本加载和页面加载之间创建竞争条件,因此在这种情况下禁止使用document.write,并且您收到错误:

      

    无法执行&#39;写&#39; on&#39; Document&#39;:除非明确打开,否则无法从异步加载的外部脚本写入文档。

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

      

    未捕获的TypeError:无法读取属性&#39; addDependency&#39;未定义的(行:27)

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

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