Gahing's blog Gahing's blog
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Gahing / francecil

To be best
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 前端基础

    • 编程语言

      • CSS

      • HTML

        • LearningHTML
        • htmlparser实现
        • inline-block 文本宽度溢出问题
        • svg笔记
        • css与js的阻塞关系
        • document-write重写
          • 前言
          • document.write 的奇妙用法
            • 仅写入开标签,但必要的闭标签在下一个 document.write 中
            • 仅写入开标签,但闭标签非必要
            • 存在script标签
            • 写入标签未闭合,例:<di 暂未能判断是文本还是标签
          • 拓展知识:未知元素与自定义元素
        • getElementsByClassName遍历时出现的问题
        • 前端小知识-格式化标签
        • 前端监听资源加载错误
        • 浅谈 View Transitions API
        • 通读 HTML Standard
      • JavaScript

      • Rust

      • TypeScript

      • WebAssembly

    • 开发工具

    • 前端调试

    • 浏览器原理

    • 浏览器生态

  • 应用框架

  • 工程能力

  • 应用基础

  • 专业领域

  • 业务场景

  • 大前端
  • 前端基础
  • 编程语言
  • HTML
gahing
2018-11-01
目录

document-write重写

# 前言

本文介绍的 document.write 重写方法,会放在文档头部执行,且不影响原先 document.write 的执行时间点。内部执行不再采用 document.write

# document.write 的奇妙用法

html文档是边解释边执行的,所以 write 一部分时,会把这部分放入 html 解析器中。

若没有后续 write ,可能会把 js 代码断作为 html 节点内容的一部分

<script>
document.write("<script>")
// 没有及时写入<\/script>
var a = 1;
// 上面的代码会变成<script>代码中的一部分
1
2
3
4
5

这里我们假设用户的 document.write 用法是正确的,即 write 了开标签,如果不 write 闭标签会出错的话 后面一定会write闭标签。

对于单个节点的write(无父节点等复杂情况),考虑以下几种情况

  1. 仅写入开标签,但必要的闭标签在下一个 document.write 中
  2. 仅写入开标签,但闭标签非必要
  3. 存在script标签
  4. 写入标签未闭合,例:<di 暂未能判断是文本还是标签

# 仅写入开标签,但必要的闭标签在下一个 document.write 中

维护一个 需要必要闭标签的标签列表,第一个write写入了开标签,此时将其暂存,在第二个write的时候再补上 str=leLabel+str

# 仅写入开标签,但闭标签非必要

第一个write写入了开标签,但该标签不在需要必要闭标签的标签列表中,此时将其暂存,在第二个write的时候再补上 str=leLabel+str

# 存在script标签

先写入script前的内容,然后append script 再继续处理script后的内容

# 写入标签未闭合,例:<di 暂未能判断是文本还是标签

<script>
document.write("<spa")
console.log(555)
document.write("n>dsdas</span>")
</script>
1
2
3
4
5

将其当成标签,暂不写入内容,在下一次 document.write 的时候,先判断上下文。

若处于不同 currentScript,说明上一未闭合标签是普通文本,需要补上文本

否则检测本次 write 的文本 是否以 xx> 开头,且(document.createElement(标签名)).__proto__ instanceof HTMLUnknownElement === false 则说明为标签,否则为普通文本

第三方库里面用的自定义元素,(document.createElement(标签名)).__proto__ instanceof HTMLElement === true

# 拓展知识:未知元素与自定义元素

  • 未知元素

<unknownelement>

HTML规范中将没有定义的元素作为 HTMLUnknownElement 进行解析。

  • 自定义元素

<custom-element>

自定义元素则并非如此。如果在创建时使用有效的名称(包含“-”),则潜在的自定义元素将解析为 HTMLElement 。

编辑 (opens new window)
#HTML
上次更新: 2024/09/01, 23:56:56
css与js的阻塞关系
getElementsByClassName遍历时出现的问题

← css与js的阻塞关系 getElementsByClassName遍历时出现的问题→

最近更新
01
浅谈代码质量与量化指标
08-27
02
快速理解 JS 装饰器
08-26
03
Vue 项目中的 data-v-xxx 是怎么生成的
09-19
更多文章>
Theme by Vdoing | Copyright © 2016-2024 Gahing | 闽ICP备19024221号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式