关于 HTML 元素的 Attribute 的转义问题
说起来,这么多年,我一直没有彻底搞清楚过。比如,哪些字符需要转义,中文要不要转义,URL 呢?
对于第一个问题:
我在评论功能的代码里面已经解释得比较清楚了(之所以需要这部分代码而没有使用 innerText/innerHTML
的方式让浏览器帮我正确地转义,是因为目前部分内容还是通过手动拼接 HTML 的方式构成的,需要找时间换成 <template/>
以及 ShadowDOM):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
对于后面两个问题,一开始觉得按照第一步做完就已经足够了,原因:转义的目的只是为了不导致 HTML 解析的时候出现歧义,并没有其它目的。比如:防止 Attribute.Value 被中的引号/大于/小于符号对标签的错误解析。上面👆代码中的链接非常清楚地解释了什么时候会引起歧义。
但是今天用 Go 的 "html/template"
渲染一段单测的时候,竟然挂了,就是下面这个:
1 2 |
|
结果如下:
1 2 |
|
这让我有点儿意外,因为以前觉得: URL 在 Attribute 里面根本不会引起歧义,根本没必要转义,所以我就算是手写 HTML 的时候,也不会特意去转义(实际上,不转义大部分时候也不会有问题)。所以我在写单测的时候期待结果也不是转义的结果,然后就挂了。
1 2 3 4 5 6 7 8 9 |
|
解答了我的疑惑:确实会先 URL 转义,然后 Attribute 转义。 但,只针对特定的 Attribute Name。然后,我找到了这份列表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
而 Go 的这份列表,引用自 W3C:
-
https://www.w3.org/TR/html4/index/attributes.html
Type
为%URI
的就是除必须的 Attribute 转义外还需要 URL 转义的。 -
https://html.spec.whatwg.org/multipage/indices.html#attributes-1
以及这里面的
Value
与URL
相关的。
里面清晰地定义了,对于 URL,哪些字符需要转义、如何转义。 也可以参考维斯百科,也解释得很清楚,更简单。