Internet Explorerが「Haslayout」フラグを必要とするのはなぜですか?
-
18-09-2019 - |
質問
Internet ExplorerのWebサイトで作業している多くの開発者のように、私は悪名高いものによって引き起こされる多くのバグに出くわしているようです hasLayout
国旗.
私はこのフラグが何をするか、それがどのように機能するかを理解しています(ほとんどの場合)。先日読んだ良い説明(ソースが見つかりませんが) hasLayout
IEでは、本質的に「この要素を長方形にする」ことを意味します。
それは明らかにそれよりも複雑ですが、それはかなりよく合計されています(私の意見では)。
私が理解していないのは、ブラウザがこのフラグを使用する理由です。答えを探しているとき、私は論理的に聞こえるものを見つけました:
Internet Explorerは、CSSが本当に本格的になる前から、非常に古いレガシーコードに対処しなければなりませんでした。ブラウザを簡単に追加できるようにするアーキテクチャの決定として、
hasLayout
フラグを使用して特定のCSSプロパティをトリガーしたため、ページが正しくレンダリングされます。これは、IE4の頃にさかのぼります。
Firefox(当時のNetscape)が同じ問題に対処しなければならないことに気付くまで、これは私にとってほとんど意味がありました。 Netscapeはインターネットエクスプローラーとほぼ同じ長い間存在していますが、内部は必要ありません hasLayout
私が知る限り、フラグ、または同様のもの。
どのように見ていますか hasLayout
フラグは、インターネットエクスプローラーの非常に多くのバグのソースですが、なぜこのフラグや他のブラウザが必要ないのか誰もが知っていますか?
これは、誰かが理論を持っているか、たまたま答えを知っている場合、好奇心から純粋に知りたいことです。このフラグが役立つ理由(またはなぜそうではないのか)についてもっと理解したいと思います。
解決
Netscapeレンダラーは、NS4以降に完全に書き直されました。 IEの「トライデント」レンダリングエンジンはそのような愛を得ませんでした。これ 良いビジネスは理にかなっています -IEは、NSが書き直されている間に段階的に改善し続けましたが、部分的には(そして部分的にはその流通の取り決めのために...)市場の膨大なシェアを獲得することができました...
しかし、最終結果は、開発者のために人生を地獄にしている古くてcruftyなコードベースです。 したほうがいい 隠された実装の詳細になります。
さて、その最後のポイントが重要です。ブラウザのレンダラーは抽象化であり、数百または数千行の低レベルのレンダリングとイベント処理コードを必要とする数行のマークアップを作成できます。そして、すべてのプログラミングの抽象化と同様に、それは少し漏れます...これはIE、Netscape、Firefox、Opera、WebKitに当てはまります...そして各ブラウザは持っています 熱心に働く開発者 抽象化の漏れを差し込む。 5年間、IEはそうしませんでした。 他の 漏れが詰まっていましたが、レンダリングエンジンはますますふるいのようになりました。
一緒に、これらの要因は、次のようなものを暴露するために共謀します hasLayout
.
他のヒント
ソースコードを見ることができずに知るのは非常に難しいです。
以下のリンクは、私がこれまでに見つけた最も有益なものです。
最初のものは、非常に興味深い文を含む時代遅れの文書を引用しています。
内部的には、レイアウトを持つことは、要素が独自のコンテンツを描画する責任があることを意味します。
そして2番目のものは次のように言います:
エクスプローラー内のオブジェクトモデルは、ドキュメントモデルと従来のアプリケーションモデルのハイブリッドであるように見えます。
両方をまとめると、私の推測ではその要素が hasLayout
実際、Win32 APIの意味でWindowsです - つまり、物事 CreateWindow
取引。なしの要素 hasLayout
その後、独自の「ウィンドウ」を持っていませんが、最も近くに描かれます hasLayout
- 何らかのレイアウトコードを使用して、祖先を持っています(QTのレイアウトクラスに多少似ています)。真の「Windows」のみがレイアウトコード(レイアウトのない降下剤を描く)を持っているので、それらは「レイアウトを持っている」ので、 hasLayout
.
その場合、2つの異なるコードパスレイアウトコードがあります( hasLayout
, 、通常のウィンドウ描画システムを使用して後で描画できるように、「Windows」を配置する必要があります。 hasLayout
「ウィンドウ」を描いている間、「窓」)。すべてのコードにはバグがあるため(およびAnedoctalの証拠はIE <= 6に平均以上があると言っています)、両方のコードパスには 違う バグ、追加または削除の理由を説明します hasLayout
(効果的に他のコードパスに切り替える)問題の要素に影響を与えるバグのセットを変更します。それだけでなく、同じドキュメントで2つのコードパスが動作しているため、 反復 両方のコードパスのうち、微妙なバグのもう1つの豊富なソースがあります。
他のブラウザは、おそらくそのようなデュアルレイアウトパスがないアーキテクチャを使用するだけで問題を回避しました。
私の推測が正しければ、ブラウザが使用しているすべての子供のウィンドウを表示するためにツールを使用した場合、すべての目に見えることがわかります hasLayout
要素には1つありますが、レイアウトのない要素には1つありません。