我发现不少加载Javascript的代码都使用了unescape这个方法,我有点不解,为什么要加呢?我不加的话发现也照样加载成功且运行正常呀。

例如google分析的代码就使用了unescape这个方法:

var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");

document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));

try {

var pageTracker = _gat._getTracker("UA-XXXXX");

pageTracker._trackPageview();

} catch(err) {}

这行的好处是什么:

document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));

对比这行:

document.write("

通过查阅相关资料,发现原来这样写的好处是:这意味着代码可在缺少 CDATA 的 XML / XHTML 和 HTML 中运行。

关于 XML CDATA

所有 XML 文档中的文本均会被解析器解析。

只有 CDATA 区段(CDATA section)中的文本会被解析器忽略。

PCDATA

PCDATA 指的是被解析的字符数据(Parsed Character Data)。

XML 解析器通常会解析 XML 文档中所有的文本。

当某个 XML 元素被解析时,其标签之间的文本也会被解析:

此文本也会被解析

解析器之所以这么做是因为 XML 元素可包含其他元素,就像这个例子中,其中的 元素包含着另外的两个元素(first 和 last):

BillGates

而解析器会把它分解为像这样的子元素:

Bill

Gates

CDATA

术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。

在 XML 元素中,"<" 和 "&" 是非法的。

"<" 会产生错误,因为解析器会把该字符解释为新元素的开始。

"&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始。

某些文本,比如 JavaScript 代码,包含大量 "<" 或 "&" 字符。为了避免错误,可以将脚本代码定义为 CDATA。

CDATA 部分中的所有内容都会被解析器忽略。

CDATA 部分由 "" 开始,由 "" 结束:

</p><p>function matchwo(a,b)</p><p>{</p><p>if (a < b && a < 0) then</p><p>{</p><p>return 1;</p><p>}</p><p>else</p><p>{</p><p>return 0;</p><p>}</p><p>}</p><p>

在上面的例子中,解析器会忽略 CDATA 部分中的所有内容。

关于 CDATA 部分的注释:

CDATA 部分不能包含字符串 "]]>"。也不允许嵌套的 CDATA 部分。

标记 CDATA 部分结尾的 "]]>" 不能包含空格或折行。

转义字符

非法的 XML 字符必须被替换为实体引用(entity reference)。

假如您在 XML 文档中放置了一个类似 "

if salary < 1000 then

为了避免此类错误,需要把字符 "

if salary < 1000 then

在 XML 中有 5 个预定义的实体引用:

< < 小于

> > 大于

& & 和号

' ' 单引号

" " 双引号

注释:严格地讲,在 XML 中仅有字符 "

JavaScript unescape() 函数

定义和用法

unescape() 函数可对通过 escape() 编码的字符串进行解码。

语法

unescape(string)参数 描述

string 必需。要解码或反转义的字符串。

返回值

string 被解码后的一个副本。

说明

该函数的工作原理是这样的:通过找到形式为 %xx 和 %uxxxx 的字符序列(x 表示十六进制的数字),用 Unicode 字符 \u00xx 和 \uxxxx 替换这样的字符序列进行解码。

提示和注释

注释:ECMAScript v3 已从标准中删除了 unescape() 函数,并反对使用它,因此应该用 decodeURI() 和 decodeURIComponent() 取而代之。

实例

在本例中,我们将使用 escape() 来编码字符串,然后使用 unescape() 对其解码:

var test1="Visit W3School!"

test1=escape(test1)

document.write (test1 + "
")

test1=unescape(test1)

document.write(test1 + "
")

输出:

Visit%20W3School%21

Visit W3School!

您可能对以下文章也感兴趣

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐