스크립트 태그 내에서 CDATA 섹션은 언제 필요합니까?


907

인가 CDATA의 태그 그래서 스크립트 태그 그리고 만약 적 필요?

다른 말로하면, 언제, 어디서?

<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>

이것보다 선호 :

<script type="text/javascript">
...code...
</script>

18
이제 XHTML이 본질적으로 죽었으므로 더 이상 관련이 있습니까?
allyourcode

80
@allyourcode : XHTML이 죽었다고 생각하는 이유는 무엇입니까? HTML5? XHTML5가 있습니다 :)
Doktor J

4
@DoktorJ AFAIK xHTML의 버전은 1입니다. HTML의 버전은 4입니다. HTML 5와 동일한 기능을 향상시키는 방법으로 xform, xlink, time 및 svg 네임 스페이스를 사양에 적용하려는 노력이 xHTML 2.0에 집중되었습니다. xform / input-validation, 시간 / 애니메이션, svg / canvas를 추가했지만 xHTML 2 사양에 대한 노력은 HTML 5 기능에 초점을 맞추 었습니다. 즉, xHTML 2가 삭제되었거나 더 이상 사용되지 않는다고 말하지는 않지만 가까운 장래에는 계획되지 않았습니다.
Mihai Stancu

14
Java Seam / JSF / Facelets 개발에서 XHTML이 죽지 않았습니다.
JoJo

15
@Mihai Stancu-그것은 완전히 정확하지 않습니다. W3C에 따르면 HTML5에 대한 XML 구문이 있습니다 . " HTML5에 사용할 수있는 다른 구문은 XML입니다.이 구문은 XHTML1 문서 및 구현과 호환됩니다.이 구문을 사용하는 문서는 XML 미디어 유형과 함께 제공되어야하며 요소는 필요합니다. XML 사양에 명시된 규칙 에 따라 w3.org/1999/xhtml 네임 스페이스에 배치해야합니다 . "
BrainSlugs83

답변:


585

당신이 XML로 구문 분석에 문서를해야 할 경우 CDATA 섹션이 필요합니다 (예를 들어, XHTML은 페이지가 XML로 해석됩니다 경우) 당신은 문자 그대로 쓸 수 있기를 원하는 i<10a && b대신 i&lt;10하고a &amp;&amp; b , XHTML은 구문 분석 된 문자 데이터로 자바 스크립트 코드를 파싱로 기본적으로 문자 데이터와 반대입니다. 이것은 외부 소스 파일에 저장된 스크립트의 문제는 아니지만 XHTML의 인라인 JavaScript의 경우 아마도 경우 CDATA 섹션을 사용하고 싶을 .

많은 XHTML 페이지는 결코 XML로 파싱되도록 ​​의도되지 않았으며,이 경우에는 문제가되지 않습니다.

주제에 대한 글을 잘 작성하려면 https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm을 참조 하십시오.


48
"유효성 검증"보다 더 많은 것이 있습니다. 대부분의 엄격한 XML 파서는 잘못된 문자에 부딪 치면 페이지를 거치지 않습니다. 단순히 W3C를 행복하게 만들고 빨강 대신 녹색을 얻는 것 이상의 의미가 있습니다.
Loren Segal

40
당신이 피할 경우 &<문자, 당신은 CDATA 섹션을 필요로하지 않는다; HTML과 XHTML 모두에서 잘 작동합니다. 모든 중요한 코드를 외부 스크립트에 넣고 인라인 스크립트를 사용하여 쉽게 달성 할 수 있습니다. 변수를 초기화합니다 ( 필요한 경우 문자열 리터럴에서 &/ <\x26/ \x3C로 이스케이프 처리 ).
빈스

23
HTML5의 경우는 어떻습니까?
매튜 아 틀레

5
@Mathew Attle-이것은 좋은 질문입니다. 필요한 관심을 끌기 위해 별도의 스레드를 요청하는 것이 좋습니다.
Alex KeySmith

3
@Loren : 그렇다면 여전히 검증에 관한 것입니다. 사용자 에이전트가 유효하지 않은 XML을 거부하는 정도는 직교입니다.
궤도에서 가벼움 레이스

231

브라우저가 마크 업을 XML로 취급하는 경우 :

<script>
<![CDATA[
    ...code...
]]>
</script>

브라우저가 마크 업을 HTML로 취급하는 경우 :

<script>
    ...code...
</script>

브라우저가 마크 업을 HTML로 취급하고 XHTML 1.0 마크 업 (예 :)을 검증하려는 경우.

<script>
//<![CDATA[
    ...code...
//]]>
</script>

12
코드 안전 문제와 마찬가지로 CDATA를 블록 주석으로 둘러싸는 것이 좋습니다. /* ... */그렇지 않으면 줄 바꿈을 제거하면 코드가 깨질 것입니다.
BryanH

첫 번째 섹션에서 "... XML로"가 "... 해석되지 않은 텍스트"로되어서는 안됩니까? 에서 stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean 우리는 "데이터를 포함 이러한 문자열 ... 볼 수있는 XML 마크 업으로 해석을하지만, 안됩니다."
매트 윌키

@mattwilkie, "XML로"의 의미는 "브라우저가 XML 파서와는 달리 XML 파서를 사용하여 마크 업을 파싱하기 위해 브라우저가 XML 파서를 사용하는 경우입니다. XML 기반 파일 확장자 ".
Shadow2531 2019

127

HTML

HTML 파서는 스크립트 사이 <script></script>스크립트의 일부로 모든 것을 처리 합니다. 일부 구현에는 올바른 닫기 태그가 필요하지 않습니다. " </" 에서 스크립트 해석을 중지 합니다 . 이는 사양 에 따라 맞습니다 .

업데이트 에서 HTML5는 현재 브라우저, 그 이상이 아니다.

따라서 HTML에서는 불가능 합니다.

<script>
var x = '</script>';
alert(x)
</script>

CDATA섹션이 없습니다 전혀 영향을 . 그렇기 때문에 글을 써야합니다

var x = '<' + '/script>'; // or
var x = '<\/script>';

또는 유사합니다.

이는 다음과 같이 제공되는 XHTML 파일에도 적용됩니다. text/html . IE는 XML 콘텐츠 형식을 지원하지 않기 때문에 대부분의 경우에 해당합니다.

XML

XML에서는 다른 규칙이 적용됩니다. XHMTL 문서가 XML 컨텐츠 유형으로 제공되는 경우 (비 IE) 브라우저는 XML 구문 분석기 만 사용합니다.

XML 파서에서 script태그는 다른 태그보다 낫지 않습니다. 특히, 스크립트 노드는 " <" 에 의해 트리거 된 텍스트가 아닌 자식 노드를 포함 할 수 있습니다 . 그리고 "& "기호는 문자 엔터티를 나타냅니다.

따라서 XHTML에서는 불가능 합니다.

<script>
if (a<b && c<d) {
    alert('Hooray');
}
</script>

이 문제를 해결하기 위해 전체 스크립트를 CDATA섹션으로 묶을 수 있습니다 . 파서에게 '이 섹션에서 " <"와 " &"를 제어 문자로 취급하지 마십시오 . " JavaScript 엔진이 " <![CDATA["및 " ]]>"표시 를 해석하지 못하도록 주석으로 묶을 수 있습니다.

스크립트에 " <"또는 " &"가 포함되어 있지 않으면 CDATA섹션이 필요하지 않습니다 .


2
"CDATA 섹션은 전혀 효과가 없습니다"라는 문장은 구문을 인식하는 (제안 된) HTML5에는 해당되지 않습니다. w3.org/TR/html5/syntax.html#cdata-sections
danorton

3
@danorton 재미있는. 나는 그것이 아주 못생긴 믹스라고 생각합니다. 그래도 스크립트 내용에는 영향을 미치지 않습니다.
user123444555621

2
몰랐 어떤 </ 내부 스크립트 태그 나쁘다입니다.
Salman A

3
@SalmanA HTML의 이상 중 하나이며 공식적으로 ETAGO 라고 합니다. 더 알아보기 : mathiasbynens.be/notes/etago (이 기사에서는 해당 기능을 구현 한 브라우저가 없다고 말하지만 문제가 발생한 것 같습니다. 다른 도구 일 수도 있습니다)
user123444555621

1
실제로 유효성 검사 문제 <script>var b = "<b>bold</b>";</script>가 발생했습니다-유효성 검사에 실패했지만 답변을 읽고 <script>var b = "<b>bold<\/b>";</script>수정 한 후 변경 하십시오.
Salman A

30

기본적으로 XHTML과 HTML 인 문서를 작성할 수 있습니다. 문제는 XHTML 내에서 XML 파서가 스크립트 태그 의 &, <,> 문자를 해석하여 XML 파싱 오류를 발생 시킨다는 것 입니다. 따라서 엔티티를 사용하여 JavaScript를 작성할 수 있습니다. 예 :

if (a &gt; b) alert('hello world');

그러나 이것은 비현실적입니다. 더 큰 문제는 HTML로 페이지를 읽는 경우 태그 스크립트 는 '기본적으로'CDATA로 간주되며 이러한 JavaScript는 실행되지 않습니다. 따라서 XHTML 및 HTML 구문 분석기를 사용하여 동일한 페이지를 확인하려면 스크립트 태그를 XHTML의 CDATA 요소로 묶어야하지만 HTML로 묶지 않아야합니다.

이 트릭은 CDATA 요소의 시작을 JavaScript 주석으로 표시합니다. HTML에서 JavaScript 파서는 CDATA 태그를 무시합니다 (주석입니다). XHTML에서 XML 파서 (JavaScript 전에 실행)는이를 감지하고 CDATA 끝까지 CDATA로 나머지를 처리합니다.


24

X (HT) ML입니다. <and와 같은 기호를 사용할 때>예를 들어, 두 정수를 비교하기 위해 JavaScript 내에서 하는 경우 XML처럼 구문 분석해야하므로 태그의 시작 또는 끝으로 표시됩니다.

CDATA는 다음 줄을 의미합니다 (모든 ]]>것은 XML이 아니므로 그렇게 해석해서는 안됩니다).


18

마십시오 하지 HTML4에서 CDATA를 사용하지만 당신은 해야 XHTML에서 CDATA를 사용 합니다 당신이 <와> 같은 이스케이프 문자가있는 경우 XML에서 CDATA를 사용합니다.


11
CDATA는 HTML4에서 유효하지 않습니다. 간단히 말해서, 그것은 문법의 일부가 아닙니다. CDATA는 XML의 구문이며 XHTML은 XML 하위 집합입니다. 따라서 XML (및 해당 서브 세트) 내에서만 사용해야합니다. 반면 HTML은 XML이 아닙니다.
Loren Segal

17

외부 참조가 아닌 페이지에 JavaScript가 포함 된 경우 XHTML 유효성 검사가 올바르게 작동합니다.

XHTML을 사용하려면 페이지가 XML 마크 업 요구 사항을 엄격하게 준수해야합니다. JavaScript에는 특수한 의미의 문자가 포함될 수 있으므로 유효성 검사에서 형식이 잘못된 것으로 표시되지 않도록 CDATA로 랩핑해야합니다.

웹에서 HTML 페이지를 사용하면 태그 사이에 필요한 JavaScript 만 포함 할 수 있습니다. 웹 페이지에서 HTML의 유효성을 검사 할 때 JavaScript 내용은 CDATA (문자 데이터)로 간주되므로 유효성 검사기에서 무시됩니다. 웹 페이지 설정에서 최신 XHTML 표준을 따르는 경우에도 마찬가지입니다. XHTML을 사용하면 스크립트 태그 사이의 코드가 PCDATA (구문 분석 된 문자 데이터)로 간주되므로 유효성 검사기가 처리합니다.

이 때문에 웹 페이지를 '깨뜨리지 않고'(적어도 유효성 검사기가 관련되는 한) 페이지의 스크립트 태그 사이에 JavaScript를 포함시킬 수는 없습니다.

CDATA에 대한 자세한 내용은 여기에서 , XHTML 에 대한 자세한 내용은 여기 에서 확인할 수 있습니다 .



9

엄격한 XHTML 준수를 위해서는 CDATA가 너무 작아야하며 앰퍼샌드가 유효하지 않은 문자로 표시되지 않습니다.



8

CDATA는 브라우저에 텍스트를있는 그대로 표시하고 HTML로 렌더링하지 않도록 지시합니다.


6

CDATA는 내용이 XML이 아님을 나타냅니다.




2

그렇게하면 오래된 브라우저는 Javascript 코드를 구문 분석하지 않고 페이지가 깨지지 않습니다.

역 호환성. 좋아합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.