前端的各种转义
在使用 外部数据 时,以下场景下我们要考虑转义:
- 作为 HTML 的一部分
- 作为 JS 的一部分
- 作为 innerHTML
- 作为 url 或 url 的组件
- 作为表单数据提交
作为 HTML 的内容
<div> %content% </div>
HTML中 < > & 等有特殊含义( < > 用于标签,& 用于转义),不能直接使用。如果你不希望自己写的 <xxx> 被当做标签解析,就需要做转换为对应的字符实体(或者实体编号)。
显示 |字符实体  | 实体编号
<   |&lt;  |&\#60;
>   |&gt;  |&\#62;
&   |&amp; |&\#38;
"   |&quot;|&\#34;
'   |&apos;|&\#39;
上面这 5 个转义是浏览器必须支持的。完整列表见这里。
举例来说,如果你想在 HTML 页面里显示 & 这 5 个字符,直接在 HTML 代码里写 &,你会在浏览器中只看见一个 & ;你只能在 HTML 代码里写 &amp;。
再比如,你想在页面中显示 <hello tag>,那么代码里应该写 <hello tag>。
作为 JS 的内容(尤其是字符串)
<script>var test = '%content%' ;</script>
显然 %content% 中出现引号会引发问题,所以我们需要把 ' 和 " 替换为 \' 和 \"。
另外如果 %content% 中出现 \ 则会把后面的字符给转义了,所以也要替换。如果 %content% 中出现 */ 则可能会影响原本的的注释,所以 / 要替换为 \/ 。
显示    | 代码
-------|--------
"      |\"
'      |\'
\      |\\
/      |\/
作为 innerHTML
<div id="test"></div> 
<script>
var content = '%content%';
document.getElementById('test').innerHTML = content; 
</script>
首先 %content% 是作为 JS 的内容,所以需要对 " ' \ /进行转义。其次它才作为 HTML 的内容,对< > & " ' 进行转义。
作为 URL
<iframe src="%content%"></iframe>
这个前端同学都知道,使用 encodeURI 方法将字符串变为可用的 URL 即可: (下面一行是转义后的结果)
~ ! @ # $ %   ^   & * ( ) {   }   [   ]   = : / , ; ? + ' "   \   
~ ! @ # $ %25 %5E & * ( ) %7B %7D %5B %5D = : / , ; ? + ' %22 %5C
作为 URL 的组件(URIComponent)
<iframe src="http://qq.com/index.html?p=%content%/"></iframe>
使用 encodeURIComponent 方法:
~ ! @   #   $   %   ^   &   * ( ) {   }   [   ]   =   :   /   ,   ;   ?   +   ' "   \
~ ! %40 %23 %24 %25 %5E %26 * ( ) %7B %7D %5B %5D %3D %3A %2F %2C %3B %3F %2B ' %22 %5C
作为表单数据提交
form 表单的 enctype 属性规定了在发送到服务器之前应该如何对表单数据进行编码。默认地,表单数据会编码为 "application/x-www-form-urlencoded"。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值)。
如果你给 form 表单加上 enctype="text/plain",那么提交的数据就不会做任何编码。