数据 URI 的特征
甲数据-URI与MIME类型text/html
必须是在其中一种格式:
data:text/html,<HTML HERE>
data:text/html;charset=UTF-8,<HTML HERE>
不需要 Base-64 编码。如果您的代码包含非 ASCII 字符,例如éé
,charset=UTF-8
则必须添加。
以下字符必须被转义:
#
- Firefox 和 Opera 将此字符解释为散列的标记(如location.hash
)。
%
- 此字符用于转义字符。转义此字符以确保不会发生副作用。
此外,如果要将代码嵌入锚标记中,还应转义以下字符:
" and/or '
- 引号标记属性的值。
&
- 与号用于标记 HTML 实体。
<
并且>
也没有进行转义一个HTML属性中。但是,如果您要在 HTML 中嵌入链接,这些也应该被转义 ( %3C and %3E
)
JavaScript 实现
如果您不介意数据 URI 的大小,最简单的方法是使用encodeURIComponent
:
var html = document.getElementById("html").innerHTML;
var dataURI = 'data:text/html,' + encodeURIComponent(html);
如果大小很重要,您最好去掉所有连续的空格(这可以安全地完成,除非 HTML 包含<pre>
element/ style)。然后,只替换重要字符:
var html = document.getElementById("html").innerHTML;
html = html.replace(/\s{2,}/g, '') // <-- Replace all consecutive spaces, 2+
.replace(/%/g, '%25') // <-- Escape %
.replace(/&/g, '%26') // <-- Escape &
.replace(/#/g, '%23') // <-- Escape #
.replace(/"/g, '%22') // <-- Escape "
.replace(/'/g, '%27'); // <-- Escape ' (to be 100% safe)
var dataURI = 'data:text/html;charset=UTF-8,' + html;