¿Por qué necesita Internet Explorer la bandera “hasLayout”?
-
18-09-2019 - |
Pregunta
Al igual que muchos desarrolladores que trabajan en los sitios web de Internet Explorer, me parece que venir a través de un montón de errores que son causadas por el notorio bandera hasLayout
.
Yo entiendo lo que hace esta bandera y cómo funciona (en su mayor parte). Una buena explicación que leí el otro día (aunque no puedo encontrar la fuente) es que hasLayout
en IE esencialmente significa "Hacer este elemento un rectángulo."
Es obvio que es más complicado que eso, pero está bastante bien resumir con que (en mi opinión).
Lo que no entiendo es por qué el navegador utiliza este indicador. Al buscar una respuesta, encontré uno que sonaba lógico:
Internet Explorer tuvo que lidiar con el código heredado muy antigua de delante CSS estaba realmente en plena marcha. Como una decisión arquitectónica para hacer que el navegador fácil de añadir CSS a ella, se utilizó la bandera
hasLayout
para desencadenar ciertas propiedades CSS para que la página se procesa de forma correcta. Esto se remonta a alrededor del momento del IE4.
Esto casi tenía sentido para mí, hasta que se dio cuenta de que Firefox (Netscape en ese momento) tuvo que lidiar con el mismo problema. Netscape ha sido de alrededor de más o menos el tiempo que Internet Explorer, sin embargo, no necesita ninguna bandera hasLayout
interna, o algo similar, por lo que yo sé.
En vista de que la bandera hasLayout
es la fuente de muchos errores en Internet Explorer, ¿alguien sabe por qué IE tiene esta bandera y otros navegadores no lo necesita?
Esto es algo que me gustaría saber puramente por curiosidad si alguien tiene alguna teoría o pasa a saber la respuesta. Me gustaría entender más acerca de por qué (o por qué no) esta bandera es útil.
Solución
El procesador de Netscape fue completamente re-escrito post-NS4. "Trident" motor de renderizado de IE no obtuvo tal amor. Este rel="noreferrer"> - IE continuó mejorando gradualmente mientras NS estaba siendo re-escrito, y en parte debido a esto (y en parte debido a su acuerdo de distribución ...) logrado captar una gran parte del mercado ...
Sin embargo, el resultado final es un antiguo código base, enrevesada que hace la vida imposible a los desarrolladores, que por lo tanto debe ser muy consciente de lo que debe BE detalles de implementación ocultos.
Ahora, este último punto es clave: render de un navegador es una abstracción, lo que permite crear en unas pocas líneas de marcado algo que podría tener cientos o miles de líneas de representación de bajo nivel y el código de control de eventos. Y como todas las abstracciones de programación, se escapa un poco ... Esto es cierto para IE, Netscape, Firefox, Opera, Webkit ... y cada navegador tiene los desarrolladores que trabajan febrilmente para tapar las fugas en las abstracciones. Excepto, por cinco años, es decir no lo hizo. Otros fugas fueron enchufado, pero el motor de renderizado se hizo más y más similar a un tamiz.
En conjunto, estos factores conspiran para exponer cosas como hasLayout
.
Otros consejos
Es muy difícil saber sin ser capaz de mirar a su código fuente.
Los siguientes enlaces son los más informativos que he encontrado hasta ahora:
La primera cita un documento obsoleto que contiene una frase muy interesante:
A nivel interno, teniendo la disposición significa que un elemento es responsable de la elaboración de su propio contenido.
Y el segundo dice:
El modelo de objetos en el interior Explorador parece ser un híbrido de un modelo de documento y su modelo tradicional de aplicaciones.
Poniendo los dos juntos, mi suposición es que los elementos con hasLayout
están en ventanas de datos en el sentido de la API de Win32 - es decir, las cosas CreateWindow
trata. Los elementos sin hasLayout
entonces no tienen su propia "ventana", pero se sienten atraídos por su antepasado hasLayout
que tiene más cercano, mediante algún tipo de código de diseño (algo así como clases de diseño de Qt). Dado que sólo los verdaderos "ventanas" tienen el código de diseño (que atrae a sus Descentants esquemas de menos), que son los que "tienen el diseño", por lo hasLayout
.
Si ese es el caso, habría dos rutas de código código de diseño diferente (el de hasLayout
, que tendría que situar las "ventanas" para que puedan extraerse más tarde usando el sistema normal de dibujo ventana, y la que atrae a los niños de la "ventana" hasLayout
con la mano mientras dibuja la "ventana"). Dado que todo el código tiene errores (y la evidencia anedoctal dice IE <= 6 tiene más que la media), ambas rutas de código tendrían diferente insectos, que explican por qué la adición o eliminación hasLayout
(conmutación de manera efectiva a la otra ruta de código ) cambia el conjunto de errores que afectan al elemento en cuestión. No sólo eso, pero ya que tiene dos rutas de código que trabajan en el mismo documento, el iteraction de ambas rutas de código sería otra rica fuente de errores sutiles.
Otros navegadores probablemente evitarse el problema simplemente mediante el uso de una arquitectura que no tiene un camino trazado tales dual.
Si mi suposición es correcta, yo diría que si se ha utilizado una herramienta para mostrar todas las ventanas secundarias del navegador está usando, se verá que cada elemento hasLayout
visible tiene uno, mientras que los elementos de diseño-menos no tienen uno.