문제

인터넷 익스플로러를 위해 웹 사이트에서 작업하는 많은 개발자들처럼, 나는 악명 높은 사람들로 인한 많은 버그를 발견하는 것 같습니다. hasLayout 깃발.

나는이 깃발이 무엇을하는지, 그리고 그것이 어떻게 작동하는지 (대부분) 이해합니다. 다른 날에 읽은 좋은 설명 (출처를 찾을 수는 없지만)은 hasLayout 즉, 본질적으로 "이 요소를 사각형으로 만듭니다"를 의미합니다.

그것은 분명히 그것보다 더 복잡하지만 (내 의견으로는) 그와 잘 요약되어 있습니다.

내가 이해하지 못하는 것은 브라우저 가이 플래그를 사용하는 이유입니다. 답을 찾을 때, 나는 논리적으로 들리는 것을 발견했습니다.

인터넷 익스플로러는 CSS가 실제로 본격적으로 시작되기 전에 매우 오래된 레거시 코드를 다루어야했습니다. 브라우저를 쉽게 추가 할 수있는 건축 결정으로 hasLayout 플래그를 사용하여 특정 CSS 속성을 트리거하여 페이지가 올바르게 렌더링됩니다. 이것은 IE4의 시간으로 거슬러 올라갑니다.

Firefox (당시 Netscape)가 같은 문제를 다루어야한다는 것을 깨달을 때까지 이것은 거의 의미가있었습니다. Netscape는 Internet Explorer만큼 오랫동안 주변에 있었지만 내부는 필요하지 않습니다. hasLayout 내가 아는 한 깃발 또는 비슷한 것.

어떻게 보이는지보고 있습니다 hasLayout 플래그는 Internet Explorer에서 많은 버그의 소스입니다. IE가 왜이 플래그가 있고 다른 브라우저가 필요하지 않은지 아는 사람이 있습니까?

이것은 누군가가 이론을 가지고 있거나 답을 알고 있다면 순전히 호기심에서 알고 싶은 것입니다. 이 깃발이 유용한 이유에 대해 더 많이 이해하고 싶습니다.

도움이 되었습니까?

해결책

Netscape 렌더러는 NS4 이후에 완전히 다시 작성되었습니다. IE의 "Trident"렌더링 엔진은 그런 사랑을 얻지 못했습니다. 이것 좋은 비즈니스 의미를 만들었습니다 - IE는 NS가 다시 작성되는 동안 점진적으로 계속 개선했으며 부분적으로는 부분적으로 (그리고 부분적으로 분포 배열로 인해 ...)가 시장의 막대한 비중을 차지할 수있었습니다.

그러나 최종 결과는 개발자들에게 생명을 지옥으로 만드는 오래되고 crufty 코드베이스입니다. ~해야 한다 숨겨진 구현 세부 사항이 있어야합니다.

이제 마지막 포인트가 핵심입니다. 브라우저의 렌더러는 추상화로 수백 또는 수천 줄의 저수준 렌더링 및 이벤트 처리 코드를 사용하는 몇 줄의 마크 업에서 만들 수 있습니다. 그리고 모든 프로그래밍 추상화와 마찬가지로 약간 누출됩니다 ... 이것은 IE, Netscape, Firefox, Opera, Webkit ... 및 각 브라우저가 있습니다. 개발자는 열렬히 일합니다 추상화에서 누출을 막기 위해. 5 년 동안 제외하고는 그렇지 않았다. 다른 누출이 막혔지만 렌더링 엔진은 점점 더 체형이되었습니다.

함께, 이것들과 같은 요인들에게 hasLayout.

다른 팁

소스 코드를 볼 수 없다면 알기가 매우 어렵습니다.

다음 링크는 지금까지 찾은 가장 유익한 정보입니다.

첫 번째는 매우 흥미로운 문장이 포함 된 구식 문서를 인용합니다.

내부적으로 레이아웃이 있다는 것은 요소가 자체 컨텐츠를 그릴 책임이 있음을 의미합니다.

그리고 두 번째는 다음과 같이 말합니다.

탐색기 내부의 객체 모델은 문서 모델과 기존 응용 프로그램 모델의 하이브리드 인 것으로 보입니다.

둘 다 합쳐서, 내 추측은 hasLayout 실제로 Win32 API Sense의 Windows, 즉 CreateWindow 처리합니다. 없는 요소 hasLayout 그런 다음 자신의 "창"이 없지만 가장 가까운 곳에서 그려집니다. hasLayout-어떤 종류의 레이아웃 코드를 사용하여 조상 (QT의 레이아웃 클래스)을 사용합니다. 진정한 "Windows"만 레이아웃 코드 (레이아웃이없는 하강을 그리는)가 있으므로 "레이아웃이있는"이므로 hasLayout.

이 경우 두 가지 다른 코드 경로 레이아웃 코드가 있습니다 ( hasLayout, "Wind hasLayout "창"을 그리는 동안 "창"). 모든 코드에는 버그가 있기 때문에 (및 anedoctal 증거는 IE <= 6에 평균보다 더 많음), 두 코드 경로 모두가 다른 버그, 추가 또는 제거 이유를 설명합니다 hasLayout (효과적으로 다른 코드 경로로 전환) 문제의 요소에 영향을 미치는 버그 세트가 변경됩니다. 뿐만 아니라 동일한 문서에서 작동하는 두 개의 코드 경로가 있기 때문에 반복 두 코드 경로 중 하나는 미묘한 버그의 또 다른 풍부한 소스가 될 것입니다.

다른 브라우저는 아마도 듀얼 레이아웃 경로가없는 아키텍처를 사용하여 문제를 피했을 것입니다.

내 추측이 맞다면 브라우저가 사용하는 모든 자식 창에 도구를 사용했다면 모든 가시적이라는 것을 알게 될 것입니다. hasLayout 요소에는 하나가 있고 레이아웃이없는 요소에는 하나가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top