WHATWG规范中insertion point的含义及相关实现疑问
关于WHATWG规范中“insertion point”的技术疑问解答
1. 「插入点是相对于紧随其后字符的位置,而非输入流中的绝对偏移量」的含义与原因
含义解析
这句话的核心是:插入点的定位不依赖输入流的全局索引,而是绑定到「当前未被解析的输入字符序列中的某个具体位置」——比如输入流剩余字符是"def",插入点在"e"的前方,那么不管之前的"abc"是否被解析器丢弃,插入点始终指代"e"前面的位置,而非用类似“偏移量3”这种全局计数来标记。
为何不采用绝对偏移量
HTML解析器是增量式处理输入流的,会在处理完字符后将其从输入流中丢弃(释放内存,避免长期持有不必要的数据流)。如果用绝对偏移量:
- 当输入流前面的字符被丢弃后,原偏移量会失去参考基准——比如原本偏移量5对应的字符已经被处理删除,此时偏移量5指向的是不存在的位置,无法准确定位。
- 相对位置绑定的是未处理的字符节点,只要目标字符还在输入流中,插入点就有明确的指向,完全不受已处理字符的影响。
2. 结合document.write上下文的插入点逻辑与输入流丢弃场景的理解
document.write中的插入点流程
在处理document.write时,规范的逻辑是为了保证脚本执行前后解析器能正确回到原位置:
令旧插入点的值与当前插入点相同。令插入点位于下一个输入字符的正前方。
令插入点的值为旧插入点的值。(换句话说,将插入点恢复为之前的值。该值可能为“undefined”。)
- 首次执行时插入点为
undefined,对应解析器尚未开始处理输入、或没有明确的待插入位置的初始状态。 - 执行
prepare the script element后恢复旧插入点,是为了让脚本执行完后,解析器能回到脚本开始执行前的位置,继续处理原本的输入流,避免因为document.write插入内容而打乱原解析顺序。
输入流丢弃字符时的插入点有效性
当输入流随时间丢弃开头字符时,插入点的相对定位逻辑反而避免了模糊:
- 插入点始终关联的是未被处理的剩余输入流的位置,而非整个原始输入流的全局位置。
- 比如解析器处理完
<head>部分后,会丢弃已处理的<head>相关字符,剩余输入流是<body>及后续内容,此时插入点如果原本指向<body>的前方,会自动跟随剩余输入流的起始位置,不会因为前面的字符被丢弃而失效。 - 若使用绝对偏移量,此时原偏移量会指向已被丢弃的
<head>区域,完全无法对应到当前剩余的输入流,导致定位混乱。
内容的提问来源于stack exchange,提问作者MaximPro
相关产品推荐
相关产品推荐

