2010-07-15 58 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(在主流语言)或一些示例代码。