就像许多在网站上为Internet Explorer工作的开发人员一样,我似乎遇到了许多臭名昭著的错误 hasLayout 旗帜.

我了解该标志的作用以及它的工作原理(大部分)。前几天我读过的一个很好的解释(尽管我找不到来源)是 hasLayout 在IE中,本质上是指“使此元素成为矩形”。

显然,这比这更复杂,但是对此总结了(我认为)。

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

Internet Explorer必须从CSS真正如火如荼之前处理非常古老的旧代码。作为使浏览器易于添加CSS的架构决定, hasLayout 使用标志来触发某些CSS属性,因此该页面将正确渲染。这可以追溯到IE4时期。

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

看到如何 hasLayout 标志是Internet Explorer中这么多错误的来源,有人知道为什么IE具有此标志,而其他浏览器不需要它?

如果有人有任何理论或碰巧知道答案,这是我想完全出于好奇的事情。我想更多地了解为什么(或为什么不)此标志有用。

有帮助吗?

解决方案

Netscape渲染器是在NS4后完全重写的。 IE的“三叉戟”渲染引擎没有这样的爱。这个 良好的商业意义 - IE在重写NS时继续逐步改善,部分原因是(部分原因是其分销安排...)设法占据了很大的市场份额...

但是最终结果是一个旧的,肮脏的代码库,使开发人员的生活变得地狱,因此必须痛苦地意识到什么 应该 隐藏实现细节。

现在,最后一点是关键:浏览器的渲染器是一个抽象,使您可以在几行标记中创建,这些标记将需要数百或数千行低级渲染和事件处理代码。和所有编程摘要一样,它泄漏了一点...对于IE,Netscape,Firefox,Opera,WebKit ...这是正确的... 开发人员狂热地工作 插入抽象中的泄漏。除了五年以外,IE没有。 其他 泄漏被堵塞,但渲染引擎变得越来越像筛子。

这些因素在一起,共同揭露 hasLayout.

其他提示

在没有能够查看其源代码的情况下,很难知道。

以下链接是我到目前为止发现的最有用的链接:

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

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

第二个说:

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

将两者放在一起,我的猜测是与 hasLayout 实际上是win32 API意义上的Windows - 也就是说,事物 CreateWindow 对付。没有的元素 hasLayout 然后没有自己的“窗口”,而是由他们最近的 hasLayout- 使用某种布局代码(有点像QT的布局类)。由于只有真实的“ Windows”具有布局代码(绘制其布局的后裔),因此它们是“具有布局”的代码,因此 hasLayout.

如果是这种情况,将有两个不同的代码路径布局代码(一个用于 hasLayout, ,必须将“窗口”放置,以便以后使用普通窗口绘图系统绘制它们,以及绘制孩子的孩子 hasLayout 绘制“窗口”时手动“窗口”)。由于所有代码都有错误(anedoctal证据表明IE <= 6的平均水平都高),因此两个代码路径都有 不同的 错误,解释为什么添加或删除 hasLayout (有效切换到其他代码路径)更改影响所讨论元素的错误集。不仅如此,而且由于您在同一文档中有两个代码路径,因此 迭代 这两种代码路径中都将是另一个富裕的错误来源。

其他浏览器可能仅通过使用没有这种双重布局路径的体系结构来避免问题。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top