动态引入document.write的脚本

动态引入document.write的脚本

当网站需要动态引入脚本时,而引入的脚本逻辑又是通过document.write执行时,往往会出现问题。因为动态引入的脚本是会在页面DOMContentLoaded 事件完成后触发onload事件,此时页面dom结构渲染完成了,而此时document.write的渲染会把页面内容清空之后在写入。为了防止重复渲染,浏览器会禁止document.write执行。

Failed to execute ‘write’ on ‘Document’: It isn’t possible to write into a document from an asynchronously-loaded external script unless it is explicitly opened

方法一

改变页面加载的顺序
可以使用document.open打开页面渲染,改变页面的结构后调用document.close重新渲染

  <script>
      // 动态引入js文件
      document.open();
      document.write(`\<script src="https://srcfile/${num}/header.js"\>\<\/script\>`)
  </script>
  <!--header.js会动态插入这里-->
  <div id="app"></div>
  <script>
      document.write(`\<script src="https://srcfile/${num}/footer.js"\>\<\/script\>`)
      document.close();
  </script>
    <!--footer.js会动态插入这里-->

开启document.open之后,document.write的内容就会紧跟着写在document后面,而不会覆盖原始内容

方式二

将脚本作为接口地址请求,获取到内容,然后通过Dom.parser将内容转为html后解析里面的内容,插入网站中
需要处理文本内容

方式三

使用iframe存放脚本

const header_src = `https://srcfile/${num}/header.js`
      const iframe = document.querySelector('.heade-iframe');
      loadScriptViaIframe = () => {
        iframe.onload = () => {
          const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
        iframeDoc.open();
         iframeDoc.write(`\<script src="${header_src}"\>\<\/script\>`);
          iframeDoc.close();
        };
      }
        loadScriptViaIframe()
        document.body.insertBefore(iframe, document.body.firstChild);

适用性不强

方式四

如果脚本方能够提供可以动态引入的脚本文件最好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晨灰ash2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值