最近在写html分析程序,应为chrome的“开发人员工具”可以直接看到浏览器对代码的分析情况,比较方便,所以选择它作为分析结果的参照。
出于容错方面的考虑,我会有意写一些不标准的html代码来做测试,并查看是否与chrome的分析结果一致。在偶然间发现了这个小bug。
<div ="k">aaa</div>
此时chrome显示的html代码为
<div k="k">aaa</div>
当一个属性值被单引号或者双引号包围放在等号右侧,并且没有属性名在左侧的时候,chrome会把这个属性值作为属性名复制到左侧。前提是等号与引号包围,等号两侧可以有空格并不限数量,引号包围的值可以是任意值。
可以测试一下这个属性是否有效
<div ="k" onclick="(function(o){alert(o.getAttribute('k'));})(this)">aaa</div>
在chrom下这个点击事件正确地返回了属性k的值,但ie和ff均为null。
比较致命的是,引号包围内的值可以是任意值:
<div ="alert(1>0)">aaa</div>
chrome认为是:
<div alert(1="alert(1">0)">aaa</div>
看着有点乱我解释一下。它首先取了alert(1>0)这一段,并且忽略了>之后的代码,因为它认为这个>是封闭标签的字符,剩下alert(1作为属性值和属性名,并规范为alert(1="alert(1"。但是对之后的代码仅仅是做了替换,留下了>0)"这4个字符。重新分析的时候,在这4个字符中0之前的>号封闭了div标签,剩下的就作为文本显示到前台了。
ie6/ff3.6.8均无此问题。