|
|
|
|
|
我發(fā)現(xiàn)不少加載Javascript的代碼都使用了unescape這個方法,我有點不解,為什么要加呢?我不加的話發(fā)現(xiàn)也照樣加載成功且運行正常呀。
例如google分析的代碼就使用了unescape這個方法:
<script type="text/javascript">
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"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-XXXXX");
pageTracker._trackPageview();
} catch(err) {}</script>
這行的好處是什么:
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
對比這行:
document.write("<script src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'><\/script>");
通過查閱相關資料,發(fā)現(xiàn)原來這樣寫的好處是:
這意味著代碼可在缺少 CDATA 的 XML / XHTML 和 HTML 中運行。
所有 XML 文檔中的文本均會被解析器解析。
只有 CDATA 區(qū)段(CDATA section)中的文本會被解析器忽略。
PCDATA 指的是被解析的字符數(shù)據(jù)(Parsed Character Data)。
XML 解析器通常會解析 XML 文檔中所有的文本。
當某個 XML 元素被解析時,其標簽之間的文本也會被解析:
<message>此文本也會被解析</message>
解析器之所以這么做是因為 XML 元素可包含其他元素,就像這個例子中,其中的 <name>
元素包含著另外的兩個元素(first 和 last):
<name><first>Bill</first><last>Gates</last></name>
而解析器會把它分解為像這樣的子元素:
<name>
<first>Bill</first>
<last>Gates</last>
</name>
術語 CDATA 指的是不應由 XML 解析器進行解析的文本數(shù)據(jù)(Unparsed Character Data)。
在 XML 元素中,"<" 和 "&" 是非法的。
"<" 會產(chǎn)生錯誤,因為解析器會把該字符解釋為新元素的開始。
"&" 也會產(chǎn)生錯誤,因為解析器會把該字符解釋為字符實體的開始。
某些文本,比如 JavaScript 代碼,包含大量 "<" 或 "&" 字符。為了避免錯誤,可以將腳本代碼定義為 CDATA。
CDATA 部分中的所有內(nèi)容都會被解析器忽略。
CDATA 部分由 "<![CDATA[" 開始,由 "]]>" 結束:
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1;
}
else
{
return 0;
}
}
]]>
</script>
在上面的例子中,解析器會忽略 CDATA 部分中的所有內(nèi)容。
CDATA 部分不能包含字符串 "]]>"。也不允許嵌套的 CDATA 部分。
標記 CDATA 部分結尾的 "]]>" 不能包含空格或折行。
非法的 XML 字符必須被替換為實體引用(entity reference)。
假如您在 XML 文檔中放置了一個類似 "<" 字符,那么這個文檔會產(chǎn)生一個錯誤,這是因為解析器會把它解釋為新元素的開始。因此你不能這樣寫:
<message>if salary < 1000 then</message>
為了避免此類錯誤,需要把字符 "<" 替換為實體引用,就像這樣:
<message>if salary < 1000 then</message>
在 XML 中有 5 個預定義的實體引用:
< | < | 小于 |
> | > | 大于 |
& | & | 和號 |
' | ' | 單引號 |
" | " | 雙引號 |
注釋:嚴格地講,在 XML 中僅有字符 "<"和"&" 是非法的。單引號、雙引號和大于號是合法的,但是把它們替換為實體引用是個好的習慣。
unescape()
函數(shù)可對通過 escape()
編碼的字符串進行解碼。
unescape(string)
參數(shù) | 描述 |
---|---|
string | 必需。要解碼或反轉義的字符串。 |
string 被解碼后的一個副本。
該函數(shù)的工作原理是這樣的:通過找到形式為 %xx 和 %uxxxx 的字符序列(x 表示十六進制的數(shù)字),用 Unicode 字符 \u00xx 和 \uxxxx 替換這樣的字符序列進行解碼。
注釋:ECMAScript v3 已從標準中刪除了 unescape()
函數(shù),并反對使用它,因此應該用 decodeURI()
和 decodeURIComponent()
取而代之。
在本例中,我們將使用 escape()
來編碼字符串,然后使用 unescape()
對其解碼:
<script type="text/javascript">
var test1="Visit W3School!"
test1=escape(test1)
document.write (test1 + "<br />")
test1=unescape(test1)
document.write(test1 + "<br />")
</script>
輸出:
Visit%20W3School%21
Visit W3School!