zoukankan      html  css  js  c++  java
  • Chrome在解析html时的一个bug

    最近在写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均无此问题。

  • 相关阅读:
    SSL 1579——泽泽在巴西
    SSL 1644——取数字问题
    SSL 1589——火车票
    SSL 1506——打鼹鼠
    SSL 1212——大厅安排
    洛谷 1064——金明的预算方案(动态规划的背包问题)
    SSL 1463——公共子串
    SSL 1461——最大连续数列的和
    SSL 1643——最小乘车费用
    SSL 1460——最小代价问题
  • 原文地址:https://www.cnblogs.com/muse/p/1809455.html
Copyright © 2011-2022 走看看