2010-07-15 42 views
4

是否有關於僞協議javascript:的URL的語法和編碼的權威性參考? (我知道這不是很好考慮,但無論如何,它對bookmarklets很有用)。使用`javascript:`僞協議對URL進行編碼規則?

首先,我們知道,標準URLs遵循語法:

scheme://username:[email protected]:port/path?query_string#anchor 

,但這種格式似乎並不適用於此。實際上,看起來更準確的說法是URI而不是URLhere被列爲「非官方」格式javascript:{body}

現在,在嵌入到HTML中時,這些URI的有效字符(escape/unescape規則)是什麼?

具體來說,如果我有一個JavaScript函數的代碼,我想將它嵌入在javascript: URI,這是適用逃生規則?

當然,人們可以逃避每個非字母數字字符,但這會過度殺傷,使代碼無法讀取。我只想逃避必要的角色。例如,如果使用一些urlencode/urldecode例程對(那些查詢字符串值),我們不想將「+」解碼爲空格,這很明顯。

回答

4

我的調查結果,到目前爲止:

首先是寫一個有效的HTML屬性值的規則:但是這裏的標準只要求(如果要是用引號括起來的屬性值)任意CDATA(實際上是一種%URI,但是HTML本身並沒有在其級別上進行額外的驗證:任何CDATA都會驗證)。

一些例子:

<a href="javascript:alert('Hi!')">  (1) 
<a href="javascript:if(a > b && 1 < 0) alert( b ? 'hi' : 'bye')"> (2) 
<a href="javascript:if(a&gt;b &amp;&&amp; 1 &lt; 0) alert(b ? 'hi' : 'bye')"> (3) 

實施例(1)是有效的。但是例子(2)也是有效的HTML 4.01 Strict。爲了使XHTML有效,我們只需要轉義XML特殊字符< > &(示例3是有效的XHTML 1.0 Strict)。

現在,示例(2)有效的javascript: URI?我不確定,但我會說這不是。

RFC 2396:一個URI受到一些額外的限制,特別是通過%xx序列的escape/unescape。並且一些字符總是被禁止的: 其中的空格和{}#

RFC還定義了opaque URIs的一個子集:那些沒有分層組件並且分隔字符沒有特殊含義的子集(例如,它們沒有'查詢字符串',所以可以使用?作爲任何非特殊字符)。我認爲其中應該考慮使用javascript: URI。

這將意味着一個javascript: URI的「體」內的有效字符

a-zA-Z0-9 
_|. !~*'();?:@&=+$,/- 
%hh : (escape sequence, with two hexadecimal digits) 

與它不能與/開始額外的限制。 此劇照留下了一些「重要」的ASCII字符,例如

{}#[]<>^\ 

而且%(因爲它使用轉義序列),雙引號"和(最重要的),全部爲空白。

在某些方面,這看起來相當寬容:重要的是要注意+是有效的(因此,當解碼時,它不應該是'未轉義',作爲空間)。

但在其他方面,它似乎太嚴格了。大括號和括號,特別是:我明白,他們通常使用非轉義和瀏覽器沒有問題。

那麼空間呢?作爲大括號,它們被RFC所禁止,但我在這種URI中看不到任何問題。但是,我發現在大多數小書籤中,它們被轉義爲「%20」。有沒有(經驗或理論)的解釋呢?

我仍然不知道是否有一些標準函數來使這個escape/unescape(在主流語言)或一些示例代碼。