[英]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而构建的,该库具有自己的模块依赖系统。 更具体地说,它正在做的是:
它通过使用document.write
创建<script>
标记来完成这些步骤。 在页面仍然被加载时调用document.write
导致写入的HTML被附加到页面,而在页面完成加载后调用它将覆盖页面。 如果脚本是异步加载的,它会在脚本加载和页面加载之间创建竞争条件,因此禁止在这种情况下使用document.write
,并且您会收到错误:
无法在'Document'上执行'write':除非明确打开,否则无法从异步加载的外部脚本写入文档。
通过解决方法,您的代码将异步加载,因此库创建的<script>
标记也会异步加载。 GCL加载已启动,但是当它立即尝试使用GCL的addDependency
函数时,它会失败,因为GCL尚未完成加载,并且您收到错误:
未捕获的TypeError:无法读取未定义的属性'addDependency'(第27行)
将GCL与RequireJS混合可能是可能的,但正如您所看到的那样,它会变得混乱。 由于您必须为此库使用GCL,因此您最好只使用GCL进行所有操作。 如果你不能这样做,下面的黑客可能会起作用:
<script>
标记的GCL。 window.BLOCKLY_BOOT();
替换最后三行( document.write
s window.BLOCKLY_BOOT();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.