【问题标题】:Why does Internet Explorer need the "hasLayout" flag?为什么 Internet Explorer 需要“hasLayout”标志?
【发布时间】:2010-11-12 20:29:55
【问题描述】:

像许多开发 Internet Explorer 网站的开发人员一样,我似乎遇到了很多由臭名昭著的 hasLayout flag 引起的错误。

我了解此标志的作用及其工作原理(大部分情况下)。前几天我读到的一个很好的解释(虽然我找不到源代码)是 IE 中的hasLayout 本质上意味着“将此元素设为矩形”。

显然比这更复杂,但总结得很好(在我看来)。

我不明白为什么浏览器使用这个标志。在寻找答案时,我找到了一个听起来合乎逻辑的答案:

Internet Explorer 必须处理在 CSS 真正全面展开之前非常古老的遗留代码。作为使浏览器易于添加 CSS 的架构决策,hasLayout 标志用于触发某些 CSS 属性,以便正确呈现页面。这可以追溯到大约 IE4 的时代。

这对我来说几乎是有道理的,直到我意识到 Firefox(当时的 Netscape)必须处理同样的问题。 Netscape 几乎与 Internet Explorer 一样长,但据我所知,它不需要任何内部 hasLayout 标志或类似的东西。

既然hasLayout 标志是 Internet Explorer 中这么多错误的根源,有谁知道为什么 IE 有这个标志而其他浏览器不需要它?

如果有人有任何理论或碰巧知道答案,我纯粹出于好奇想知道这一点。我想更多地了解这个标志为什么(或为什么不)有用。

【问题讨论】:

    标签: css internet-explorer haslayout


    【解决方案1】:

    Netscape 渲染器在 NS4 之后完全重写。 IE 的“三叉戟”渲染引擎没有这样的爱。这个made good business sense - 在 NS 被重写的同时,IE 继续逐步改进,部分是因为这个(部分是因为它的分发安排......)设法占领了巨大的市场份额......

    但最终的结果是一个陈旧、粗糙的代码库,这让开发人员的生活陷入困境,因此他们必须痛苦地意识到应该隐藏哪些实现细节。

    现在,最后一点是关键:浏览器的渲染器是一种抽象,允许您在几行标记中创建需要数百或数千行低级渲染和事件处理代码的东西。和所有的编程抽象一样,它也有一点漏洞……IE、Netscape、Firefox、Opera、Webkit 都是如此……每个浏览器都有developers working feverishly 来堵住抽象中的漏洞。除了,五年来,IE 没有。 其他泄漏被堵塞,但渲染引擎变得越来越像筛子。

    这些因素加在一起,共同暴露hasLayout之类的东西。

    【讨论】:

    • +1 提供客观答案,不会对 Internet Explorer 或使用它的开发人员进行廉价的攻击。
    【解决方案2】:

    不看他们的源代码就很难知道。

    以下链接是迄今为止我发现的信息量最大的:

    第一个引用了一个过时的文档,其中包含一个非常有趣的句子:

    在内部,布局意味着元素负责绘制自己的内容。

    第二个说:

    Explorer 中的对象模型似乎是文档模型及其传统应用程序模型的混合体。

    将两者放在一起,我的猜测是带有 hasLayout 的元素实际上是 Win32 API 意义上的窗口——也就是说,CreateWindow 处理的事情。没有hasLayout 的元素没有它们自己的“窗口”,而是由它们最近的hasLayout 祖先绘制,使用某种布局代码(有点像Qt 的布局类)。因为只有真正的“windows”有布局代码(绘制它们的无布局后代),所以它们是“有布局”的,所以hasLayout

    如果是这样,就会有两种不同的代码路径布局代码(一个用于hasLayout,它必须定位“窗口”,以便以后可以使用普通窗口绘图系统绘制它们,而一种在绘制“窗口”时手动绘制hasLayout“窗口”的孩子)。由于所有代码都有错误(并且轶事证据表明 IE不同错误,这解释了为什么添加或删除 hasLayout(有效地切换到另一个代码路径)更改影响相关元素的错误集。不仅如此,由于您在同一个文档中有两个代码路径,两个代码路径的迭代 将是另一个丰富的细微错误来源。

    其他浏览器可能只是通过使用没有这种双重布局路径的架构来避免这个问题。

    如果我的猜测是正确的,我会说如果你使用一个工具来显示浏览器正在使用的所有子窗口,你会发现每个可见的 hasLayout 元素都有一个,而无布局元素有没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2010-12-20
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 2014-03-28
      相关资源
      最近更新 更多