브라우저가 올바르게 인식하지 못하는 이유는 무엇입니까?
<script src="foobar.js" /> <!-- self-closing script element -->
다음 사항만 인식됩니다.
<script src="foobar.js"></script>
이것이 XHTML 지원의 개념을 깨뜨립니까?
참고: 이 설명은 적어도 모든 IE(6-8 베타 2)에 대해 정확합니다.
질문자 :dimarzionist
브라우저가 올바르게 인식하지 못하는 이유는 무엇입니까?
<script src="foobar.js" /> <!-- self-closing script element -->
다음 사항만 인식됩니다.
<script src="foobar.js"></script>
이것이 XHTML 지원의 개념을 깨뜨립니까?
참고: 이 설명은 적어도 모든 IE(6-8 베타 2)에 대해 정확합니다.
XHTML 1 사양은 다음과 같이 말합니다.
EMPTY
가 아닌 요소의 빈 인스턴스가 주어지면(예: 빈 제목 또는 단락) 최소화된 형식을 사용하지 마십시오(예:<p />
아니라<p> </p>
>를 사용).
XHTML DTD는 스크립트 요소를 다음과 같이 지정합니다.
<!-- script statements, which may include CDATA sections --> <!ELEMENT script (#PCDATA)>
브래드와 squadette가 말한에 추가하려면, 자기 닫는 XML 구문 <script />
실제로 올바른 XML이지만, 그것을위한 연습 일에, 웹 서버는 또한 XML 마임 제대로 형성된 XML로 문서를 보낼 필요 같은 application/xhtml+xml
HTTP Content-Type 헤더에 (그리고로 text/html
).
text/html
만 좋아하는 IE7에서 페이지가 구문 분석되지 않습니다.
w3에서 :
요약하면 'application/xhtml+xml'은 XHTML Family 문서에 사용되어야 하고 'text/html'의 사용은 HTML 호환 XHTML 1.0 문서로 제한되어야 합니다(SHOULD). 'application/xml' 및 'text/xml'도 사용할 수 있지만 적절한 경우에는 이러한 일반 XML 미디어 유형보다 'application/xhtml+xml'을 사용해야 합니다(SHOULD).
나는 몇 달 전에 이것에 대해 의아해했고 유일하게 실행 가능한(FF3+ 및 IE7과 호환) 솔루션은 text/html
(HTML 구문 + HTML mimetype)과 함께 <script></script>
서버 text/html
유형을 보내면 제대로 구성된 XHTML 문서가 있더라도 FF3+는 HTML 렌더링 모드를 사용하므로 <script />
가 작동하지 않습니다. ).
http-equiv
메타 요소, XML 프롤로그 또는 문서 내부의 문서 유형에 관계없이 발생합니다. Firefox는 HTML 또는 XML 파서가 문서 내부를 볼지 여부를 결정 text/html
HTML 파서는 <script />
이해하지 못합니다.
다른 사람들은 "어떻게"라고 대답하고 사양을 인용했습니다. 다음은 버그 보고서와 메일링 리스트를 조사한 후 <script/>
없는가"에 대한 실제 이야기입니다.
HTML 4
HTML 4는 SGML을 기반으로 합니다.
SGML 일부 갖는다 shorttags 같은, <BR//
<B>text</>
, <B/text/
또는 <OL<LI>item</LI</OL>
. XML은 첫 번째 형식을 취하고 끝을 ">"(SGML은 유연함)로 재정의하여 <BR/>
됩니다.
그러나 HTML은 재정의하지 않았으므로 <SCRIPT/>
<SCRIPT>>
의미 해야 합니다 .
(예, '>'는 콘텐츠의 일부여야 하며 태그는 여전히 닫히지 않았습니다 .)
분명히 이것은 XHTML과 호환되지 않으며 많은 사이트를 중단시킬 것이므로 (브라우저가 이에 대해 신경 쓸 만큼 성숙할 때까지) 아무도 shorttag를 구현하지 않았 으며 사양에서는 이에 대해 조언합니다 .
사실상 모든 '작동' 자체 종료 태그는 기술적으로 부적합한 구문 분석기에서 금지된 종료 태그가 있는 태그이며 실제로는 유효하지 않습니다. XHTML을 HTML과 호환 가능 하게 만들어 XHTML로의 전환을 돕기 위해 이 핵 을 고안한 것은 W3C였습니다.
그리고 <script>
의 종료 태그는 금지되지 않습니다 .
"Self-ending" 태그는 HTML 4의 해킹이며 의미가 없습니다.
HTML 5
HTML5에는 5가지 유형의 태그가 있으며 'void' 및 'foreign' 태그만 자동으로 닫힐 수 있습니다.
<script>
는 무효가 아니고( 내용이 있을 수 있음) 외래가 아니기 때문에(MathML 또는 SVG와 같이) <script>
는 사용 방법에 관계없이 자체 닫힐 수 없습니다.
하지만 왜? 외국이라고 하면 안되나요, 특례로 하거나 그런거요?
HTML 5는 HTML 4 및 XHTML 1의 구현 과 역호환되는 것을 목표로 합니다. SGML이나 XML을 기반으로 하지 않습니다. 구문은 주로 구현을 문서화하고 통합하는 것과 관련이 있습니다. (이것이 <br/>
<hr/>
등이 잘못된 HTML4임에도 불구하고 유효한 HTML 5인 이유입니다.)
자체 폐쇄 <script>
는 구현이 다른 태그 중 하나입니다. Chrome, Safari 및 Opera 에서 작동했습니다. 내가 아는 한 Internet Explorer 또는 Firefox에서는 작동하지 않았습니다.
이 논의되었다 HTML 5 초안 받고하고 있기 때문에 거부 왔을 때 나누기 브라우저 호환성을 . 자동 닫기 스크립트 태그가 있는 웹페이지는 이전 브라우저에서 제대로 렌더링되지 않을 수 있습니다(전혀 있는 경우). 다른 제안 이 있었지만 호환성 문제를 해결할 수 없습니다.
초안이 릴리스된 후 WebKit은 파서를 준수하도록 업데이트했습니다.
HTML 4 및 XHTML 1과의 역호환성 때문에 HTML 5에서는 자체 닫힘 <script>
XHTML 1 / XHTML 5
정말 XHTML로 제공하는 경우 <script/>
로 정말 폐쇄 다른 답변을 언급했다.
사양에 HTML로 제공될 때 작동 해야 한다고 명시 되어 있다는 점을 제외하고는 다음과 같습니다.
XHTML 문서 ... 대부분의 HTML 브라우저와 호환되므로 인터넷 미디어 유형 "text/html"[RFC2854]로 레이블이 지정될 수 있습니다.
그래서, 무슨 일이 있었나요?
사람들 은 Mozilla 에 지정된 콘텐츠 헤더(콘텐츠 스니핑 이라고 함)에 관계없이 Firefox가 준수 문서를 XHTML 로 구문 분석할 수 있도록 요청했습니다. 이것은 자체 폐쇄 스크립트를 허용하고 웹 호스팅 업체가 올바른 헤더를 제공할 만큼 충분히 성숙하지 않았기 때문에 어쨌든 콘텐츠 스니핑이 필요했습니다. IE는 잘했다 .
첫 번째 브라우저 전쟁 이 IE 6으로 끝나지 않았다면 XHTML도 목록에 있었을 것입니다. 그러나 그것은 끝났습니다. 그리고 IE 6 은 XHTML에 문제가 있습니다. 사실 IE는 올바른 MIME 유형 을 전혀 지원하지 않았고 IE가 10년 동안 주요 시장 점유율 을 차지했기 때문에 모든 사람 text/html
을 사용해야 했습니다.
또한 콘텐츠 스니핑 은 매우 나쁠 수 있으며 사람들은 이를 중지해야 한다고 말합니다.
마지막으로, W3C가 밝혀 평균 XHTML은 sniffable로하지 않았다 : 문서가 모두 HTML 및 XHTML,이고 Content-Type
규칙. 그들이 "그냥 우리의 사양을 따르라"고 확고한 입장을 취하고 실용적인 것은 무시 했다고 말할 수 있습니다. 이후의 XHTML 버전으로 계속 된 실수.
어쨌든 이 결정은 Firefox 의 문제를 해결했습니다. 크롬이 탄생 하기 7년 전의 일입니다. 다른 중요한 브라우저는 없었습니다. 그래서 결정되었습니다.
doctype만 지정하면 다음 사양으로 인해 XML 구문 분석이 트리거되지 않습니다.
궁금한 사람이 있을 경우 궁극적인 이유는 HTML이 원래 XML의 이상한 형인 SGML의 방언이기 때문입니다. SGML-land에서 요소는 자체 폐쇄(예: BR, HR, INPUT), 암시적 폐쇄(예: P, LI, TD) 또는 명시적 폐쇄(예: TABLE, DIV, SCRIPT)로 DTD에서 지정할 수 있습니다. 물론 XML에는 이에 대한 개념이 없습니다.
최신 브라우저에서 사용하는 태그 수프 파서는 이러한 레거시에서 발전했지만 해당 구문 분석 모델은 더 이상 순수한 SGML이 아닙니다. 그리고 물론 신중하게 만든 XHTML은 XML MIME 유형으로 보내지 않는 한 잘못 작성된 SGML에서 영감을 받은 태그 수프로 취급됩니다. 이 또한 이유는...
<p><div>hello</div></p>
...브라우저에서 다음과 같이 해석합니다.
<p></p><div>hello</div><p></p>
...이것은 DOM에 대해 코드를 작성하려고 할 때 당신을 궁지에 몰아넣을 수 있는 사랑스러운 모호한 버그에 대한 레시피입니다.
Internet Explorer 8 및 이전 버전은 XHTML 구문 분석을 지원하지 않습니다. XML 선언 및/또는 XHTML 문서 유형을 사용하더라도 이전 IE는 여전히 문서를 일반 HTML로 구문 분석합니다. 그리고 일반 HTML에서는 자동 닫기 구문이 지원되지 않습니다. 후행 슬래시는 무시되므로 명시적인 닫는 태그를 사용해야 합니다.
IE 9 이상과 같이 XHTML 구문 분석을 지원하는 브라우저라도 XML 콘텐츠 유형으로 문서를 제공하지 않는 한 문서를 HTML로 구문 분석합니다. 그러나 이 경우 이전 IE는 문서를 전혀 표시하지 않습니다!
위의 사람들은 이미 이 문제에 대해 꽤 많이 설명했지만, 분명히 할 수 있는 한 가지는 사람들이 HTML 문서에서 항상 <br/>
/
는 기본적으로 무시되며 XML과 HTML로 구문 분석 가능한 무언가를 만들려고 할 때 사용됩니다. <p/>foo</p>
를 시도하면 일반 단락을 얻을 수 있습니다.
자동 종료 스크립트 태그는 작동하지 않습니다. 스크립트 태그에 인라인 코드가 포함될 수 있고 HTML이 속성의 존재 여부에 따라 해당 기능을 켜거나 끌 만큼 똑똑하지 않기 때문입니다.
반면에 HTML에는 외부 리소스에 대한 참조를 포함하는 데 탁월한 태그인
<link>
태그가 있으며 자체 닫힐 수 있습니다. 스타일시트, RSS 및 Atom 피드, 표준 URI 및 기타 모든 종류의 기능을 포함하는 데 이미 사용되었습니다. 자바스크립트는 왜 안되나요?
스크립트 태그를 자체적으로 둘러싸고 싶다면 내가 말했듯이 그렇게 할 수 없지만 현명한 것은 아니지만 대안이 있습니다. 아래와 같이 텍스트/자바스크립트 및 rel 유형을 스크립트로 지정하여 자체 닫힘 링크 태그를 사용하고 JavaScript에 연결할 수 있습니다.
<link type="text/javascript" rel ="script" href="/path/tp/javascript" />
XML 및 XHTML과 달리 HTML은 자체 닫는 구문에 대한 지식이 없습니다. XHTML을 HTML로 해석하는 브라우저는 /
문자가 태그가 자동으로 닫혀야 함을 나타냅니다. 대신 그들은 그것을 빈 속성처럼 해석하고 파서는 여전히 태그가 '열림'이라고 생각합니다.
<script defer>
가 <script defer="defer">
<script />
로 처리되는 것처럼 <script /="/">
로 처리됩니다.
Internet Explorer 8 및 이전 버전은 XHTML, application/xhtml+xml
대한 적절한 MIME 유형을 지원하지 않습니다. text/html
로 제공하는 경우 Internet Explorer의 이러한 이전 버전에서 수행해야 하는 작업은 HTML 4.01로 해석됩니다. 닫는 태그를 생략할 수 있는 요소에는 짧은 구문만 사용할 수 있습니다. HTML 4.01 사양을 참조하십시오.
XML '약식'은 /라는 속성으로 해석되며, 등호가 없기 때문에 "/"의 암시적 값을 갖는 것으로 해석됩니다. 이것은 HTML 4.01에서 완전히 잘못된 것입니다. 선언되지 않은 속성은 허용되지 않습니다. 그러나 브라우저는 이를 무시합니다.
IE9 이상 application/xhtml+xml
과 함께 제공되는 XHTML 5를 지원 합니다.
HTML 문서에서 - VOID ELEMENTS에는 "닫는 태그" 가 전혀 필요하지 않습니다!
xhtml 에서는 모든 것이 Generic이므로 "닫는 태그"와 같이 모두 종료가 필요합니다. <br></br>
또는 약어 <br />
와 같은 간단한 줄 바꿈인 br을 포함합니다.
그러나 Script Element는 void 또는 parametric Element가 아닙니다. 그 이유는 다른 무엇보다 앞에 있는 script 태그 는 Data Description 선언이 아니라 Browser Instruction이기 때문입니다.
원칙적으로 의미론적 종료 명령, 예를 들어 "닫는 태그"는 의미론적 의미가 후속 태그에 의해 종료될 수 없는 명령을 처리하는 데만 필요합니다. 예를 들어:
<H1>
<P>
의해 종료될 수 없습니다. 그 이유는 이전 H1 명령어 세트를 무시하고 종료하기에 충분한 자체 의미 체계를 전달하지 않기 때문입니다. 스트림 을 새 단락 줄로 나눌 수는 있지만 스트림을 따라 흘러내리는 현재 글꼴 크기 및 스타일 줄 높이, 즉 H1에서 누출되는 것보다 "충분히 강하지" 않습니다(P에는 해당 항목이 없기 때문에 ).
이것이 "/"(종료) 신호가 발명된 방법과 이유입니다.
< />
와 같은 일반적인 설명이 없는 종료 태그는 발생하는 캐스케이드에서 단일 폴로 충분할 것입니다(예: <H1>Title< />
하지만 항상 그런 것은 아닙니다. ", 스트림의 여러 중간 태그 지정: 다른 캐스케이드로 래핑/떨어지기 전에 급류로 분할됩니다. < />
와 같은 일반 종료자는 종료할 속성의 대상을 결정할 수 없습니다. 예: <b>
굵게 <i>
굵게-기울임꼴 < />
기울임꼴 </>
보통. 의심할 여지 없이 우리의 의도를 올바르게 이해하는 데 실패할 것이고 아마도 그것을 볼드 볼드-이탤릭 볼드 노멀로 해석할 것입니다.
이것이 래퍼, 즉 컨테이너의 개념 이 탄생한 방법입니다. (이러한 개념은 너무 유사하여 식별이 불가능하며 때로는 동일한 요소가 둘 다를 가질 수 있습니다. <H1>
은 래퍼이자 컨테이너입니다. 반면 <B>
는 의미론적 래퍼일 뿐입니다.) 의미 체계가 없는 일반 컨테이너가 필요합니다. 그리고 물론 DIV 요소의 발명이 이루어졌습니다.
DIV 요소는 실제로 2BR 컨테이너입니다. 물론 CSS의 등장은 전체 상황을 이전보다 더 이상하게 만들었고 간접적으로 많은 큰 결과로 큰 혼란을 야기했습니다!
CSS를 사용하면 새로 발명된 DIV의 기본 전후 BR 동작을 쉽게 재정의할 수 있기 때문에 종종 "아무것도 하지 않는 컨테이너"라고 합니다. 즉, 자연스럽게 잘못된 것입니다! DIV는 블록 요소이며 종료 신호 전후에 기본적으로 스트림 라인을 끊습니다. 곧 WEB는 페이지 DIV-itis로 고통받기 시작했습니다. 그들 중 대부분은 여전히 있습니다.
모든 HTML 태그의 기본 동작을 완전히 재정의하고 완전히 재정의할 수 있는 기능을 갖춘 CSS의 등장은 어떻게든 HTML 존재의 전체 의미를 혼동하고 흐리게 처리했습니다...
갑자기 모든 HTML 태그가 쓸모없는 것처럼 보였고 원래 의미, 정체성 및 목적이 모두 제거되어 손상되었습니다. 어떻게 든 당신은 그것들이 더 이상 필요하지 않다는 인상을 받을 것입니다. 말하기: 단일 컨테이너 래퍼 태그는 모든 데이터 표시에 충분합니다. 필요한 속성을 추가하기만 하면 됩니다. 대신 의미 있는 태그를 사용하지 않는 이유는 무엇입니까? 이동하면서 태그 이름을 만들고 CSS가 나머지는 신경쓰도록 하세요.
이것이 xhtml이 탄생한 방식이며, 물론 새로 온 사람들이 그토록 값비싼 대가를 치르고 무엇이 무엇인지, 그리고 그 망할 목적이 무엇인지에 대한 왜곡된 비전을 가진 방법입니다. W3C는 World Wide Web에서 무엇이 잘못되었습니까, 동지들!!
HTML의 목적은 의미 있는 데이터를 수신자 에게 스트리밍하는 것입니다.
정보를 전달합니다.
공식적인 부분은 정보 전달의 명확성을 돕기 위한 것입니다. xhtml은 정보를 조금도 고려하지 않습니다. - 그것에 대한 정보는 절대적으로 관련이 없습니다.
이 문제에서 가장 중요한 것은 xhtml이 일부 확장된 HTML의 버전이 아니라 xhtml이 완전히 다른 짐승이라는 것을 알고 이해할 수 있다는 것입니다. 근거; 따라서 분리된 상태로 유지하는 것이 현명합니다.
단순히 현대적인 대답은 태그가 그런 식으로 필수로 표시되기 때문입니다.
태그 생략 없음, 시작 및 종료 태그는 모두 필수입니다.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script
'true XHTML', 'faux XHTML' 및 HTML의 차이점과 서버에서 보낸 MIME 유형의 중요성은 이미 여기에서 잘 설명 되었습니다. 지금 바로 사용해보고 싶다면 지원 가능한 브라우저를 위한 자체 폐쇄 스크립트 태그를 포함하여 실시간 미리보기가 포함된 간단한 편집 가능한 스니펫이 있습니다.
div { display: flex; } div + div {flex-direction: column; }
<div>Mime type: <label><input type="radio" onchange="t.onkeyup()" id="x" checked name="mime"> application/xhtml+xml</label> <label><input type="radio" onchange="t.onkeyup()" name="mime"> text/html</label></div> <div><textarea id="t" rows="4" onkeyup="i.src='data:'+(x.checked?'application/xhtml+xml':'text/html')+','+encodeURIComponent(t.value)" ><?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" [<!ENTITY x "true XHTML">]> <html xmlns="http://www.w3.org/1999/xhtml"> <body> <p> <span id="greet" swapto="Hello">Hell, NO :(</span> &x;. <script src="data:text/javascript,(g=document.getElementById('greet')).innerText=g.getAttribute('swapto')" /> Nice to meet you! <!-- Previous text node and all further content falls into SCRIPT element content in text/html mode, so is not rendered. Because no end script tag is found, no script runs in text/html --> </p> </body> </html></textarea> <iframe id="i" height="80"></iframe> <script>t.onkeyup()</script> </div>
Hello, true XHTML. Nice to meet you!
이 표시되어야 합니다. Hello, true XHTML. Nice to meet you!
텍스트 영역 아래.
사용할 수 없는 브라우저의 경우 텍스트 영역의 내용을 복사하고 확장자가 .xhtml
(또는 .xht
)인 파일로 저장할 수 있습니다(이 힌트를 준 Alek에게 감사드립니다 ).
출처 : http:www.stackoverflow.com/questions/69913/why-dont-self-closing-script-elements-work
목록을 정렬하는 방법<T> 객체의 속성에 의해 (0) | 2022.03.07 |
---|---|
분기가 지정되지 않은 "git push"의 기본 동작 (0) | 2022.03.07 |
뷰 컨트롤러 간에 데이터 전달 (0) | 2022.03.07 |
Python 스크립트를 어떻게 프로파일링할 수 있습니까? (0) | 2022.03.07 |
Apache Camel은 정확히 무엇입니까? (0) | 2022.03.07 |