3

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

我了解这个标志的作用以及它是如何工作的(大部分情况下)。我前几天读到的一个很好的解释(虽然我找不到源代码)是hasLayout在 IE 中基本上意味着“使这个元素成为一个矩形”。

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

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

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

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

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

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

4

2 回答 2

11

Netscape 渲染器在 NS4 之后完全重写。IE 的“三叉戟”渲染引擎没有这样的爱。这具有很好的商业意义——在重写 NS 的同时,IE 继续逐步改进,部分原因是(部分原因是它的分发安排......)设法占领了巨大的市场份额......

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

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

这些 to 因素共同揭示了诸如hasLayout.

于 2009-07-22T01:44:13.013 回答
2

如果不查看他们的源代码,很难知道。

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

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

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

第二个说:

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

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

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

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

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

于 2009-07-22T02:55:54.437 回答