使用“javascript:”伪协议对 URL 进行编码规则?

leo*_*loy 5 html url uri

有没有关于伪协议 URL 的语法和编码的权威参考javascript:?(我知道这没有得到很好的考虑,但无论如何它对于书签很有用)。

首先,我们知道标准URL遵循以下语法:

scheme://username:password@domain:port/path?query_string#anchor
Run Code Online (Sandbox Code Playgroud)

但这种格式似乎不适用于这里。事实上,似乎用URI而不是URL更正确:这里列出了“非官方”格式javascript:{body}

那么,现在嵌入 HTML 时,此类 URI 的有效字符(转义/转义规则是什么)是哪些?

具体来说,如果我有 javascript 函数的代码并且想将其嵌入到javascript:URI 中,要应用哪些转义规则

当然,可以转义每个非字母数字字符,但这会导致代码不可读。我只想转义必要的字符。

此外,很明显,使用某些urlencode / urldecode例程对(它们用于查询字符串值)是不好的,例如,我们不想将“+”解码为空格。

leo*_*loy 5

到目前为止我的发现:

首先,有编写有效 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)
Run Code Online (Sandbox Code Playgroud)

示例(1)有效。而且示例 (2) 也是有效的 HTML 4.01 Strict。为了使其成为有效的 XHTML,我们只需转义 XML 特殊字符< > & (示例 3 是有效的 XHTML 1.0 Strict)。

现在,示例 (2) 是有效的javascript:URI 吗?我不确定,但我想说不是。

来自RFC 2396:URI 受到一些附加限制,特别是通过%xx序列的转义/取消转义。有些字符始终是被禁止的:其中包括空格和{}#

RFC 还定义了 的子集opaque URIs:那些没有分层组件的子集,并且分隔字符没有特殊含义(例如,它们没有“查询字符串”,因此可以?用作任何非特殊字符) 。我认为javascript:URI 应该被考虑在其中。

这意味着javascript:URI 的“正文”内的有效字符是

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

附加限制是它不能以/. 例如,该剧照遗漏了一些“重要”的 ASCII 字符

{}#[]<>^\
Run Code Online (Sandbox Code Playgroud)

另外%(因为它用于转义序列)、双引号"和(最重要的)所有空格。

在某些方面,这似乎相当宽容:重要的是要注意它+是有效的(因此在解码时不应该将其“转义”为空格)。

但在其他方面,它似乎限制太多。大括号和方括号,特别是:我知道它们通常不转义使用,浏览器没有问题。

那么空间呢?作为大括号,RFC 不允许使用它们,但我认为这种 URI 没有问题。但是,我发现在大多数书签中,它们都被转义为“%20”。对此有任何(经验或理论)解释吗?

我仍然不知道是否有一些标准函数可以实现这种转义/转义(在主流语言中)或一些示例代码。