Очень трудно понять, не имея возможности взглянуть на их исходный код.
Следующие ссылки являются наиболее информативными, которые я нашел до сих пор:
Первый цитирует устаревший документ, который содержит очень интересное предложение:
Внутренне наличие макета означает, что элемент отвечает за отрисовку своего собственного содержимого.
А второй говорит:
Объектная модель внутри Explorer выглядит как гибрид модели документа и их традиционной модели приложения.
Соединяя оба, я предполагаю, что элементы с hasLayout
на самом деле являются окнами в смысле Win32 API & mdash; то есть вещи, с которыми имеет дело CreateWindow
. Элементы без hasLayout
тогда не имеют своего собственного «окна», но отрисовываются их ближайшим hasLayout
-представителем, используя некоторый код компоновки (что-то вроде классов компоновки Qt). Поскольку только истинные «окна» имеют код макета (который рисует их потомков без макета), именно они «имеют макет», поэтому hasLayout
.
Если это так, то будет два разных кода расположения путей кода (один для hasLayout
, который должен был бы позиционировать «окна», чтобы их можно было рисовать позже, используя обычную систему рисования окон, и тот, который рисует дочерние элементы hasLayout
«окна» вручную при рисовании «окна»). Поскольку во всем коде есть ошибки (а в анекдотических данных говорится, что IE <= 6 имеет больше среднего), оба пути кода будут содержать <em>разных ошибок, объясняя, почему добавление или удаление hasLayout
(фактически переключение на другой код путь) изменяет набор ошибок, влияющих на рассматриваемый элемент. Более того, поскольку в одном и том же документе работают два пути кода, итерация обоих путей кода станет еще одним богатым источником незаметных ошибок.
Другие браузеры, вероятно, избежали этой проблемы, просто используя архитектуру, которая не имеет такой двойной путь компоновки.
Если мои предположения верны, я бы сказал, что если бы вы использовали инструмент, чтобы показать все дочерние окна, которые использует браузер, вы бы обнаружили, что каждый видимый элемент hasLayout
имеет его, в то время как элементы без компоновки делают не один.