代码之家  ›  专栏  ›  技术社区  ›  Dan Herbert

为什么Internet Explorer需要“hasLayout”标志?

  •  3
  • Dan Herbert  · 技术社区  · 15 年前

    像许多为Internet Explorer开发网站的开发人员一样,我似乎遇到了许多由臭名昭著的 hasLayout flag .

    我理解这个标志的作用以及它的工作方式(大部分)。前几天我读到的一个很好的解释是 哈斯布局 在IE中,本质上意味着“使这个元素成为一个矩形”。

    这显然比这复杂得多,但在我看来,这可以很好地概括为这一点。

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

    InternetExplorer必须处理非常古老的遗留代码,而在CSS真正全面运行之前。作为使浏览器易于添加CSS的体系结构决策, 哈斯布局 标志用于触发某些CSS属性,以便正确呈现页面。这可以追溯到IE4时代。

    这对我来说几乎是有意义的,直到我意识到火狐(当时的Netscape)必须处理同样的问题。Netscape和Internet Explorer一样存在很长时间,但是它不需要任何内部 哈斯布局 据我所知,是旗子或类似的东西。

    看作为如何 哈斯布局 标记是Internet Explorer中如此多错误的来源,有人知道IE为什么有这个标记,而其他浏览器不需要它吗?

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

    2 回复  |  直到 15 年前
        1
  •  11
  •   Shog9    15 年前

    Netscape渲染器在NS4之后被完全重写。IE的“三叉戟”渲染引擎没有这样的爱。这个 made good business sense

    但最终的结果是一个古老的、简陋的代码库,它使开发人员的生活陷入地狱,因此开发人员必须痛苦地意识到 应该 隐藏实现细节。

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

    总之,这些因素共同暴露了 hasLayout .

        2
  •  2
  •   CesarB    15 年前

    如果不能够查看它们的源代码,就很难知道。

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

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

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

    第二个说:

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

    把两者结合起来,我猜是元素 hasLayout 实际上,Windows是从win32 api的意义上说的——也就是说,事情 CreateWindow 处理。没有的元素 哈斯布局 那就没有自己的“窗口”,而是由最近的窗口绘制 哈斯布局 -有祖先,使用某种布局代码(有点像qt的布局类)。因为只有真正的“窗口”才有布局代码(它绘制的布局描述更少),所以它们是“有布局”的,所以 哈斯布局 .

    如果是这种情况,将有两个不同的代码路径布局代码(一个用于 哈斯布局 ,它必须定位“窗口”,以便以后使用普通窗口绘制系统绘制它们,以及绘制 哈斯布局 绘制“窗口”时用手“窗口”)。由于所有代码都有错误(并且有一个理论证据表明ie<=6的错误超过了平均值),两个代码路径都会有 不同的 错误,解释添加或删除的原因 哈斯布局 (有效地切换到其他代码路径)更改影响相关元素的错误集。不仅如此,而且由于在同一文档中有两个代码路径,所以 迭代 在这两种代码路径中,另一种丰富的细微错误源。

    其他浏览器可能只是通过使用不具有这种双布局路径的体系结构来避免这个问题。

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

    推荐文章