it-swarm-ko.tech

문제가 없다면 작동합니까?

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

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

이것 만 인식됩니다 :

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

이것이 XHTML 지원의 개념을 깨뜨릴 수 있습니까?

참고 :이 진술은 적어도 모든 IE (6-8 베타 2)에 대해 정확합니다.

1247
dimarzionist

XHTML 1 명세 :

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

콘텐츠 모델이 EMPTY이 아닌 요소의 빈 인스턴스 (예 : 빈 제목이나 단락)는 최소화 된 양식을 사용하지 않습니다 (예 : <p> </p> 사용, <p /> 사용 금지).

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

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

Brad와 squadette이 말한 것에 추가하기 위해 자체 닫는 XML 구문 <script /> 실제로 올바른 XML이지만 실제 작동하려면 웹 서버에서도 문서를 보내야합니다 HTTP Content-Type 헤더에서 application/xhtml+xml와 같은 XML mimetype을 사용하여 올바르게 구성된 XML (및 이 아닌 text/html).

그러나 XML mimetype을 보내면 페이지가 text/html 만 좋아하는 IE7에 의해 구문 분석되지 않습니다.

From w3 :

요약하면 'application/xhtml + xml'은 XHTML 제품군 문서에 사용되어야하며 'text/html'은 HTML 호환 XHTML 1.0 문서로 제한되어야한다. 'application/xml'과 'text/xml'도 사용할 수 있지만 적절한 경우에는 일반적인 XML 미디어 유형 대신 'application/xhtml + xml'을 사용해야합니다.

나는 몇 달 전에이 문제에 당황했고 FF3 +와 IE7과 호환되는 유일한 실행 가능 솔루션은 <script></script> (HTML 구문 + HTML mimetype)과 함께 이전 text/html 구문을 사용하는 것이 었습니다.

서버가 HTTP 헤더에 text/html 유형을 보내는 경우 제대로 구성된 XHTML 문서가 있더라도 FF3 +는 HTML 렌더링 모드를 사용하므로 <script />가 작동하지 않습니다 (이 변경 사항은 이전에 Firefox가 덜 엄격했습니다).

이것은 http-equiv 메타 요소, 문서 내의 XML 프롤로그 또는 doctype에 관계없이 발생합니다. Firefox는 HTML 또는 XML 파서가 문서 내부를 검색하는지 여부를 결정하는 text/html 헤더를 가져오고 HTML 파서는 그렇지 않습니다. <script />을 이해하십시오.

225
joelhardi

누구도 궁금해하는 경우, 궁극적 인 이유는 HTML이 원래 XML의 이상한 형인 SGML의 방언 이었기 때문입니다. SGML-land에서 요소는 DTD에서 self-closing (예 : BR, HR, INPUT), 암시 적으로 닫기 (예 : P, LI, TD) 또는 명시 적으로 닫기 (예 : TABLE, DIV, SCRIPT)로 지정할 수 있습니다. 물론 XML에는 이것에 대한 개념이 없습니다.

현대 브라우저에서 사용되는 태그 수프 파서는 구문 분석 모델이 더 이상 순수 SGML이 아니지만이 유산에서 발전했습니다. 물론 신중하게 제작 된 XHTML은 XML MIME 형식으로 보내지 않는 한 SGML에서 영감을받은 태그 수프로 잘못 취급됩니다. 이것은 또한 왜 ...

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

... 브라우저에서 브라우저로 해석됩니다.

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

... DOM에 대해 코드를 작성하려고 할 때 잘 어울리는 아름다운 버그에 대한 처방입니다.

150
greim

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

IE 9 이상 과 같은 XHTML 구문 분석을 지원하는 브라우저조차도 XML 내용 유형으로 문서를 제공하지 않는 한 문서를 HTML로 파싱합니다. 그러나이 경우 오래된 IE는 문서를 전혀 표시하지 않습니다!

44
JacquesB

위의 사람들은 이미이 문제에 대해 거의 설명해 주었지만 일을 분명히 할 수있는 한 가지는 HTML 문서에서 <br/>와 같은 모든 시간을 사용하지만 이러한 위치에있는 /는 기본적으로 무시되며 시도 할 때만 사용된다는 것입니다. XML과 HTML로 해석 가능한 것을 만들 수 있습니다. 예를 들어, <p/>foo</p>를 시도하면 정규 단락이 생깁니다.

26
Marijn

Script 태그에 인라인 코드가 포함될 수 있고 HTML이 속성의 존재 여부에 따라 해당 기능을 설정하거나 해제 할만큼 스마트하지 않기 때문에 자체 닫기 스크립트 태그가 작동하지 않습니다.

반면 HTML에는 외부 리소스에 대한 참조 (<link> 태그)를 포함하는 훌륭한 태그가 있으며 자체 닫을 수 있습니다. 스타일 시트, RSS 및 Atom 피드, 정식 URI 및 기타 모든 기능을 이미 포함하고 있습니다. JavaScript가 아닌 이유는 무엇입니까?

Script 태그를 self enclosed하기를 원한다면 내가 말했던 것처럼 할 수는 없지만 똑똑한 것은 아니지만 대안이있다. 자체 마감 링크 태그를 사용하고 자바 스크립트에 텍스트/자바 스크립트 및 rel 형식을 지정하여 링크 할 수 있습니다 (아래와 같이).

<link type="text/javascript" rel ="script" href="/path/tp/javascript" />
22
defau1t

XML 및 XHTML과 달리 HTML에는 자체 닫는 구문에 대한 지식이 없습니다. XHTML을 HTML로 해석하는 브라우저는 / 문자가 태그를 자동으로 닫아야한다는 것을 알지 못합니다. 대신 빈 속성처럼 해석하고 파서는 태그가 여전히 '열려 있음'이라고 생각합니다.

<script defer><script defer="defer">로 취급되므로 <script /><script /="/">로 취급됩니다.

20
rpetrich

Internet Explorer 8 이상에서는 XHTML, application/xhtml+xml에 적절한 MIME 형식을 지원하지 않습니다. text/html로 XHTML을 제공하는 경우 Internet Explorer의 이전 버전에 대한 작업은 HTML 4.01로 해석됩니다. 닫는 태그를 생략 할 수있는 모든 요소에 대해서만 짧은 구문을 사용할 수 있습니다. HTML 4.01 사양 을 참조하십시오.

XML '짧은 형식'은 /라는 속성으로 해석되며, 이는 등호가 없으므로 암시 적 값 "/"을 갖는 것으로 해석됩니다. 이것은 HTML 4.01에서 명백히 틀린 말입니다. 선언되지 않은 속성은 허용되지 않지만 브라우저는 무시합니다.

IE9 이상 은 XHTML 5 를 지원하며 application/xhtml+xml와 함께 제공됩니다.

18
Mike Dimmick

SCRIPT TAG는 무효 요소가 아니기 때문입니다.

HTML 문서 -무효 요소 하지 말 것 "닫는 태그"가 필요합니다!

xhtml 에서 모든 것은 일반이므로 모두 종료가 필요합니다. "닫는 태그"; 간단한 줄 바꿈 인 br을 <br></br> 또는 속기 <br />로 포함합니다.

그러나 스크립트 요소는 스크립트 태그 가 데이터 설명 선언이 아닌 브라우저 명령어이기 때문에 결코 무효이거나 매개 변수 요소가 아닙니다.

원칙적으로 시맨틱 종료 명령어 (예 : "닫는 태그")는 의미 태그가 후속 태그로 종료 될 수없는 명령어를 처리하는 경우에만 필요합니다. 예를 들어 :

<H1> 시맨틱은 다음의 <P>에 의해 종료 될 수 없습니다. 자체 시맨틱이 충분하지 않아서 이전 H1 명령 세트를 대체 할 수 없기 때문입니다. stream을 새 단락 줄로 나눌 수는 있지만 현재 글꼴 크기 및 스타일 줄 높이 를 무시할만큼 충분히 강하지는 않습니다. 스트림 아래로 , 즉 H1에서 누수 (P에 없기 때문에).

이것이 "/"(종료) 신호가 발명 된 방법과 이유입니다.

< />와 같은 일반 no-description 종료 태그는 발생하는 캐스케이드에서 단일 낙하에 대해 충분합니다 (예 : <H1>Title< /> 그러나 스트림의 여러 중간 태깅을 "중첩"할 수 있기를 원하기 때문에 항상 그렇지는 않습니다. 다른 캐스케이드로 랩핑/낙하하기 전에 급류로 분할됩니다. 결과적으로 < />와 같은 일반 터미네이터는 종료 할 속성의 대상을 결정할 수 없습니다. 예를 들면 다음과 같습니다. <b>bold<i> bold-italic < /> italic </>normal. 의심의 여지없이 우리의 의도를 얻지 못하고 아마도 bold bold-itallic 굵게 정상으로 해석 할 것입니다.

래퍼 즉, 컨테이너의 notion이 탄생 한 방식입니다. (이러한 개념은 너무 유사하여 식별하기가 불가능하고 때로는 같은 요소가 둘 다 가질 수 있습니다. <H1>는 동시에 래퍼와 컨테이너입니다. <B>는 의미 론적 래퍼입니다). 의미가없는 평범한 컨테이너가 필요합니다. 물론 DIV 요소의 발명이 이루어졌습니다.

DIV 요소는 실제로 2BR 컨테이너입니다. 물론 CSS의 등장은 전체 상황을 이전보다 더 이상하게 만들었고 간접적으로 많은 큰 결과와 큰 혼란을 야기했습니다!

CSS를 사용하면 새로 발명 된 DIV의 기본 사전 및 사후 BR 동작을 쉽게 무시할 수 있기 때문에 종종 "컨테이너 없음"이라고합니다. 당연히 잘못입니다! DIV는 블록 요소이며 종료 신호 발생 전후에 스트림의 라인을 기본적으로 중단합니다. 곧 웹은 페이지 DIV- 염으로 고통 받기 시작했습니다. 그들 대부분은 여전히 ​​그렇습니다.

HTML 태그의 기본 동작을 완전히 재정의하고 완전히 재정의하는 기능을 갖춘 CSS의 등장으로 HTML 존재의 전체 의미를 혼동하고 흐리게 만들었습니다 ...

갑자기 모든 HTML 태그가 쓸모없는 것처럼 보였고, 원래의 의미, 정체성 및 목적을 모두 잃어 버렸습니다. 어떻게 든 더 이상 필요하지 않다는 인상을받을 수 있습니다. 말하기 : 단일 컨테이너 래퍼 태그는 모든 데이터 표시에 충분합니다. 필요한 속성을 추가하십시오. 대신 의미있는 태그가없는 이유는 무엇입니까? 태그 이름을 만들면 CSS가 나머지를 방해 할 수 있습니다.

이것은 xhtml이 태어 났을 때 물론 물론 새로운 이민자들이 그토록 많은 돈을 지불하고 무엇이 무엇인지, 그리고 그 목적이 무엇인지에 대한 왜곡 된 비전에 의해 대가를 지불 한 방식입니다. W3C는 월드 와이드 웹에서 무엇이 잘못 되었습니까?

HTML의 목적은 to stream 인간에게 의미있는 데이터입니다.

정보를 제공합니다.

공식적인 부분은 정보 전달의 명확성을 돕기위한 것입니다. xhtml은 정보를 약간만 고려하지 않습니다. -정보는 전혀 관련이 없습니다.

이 문제에서 가장 중요한 것은 xhtml은 일부 확장 HTML의 버전이 아니라, xhtml은 완전히 다른 짐승이라는 것을 알고 이해하는 것입니다. 근거; 그러므로 별도로 유지하는 것이 현명합니다.

5
Bekim Bacaj

'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!가 표시되어야합니다.

사용할 수없는 브라우저의 경우 텍스트 영역의 내용을 복사하여 .xhtml (또는 .xht) 확장명 ( thanks this Aint )으로 파일로 저장할 수 있습니다.

2
myf