首先,我们知道标准URLs遵循以下语法:
scheme://username:password@domain:port/path?query_string#anchor
但这种格式似乎不适用于此.事实上,似乎说URI而不是URL更为正确:here列出了“非官方”格式JavaScript:{body}.
那么,当嵌入HTML时,这些URI的有效字符是什么(转义/ unescape规则是什么)?
具体来说,如果我有一个JavaScript函数的代码,我想将它嵌入到JavaScript:URI中,这是要应用的转义规则吗?
当然,人们可以逃脱每个非风险的角色,但这样做会有些过分并使代码难以理解.我想只逃避必要的角色.
此外,很明显使用一些urlencode/urldecode例程对(那些用于查询字符串值)会很糟糕,例如,我们不想将”解码为空格.
解决方法 到目前为止我的发现:首先,有一些编写有效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>b &&& 1 < 0) alert( b ? 'hi' : 'bye')"> (3)
示例(1)有效.但是例子(2)也是有效的HTML 4.01 Strict.为了使它成为有效的@R_301_6000@,我们只需要转义XML特殊字符< > &安培; (示例3是有效的@R_301_6000@ 1.0 Strict). 现在,示例(2)是一个有效的JavaScript:URI吗?我不确定,但我会说不是. 从RFC 2396开始:URI受到一些额外限制,特别是通过%xx序列的escape / unescape.并且一些角色总是被禁止:
其中空格和{}#.
RFC还定义了不透明URI的子集:那些没有分层组件的URI,并且分离字符没有特殊含义(例如,它们没有’查询字符串’,所以?可以用作任何非特殊字符).我假设JavaScript:URI应该被考虑在其中.
这意味着JavaScript:URI的’body’中的有效字符是
a-zA-Z0-9 _|. !~*'();?:@&=+$,/- %hh : (escape sequence,with two hexadecimal digits)
有一个额外的限制,它不能以/开头.
例如,这仍然会遗漏一些“重要的”ASCII字符
{}#[]<>^\
同样%(因为它用于转义序列),双引号“和(最重要的)所有空白.
在某些方面,这看起来非常宽松:重要的是要注意它是有效的(因此在解码时不应该’未转义’,作为空格).
但在其他方面,它似乎过于严格.大括号和括号,特别是:我知道它们通常是未转义的,浏览器也没有问题.
空间怎么样?作为大括号,它们不被RFC所禁止,但我认为这种URI没有问题.但是,我发现在大多数bookmarklet中它们都被转义为“”.对此有任何(经验或理论上的)解释吗?
我仍然不知道是否有一些标准函数可以使这个转义/ unescape(在主流语言中)或一些示例代码.
总结以上是内存溢出为你收集整理的html – 使用`javascript:`伪协议编码URL的规则?全部内容,希望文章能够帮你解决html – 使用`javascript:`伪协议编码URL的规则?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)