我想使用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行)
我怎么能解决这个问题?非常感谢。
答案 0 :(得分:3)
您尝试加载的库是为了使用Google Closure Library而构建的,它具有自己的模块依赖系统。更具体地说,它正在做的是:
它使用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进行所有操作。如果你不能这样做,下面的黑客可能会有效:
<script>
标记的GCL。document.write
s)替换为:window.BLOCKLY_BOOT();