스크립트 요소를 자동으로 닫으면 안 되는 이유는 무엇입니까?

브라우저가 올바르게 인식되지 않는 이유는 무엇입니까?

<script src="foobar.js" /> <!-- self-closing script element --> 

이것만 인식됩니다.

<script src="foobar.js"></script> 

이것으로 XHTML 지원의 개념이 깨집니까?

주의: 이 문장은 적어도 모든 IE(6-8 베타 2)에 대해 올바릅니다.



질문에 대한 답변



XHTML 1 사양의 비규격 부록 ‘HTML 호환성 가이드라인’에는 다음과 같이 기재되어 있습니다.

Ⅱ.3. 요소 최소화 및 빈 요소 내용

컨텐츠 모델이 아닌 요소의 빈 인스턴스가 지정됨EMPTY(예: 빈 제목 또는 단락)은 최소화된 양식(예: 사용)을 사용하지 않습니다.<p> </p>가 아니라<p />).

XHTML DTD는 스크립트 요소를 다음과 같이 지정합니다.

<!-- script statements, which may include CDATA sections --> <!ELEMENT script (#PCDATA)> 



Brad와 Squadette의 말에 덧붙여, 자기 폐쇄형 XML 구문<script />실제로 XML이 올바르지만 실제로 작동하려면 웹 서버가 다음과 같은 XML mimtype을 가진 올바른 형식의 XML로 문서를 전송해야 합니다.application/xhtml+xmlHTTP Content-Type 헤더에 포함됨( as는 아님)text/html).

단, XML mimtype을 전송하면 IE7에 의해 페이지가 해석되지 않습니다. IE7에서는text/html.

W3부터:

요약하면 XHTML 패밀리 문서에는 ‘application/xhtml+xml’을 사용해야 하며, ‘text/html’ 사용은 HTML 호환 XHTML 1.0 문서로 제한해야 합니다.application/xml’과 ‘text/xml’도 사용할 수 있지만 필요에 따라 범용 XML 미디어 유형이 아닌 ‘application/xhtml+xml’을 사용해야 합니다.

몇 달 전에 이 문제를 고민했습니다.실효성이 있는 유일한 솔루션(F3+ 및 IE7 호환)은 오래된 것을 사용하는 것이었습니다.<script></script>와의 구문.text/html(HTML 구문 + HTML mimtype).

서버가 송신하는 경우text/html다른 적절한 형식의 XHTML 문서를 사용하더라도 FF3+는 HTML 렌더링 모드를 사용합니다.이것은, 다음의 것을 의미합니다.<script />동작하지 않습니다(이는 변경 사항이며, Firefox는 이전에 덜 엄격했습니다).

이 일은 어떤 만지작거림에도 불구하고 일어날 것이다.http-equiv메타 요소, 문서 내의 XML 프롤로그 또는 doctype — Firefox가 다음을 얻으면 분기합니다.text/htmlheader: HTML 파서가 문서 내부를 볼지 XML 파서가 이해할 수 없는지를 결정합니다.<script />.




또, 「어떻게」라고 대답하고, 스펙을 인용하고 있습니다.여기 진짜 이야기가 있다. “왜 안 되는가?”<script/>버그 리포트나 메일링 리스트를 몇시간 동안 조사했습니다.


HTML 4

HTML 4는 SGML을 기반으로 합니다.

SGML에는 다음과 같은 짧은 태그가 있습니다.<BR//,<B>text</>,<B/text/, 또는<OL<LI>item</LI</OL>. XML은 첫 번째 형식을 사용하여 엔딩을 “>”로 재정의합니다(SGML은 유연합니다).그러면 다음과 같이 됩니다.<BR/>.

그러나 HTML은 redfine이 되지 않았기 때문에<SCRIPT/> 의미해야 한다. <SCRIPT>>.
(네, ‘>’는 콘텐츠의 일부여야 하며 태그는 아직 닫혀 있지 않습니다.

이는 XHTML과 호환되지 않으며 많은 사이트를 파괴할 수 있습니다(브라우저가 이 점에 신경을 쓸 만큼 성숙해졌을 때). 따라서 아무도 쇼트태그를 구현하지 않았고 사양은 이러한 사이트들에 대해 조언을 하지 않았습니다.

사실상 모든 ‘작동 중’ 셀프 엔드 태그는 기술적으로 부적합한 파서에 금지된 엔드 태그를 가진 태그이며 실제로는 유효하지 않습니다.HTML 호환성을 갖게 함으로써 XHTML로의 이행을 돕기 위해 이 해킹을 고안한 것이 W3C였습니다.

그리고.<script>의 종료 태그는 금지되지 않습니다.

“Self-ending” 태그는 HTML 4의 해킹으로 의미가 없습니다.


HTML 5

HTML5에는 5종류의 태그가 있으며 ‘void’ 및 ‘foreign’ 태그만 자동 닫을있습니다.

왜냐면<script>void(콘텐츠가 있을 수 있음)가 아니며 MathML이나 SVG와 같은 외래가 아닙니다.<script>사용 방법에 관계없이 자동 닫을 수 없습니다.

하지만 왜 그랬을까?외국으로 보거나 특별한 케이스를 만들거나 하면 안 될까요?

HTML 5는 HTML 4 및 XHTML 1의 실장과의 하위 호환성을 목표로 하고 있습니다.이것은 SGML이나 XML에 근거하고 있지 않습니다.구문은 주로 실장의 문서화와 통합에 관련되어 있습니다.(이래서)<br/> <hr/>etc는 HTML4가 무효인 경우에도 유효한 HTML5 입니다).

셀프 클로징<script>는, 실장이 다른 태그의 1개입니다.이전에는 Chrome, Safari, Opera에서 작동했지만 Internet Explorer나 Firefox에서는 작동하지 않았습니다.

는 HTML 5가 작성될 때 논의되었으나 브라우저 호환성깨진다는 이유로 거부되었습니다.스크립트 태그를 스스로 닫는 웹 페이지는 이전 브라우저에서 올바르게 렌더링되지 않을 수 있습니다(전혀 그렇지 않은 경우).다른 제안도 있었지만 호환성 문제도 해결할 수 없습니다.

초안이 공개된 후 WebKit은 파서를 적합하도록 업데이트했습니다.

셀프 클로징<script>는 HTML 4 및 XHTML 1과의 하위 호환성이 있기 때문에 HTML 5에서는 발생하지 않습니다.


XHTML 1 / XHTML 5

XHTML을 실제로 사용했을 때<script/>다른 답변에서도 언급했듯이 정말 폐쇄적입니다.

다만, 사양에 의하면, HTML 로서 기능했을 경우는 다음과 같습니다.

XHTML 문서…는 대부분의 HTML 브라우저와 호환되므로 인터넷 미디어 유형 “text/html” [RFC2854]로 라벨이 지정될 수 있습니다.

그래서 어떻게 됐나요?

사람들은 지정된 컨텐츠 헤더(콘텐츠 스니핑으로 알려진)에 관계없이 파이어폭스가 적합한 문서를 XHTML로 구문 분석할 수 있도록 Mozilla에게 요청했습니다.이로 인해 스크립트를 스스로 닫을 수 있게 되었을 뿐만 아니라 웹 호스트들이 올바른 헤더를 처리할 수 있을 만큼 성숙하지 않았기 때문에 콘텐츠 스니핑이 필요하게 되었습니다.IE는 이 기능에 능숙했습니다.

번째 브라우저 전쟁이 IE 6으로 끝나지 않았다면 XHTML도 목록에 포함되었을 수 있습니다.하지만 끝이 났다.그리고 IE 6은 XHTML에 문제가 있습니다. 사실 IE는 올바른 MIME 유형을 전혀 지원하지 않아 모든 사용자가 사용할 수 밖에 없습니다.text/htmlIE가 10년 동안 주요 시장 점유율을 차지했기 때문에 XHTML을 위한 것입니다.

그리고 컨텐츠의 스니핑은 매우 나쁠 수 있으며 사람들은 그것을 중단해야 한다고 말하고 있다.

마지막으로 W3C가 XHTML을 스니핑할 있는 것을 의미하는 것은 아니라는 것이 판명되었습니다.문서는 HTML과 XHTML의 양쪽입니다.Content-Type‘우리 사양에 따르기만 하면 된다’는 입장을 견지하고 실용적인 것을 무시했다고 할 수 있다.이 오류는 이후 XHTML 버전에서도 계속되었습니다.

어쨌든, 이 결정은 파이어폭스의 문제를 해결했다.Chrome이 탄생하기 7년 전이었다.다른 이렇다 할 브라우저는 없었다.그렇게 결정되었다.

다음 사양 때문에 doctpe만 지정해도 XML 파싱이 트리거되지 않습니다.




혹시 모르니까 HTML은 원래 XML의 이상한 형인 SGML의 방언이었기 때문이다.SGML-land에서 요소는 DTD에서 자기폐쇄(예: BR, HR, INPUT), 암묵적으로 닫힘(예: P, LI, TD) 또는 명시적으로 닫힘(예: TABLE, DIV, SCRIP)으로 지정할 수 있습니다.물론 XML에는 이에 대한 개념이 없습니다.

최신 브라우저가 사용하는 태그 수프 파서는 이 레거시에서 진화했지만 파싱 모델은 더 이상 순수한 SGML이 아닙니다.또한 XML MIME 타입으로 송신하지 않는 한, 주의 깊게 조작된 XHTML은 SGML에서 영감을 받은 태그 수프로서 취급됩니다.이게 또 왜…

<p><div>hello</div></p> 

…브라우저에 의해 다음과 같이 해석됩니다.

<p></p><div>hello</div><p></p> 

DOM에 대해 코드를 작성하려고 할 때 발작을 일으킬 수 있는 사랑스러운 무명 버그의 레시피입니다.




Internet Explorer 8 이전 버전에서는 XHTML 해석은 지원되지 않습니다.XML 선언 및/또는 XHTML doctype을 사용하더라도 이전 IE는 여전히 일반 HTML로 문서를 구문 분석합니다. 또한 일반 HTML에서는 자체 닫기 구문이 지원되지 않습니다.후행 슬래시는 무시되기 때문에 명시적인 닫힘 태그를 사용해야 합니다.

XHTML 구문 분석을 지원하는 브라우저(예: IE 9 이상)에서도 XML 컨텐츠 유형을 사용하여 문서를 제공하지 않는 한 HTML로 구문 분석합니다.그러나 이 경우 오래된 IE는 문서를 전혀 표시하지 않습니다!