使用RequireJS模块的“document.write”问题

时间:2014-12-04 09:16:14

标签: javascript asynchronous requirejs

我有一个模块需要执行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);
 }

1 个答案:

答案 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与异步代码一起使用。