我有一个模块需要执行document.write操作才能在页面加载后打印横幅。
如果我使用老派的方式这样做,我没有遇到任何问题。 横幅打印在div内。
<div id="banner">
<script> addAdvert() </script>
</div>
<script>
function addAdvert(){
srcScript = 'http://www.urltoscript.js';
document.write('<script type=\"text/javascript\" src=\"'+srcScript+'" ><\/script>');
}
</script>
但如果我尝试使用require js模块(有点这样):
addAvert: function() {
var srcScript = options.urltoScript
document.write('<script type=\"text/javascript\" src=\"'+srcScript+'" ><\/script>');
}
它执行document.write并渲染所有文档,只打印整个文档中的横幅...
我试过这个替代方案:
addAvert: function() {
var srcScript = options.urltoScript
var bsa = document.createElement('script');
bsa.type = 'text/javascript';
bsa.async = true;
bsa.src = srcScript;
$("#banner").append(bsa);
}
答案 0 :(得分:1)
根据您的评论判断,您尝试从虚构网址http://www.urltoscript.js
加载的脚本使用document.write
。您应该更改此脚本以不使用document.write
,或者您应该放弃异步加载它的想法,因为 document.write
在异步调用时无法可靠地工作。
当您尝试require([bsa.src])
(正如您在评论中提到的那样)无法从异步加载的脚本中调用document.write
时,您已经发现了。 (另请注意,除非另一端的源代码是AMD模块,或者您为其定义了require([bsa.src])
,否则只执行shim
不会起作用。)
第一次尝试通过RequireJS加载时没有产生关于document.write
异步加载的错误消息,因为加载它的script
元素不是本身异步。但是,它完全消隐了您的页面。这是因为如果您在页面加载完成后致电document.write
,则浏览器可能会隐式调用document.open
,这可能会使您的页面空白。
这里的结果是您无法可靠地将document.write
与异步代码一起使用。