当前位置: 首页 > news >正文

不拥抱doucment.write

document.write的名声好像一直不是很好,也许是它经常出现在初学者教程中,也可能是被劫持的js文件中经常用出现这东西,导致大家都满排斥它的。
但是,无论它的长相多难看,它确实能解决同步加载的问题,比如创建一个script,然后把它appendChild到head中

//x.js
alert(1)
 <script>
    let $scp = document.createElement('script')
    $scp.src = './x.js'
    document.querySelector('head').appendChild($scp)
  </script>
  <script>
    alert(2)
  </script>

输出的消息先是2然后是1,程序并不会因为appendChild而陷入等待

接下来使用document.write在页面中塞入一个script

<script>
    document.write(`<script src="./x.js"><\/script>`)
  </script>
  <script>
    alert(2)
  </script>

发现程序按理想的顺序执行了,document.write会使程序陷入等待,输出的消息先是1然后是2

要注意的是,如果塞入的script是跨站的,在chrome中会出现下面的警告

<script>
    //a.com
    document.write(`<script src="//b.com/x.js"><\/script>`)
  </script>

 

就是说,在网络很差的情况下,document.write写入的script如果是跨站的会被无视掉的!

 

利用它同步加载资源特性就能解决一些场景下的问题

比如需要按照平台相关的代码来同步引入代码

<script>
    const ua = navigator.userAgent
    if(/android_ysdk/.test(ua)){
      document.write(`<script src="./x.js"><\/script>`)
    }
    if(/MicroMessagenger/.test(ua)){
      document.write(`<script src="./weixin.js"><\/script>`)
    }
  </script>

还有为了按需加载那些不支持某些特性浏览器的polyfill,需要做兼容检测处理

<script>
    if(!Object.keys){
      document.write(`<script src="./object-keys.js"><\/script>`)
    }
    if(!Array.isArray){
      document.write(`<script src="./array-isArray.js"><\/script>`)
    }
  </script>

document.write能够想到的用途就上面这儿了,总之就是为了解决同步资源加载问题

上面的两种实现方式都有能够替代的方案:

需要插入代码的检测逻辑服务器来判断

平台相关的代码由服务器端检测ua来输入script到html中

polyfill的代码同样也是由服务器获取到ua,再根据一个浏览器特性支持列表来决定加载哪些polyfill。如果需要加载,那么往页面中输入script

polyfill打包到bundle里面

在各类构建工具配置中,可以把需要的polyfill打包到bundle中,不建议在开发js中import全部polyfill,这会导致最终文件体积过大。通常会把需要用到的polyfill按需写到配置里的plugins中

打包多个页面

针对需要在多个环境下存在的页面可以构建出多个,可根据不同环境给到页面。也可打包出一个通用的页面,根据当前的环境跳到具体的页面

 

document.write的退出是个趋势,我们应该积极使用其他的方案解决,减少使用document.write

 

转载于:https://www.cnblogs.com/daidaidai/p/9638084.html

相关文章:

  • py 的 第 33 天
  • [Vue CLI 3] 配置解析之 css.extract
  • 如何实现360度的手游安全防护?网易云易盾专家分享最新实践
  • 读入优化摸板
  • 有用的生活有关的website
  • 安卓学习阶段的回顾整理
  • ACM-ICPC 2018 焦作赛区网络预赛 A Magic Mirror(签到)
  • Python - 闭包Closure
  • 什么是注入点
  • 网易云易盾关于极验所述问题的致歉和说明
  • workflow的简介
  • Navicat Premium
  • 在python中安装basemap
  • 开拓创新,这才是该做的事情
  • 区块链技术,存在即合理,躺着就赚钱?
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 2017-08-04 前端日报
  • Apache的80端口被占用以及访问时报错403
  • canvas 绘制双线技巧
  • CSS居中完全指南——构建CSS居中决策树
  • EOS是什么
  • java8 Stream Pipelines 浅析
  • JavaScript中的对象个人分享
  • Java程序员幽默爆笑锦集
  • Node + FFmpeg 实现Canvas动画导出视频
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 解决iview多表头动态更改列元素发生的错误
  • 经典排序算法及其 Java 实现
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 学习JavaScript数据结构与算法 — 树
  • 一些关于Rust在2019年的思考
  • 移动端 h5开发相关内容总结(三)
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 通过调用文摘列表API获取文摘
  • # Maven错误Error executing Maven
  • #{}和${}的区别?
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (3)STL算法之搜索
  • (solr系列:一)使用tomcat部署solr服务
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)大型网站架构演变和知识体系
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net framework profiles /.net framework 配置
  • .net 受管制代码
  • .net知识和学习方法系列(二十一)CLR-枚举
  • /dev/sda2 is mounted; will not make a filesystem here!