Browse Source

讲解 parseEndTag 函数的功能

HcySunYang 7 years ago
parent
commit
a395ad5e82
1 changed files with 15 additions and 0 deletions
  1. 15 0
      note/9Vue中的html-parser.md

+ 15 - 0
note/9Vue中的html-parser.md

@@ -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>`。
+
+
+