Internet Explorer的HTML Parser是否会添加非结束标记?

时间:2013-03-15 00:20:25

标签: html html5 internet-explorer internet-explorer-8 internet-explorer-9

当我遇到一个奇怪的错误时,我正在为IE8和IE9中的错误修复错误。 HTML中有一个<section class="create">标记,但在页面加载后,页面下方的标记会完全相同。起初,我认为有一些不好的javascript克隆section不知何故,但我禁用了javascript,并且在页面加载后它仍然存在。这必须是创建此标记的HTML解析器,对吧?渲染的HTML根本不匹配HTML文件。

我知道HTML解析器会在缺少</div>标签或</html>标签等时添加,但IE会重新打开或< em>添加标签出于某种原因?如果是这样,是什么导致这个?如果不是这种情况,那么当禁用javascript时,可能导致HTML中不存在的标记添加到DOM中的原因是什么?

我正在处理的HTML页面超过20,000行,而且整个地方肯定存在格式错误的HTML,其中任何一个都可能导致DOM被不正确地呈现。如果有一个片段,我可以添加这个有用的问题,请在评论中告诉我。

以下是复制此问题的最小HTML。请注意,它只发生在form代码中,而不是div代码中。表单元素关闭后,section标记在IE8和IE9中重新打开,因此创建了2个section元素。

<!DOCTYPE html>
<html>
    <head></head>
    <body>
        <form>
            <section class="create">
                CREATE SECTION
        </form>
    </body>
</html>

这是一个小提琴:http://jsfiddle.net/VurE6/

为了记录,IE10,Chrome,Firefox和Safari都没有显示此行为(我知道)。

1 个答案:

答案 0 :(得分:3)

在某种程度上,所有浏览器都会这样做。例如,试试这个

<b>1<i class="create">2</b>3</i>

在任何浏览器中,你应该看到两个i元素都使用“create”类创建。

关于何时发生这种情况的规则非常复杂,但是当关闭标记不结束其元素后代的效果时会发生这种情况。在IE9中,表单结束标记没有关闭该部分,因此为了使该部分继续,浏览器必须创建第二个部分元素。

虽然这在b和i元素的情况下具有一定的意义,但它对于section没有任何意义,因此在任何实现HTML5解析算法的浏览器中都不会发生这种情况,如IE10和现代Firefox和Chrome,但显然,在IE9中。

有关HTML5如何处理错误的b和i标记问题,请参阅http://www.w3.org/html/wg/drafts/html/master/syntax.html#misnested-tags:-b-i-/b-/i