|
@@ -1150,3 +1150,18 @@ function parseEndTag (tagName, start, end) {
|
|
|
<article><section></section></article><div>
|
|
|
```
|
|
|
|
|
|
+在解析这段 `html` 字符串的时候,首先会遇到两个非一元标签的开始标签,即 `<article>` 和 `<section>`,并将这两个标签 `push` 到 `stack` 栈中。然后会一次遇到与 `stack` 栈中相对应的结束标签 `</section>` 和 `</article>`,在解析完这两个结束标签之后 `stack` 栈应该是空栈。紧接着又遇到一个开始标签,也就是 `<div>` 标签,这是一个非一元标签的开始标签,所以会将该标签 `push` 到 `stack` 栈中。这样上面这段 `html` 字符串就解析完成了,大家发现什么问题没有?没错问题就是:**`stack` 栈非空**。`stack` 栈中还残留最后遇到的 `<div>` 开始标签没有被处理,所以 `parseEndTag` 函数的另外一个作用就是处理剩余未被处理的标签。
|
|
|
+
|
|
|
+除了这些功能之外,`parseEndTag` 函数还会做一件事儿,如果你感兴趣你可以在任何 `html` 文件中写下如下内容:
|
|
|
+
|
|
|
+```html
|
|
|
+<body>
|
|
|
+ </br>
|
|
|
+ </p>
|
|
|
+</body>
|
|
|
+```
|
|
|
+
|
|
|
+上面的 `html` 片段中,我们分别写了 `</br>`、`</p>` 的结束标签,但注意我们并没有写其实标签,然后浏览器是能够正常解析他们的,其中 `</br>` 标签被正常解析为 `<br>` 标签,而 `</p>` 标签被正常解析为 `<p></p>`。除了 `br` 与 `p` 其他任何标签如果你只写了结束标签那么浏览器都将会忽略。所以为了与浏览器的行为相同,`parseEndTag` 函数也需要专门处理 `br` 与 `p` 的结束标签,即:`</br>` 和 `</p>`。
|
|
|
+
|
|
|
+
|
|
|
+
|