ส่วน 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 มีความพยายามเข้มข้นใน xHTML 2.0 ตั้งใจที่จะผลัก xform, xlink, เวลาและ svg namespaces ลงในสเป็กของการปรับปรุงคุณสมบัติเดียวกัน HTML 5 คือ การเพิ่ม - การตรวจสอบความถูกต้องของ xform / input, เวลา / แอนิเมชัน, svg / canvas - แต่ความพยายามสำหรับข้อมูลจำเพาะ xHTML 2 ได้รับการมุ่งเน้นไปที่คุณสมบัติ HTML 5 ไม่ได้หมายความว่า xHTML 2 ถูกทิ้งหรือล้าสมัย แต่ไม่ได้วางแผนไว้ในอนาคตอันใกล้
Mihai Stancu

14
XHTML ไม่ตายในการพัฒนา Java Seam / JSF / Facelets
JoJo

15
@Mihai Stancu - ไม่ถูกต้องทั้งหมด ตาม W3C มีไวยากรณ์ XML สำหรับ HTML5 : "ไวยากรณ์อื่น ๆ ที่สามารถใช้สำหรับ HTML5 คือ XML ไวยากรณ์นี้เข้ากันได้กับเอกสารและการใช้งาน XHTML1 เอกสารที่ใช้ไวยากรณ์นี้จะต้องมีประเภทสื่อและองค์ประกอบ XML ที่ต้องการ ที่จะวางในเนมสเปซw3.org/1999/xhtmlตามกฎที่กำหนดไว้โดยข้อกำหนดคุณสมบัติ XML "
BrainSlugs83

คำตอบ:


585

จำเป็นต้องใช้ส่วน CDATA หากคุณต้องการให้เอกสารของคุณแยกวิเคราะห์เป็น XML (เช่นเมื่อหน้า XHTML ถูกตีความว่าเป็น XML) และคุณต้องการที่จะสามารถเขียนตัวอักษรi<10และa && bแทนที่จะเป็นi&lt;10และa &amp;&amp; bเนื่องจาก XHTML จะแยกรหัส JavaScript เป็นข้อมูลอักขระแยกวิเคราะห์ ตรงข้ามกับข้อมูลตัวอักษรโดยค่าเริ่มต้น นี่ไม่ใช่ปัญหากับสคริปต์ที่เก็บไว้ในไฟล์ต้นฉบับภายนอก แต่สำหรับ JavaScript แบบอินไลน์ใด ๆ ใน XHTML คุณอาจต้องการใช้ส่วน 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ในสตริงตัวอักษรถ้าคุณต้องการ)
bobince

23
ในกรณีของ HTML5 มีอะไรบ้าง
Mathew Attlee

5
@ Matthew Attle - นี่เป็นคำถามที่ดี เป็นคำถามที่ดีที่จะถามในหัวข้อแยกต่างหากเพื่อให้แน่ใจว่าได้รับความสนใจตามที่ต้องการ
Alex KeySmith

3
@ Loren: จากนั้นก็ยังสมบูรณ์เกี่ยวกับการตรวจสอบ ขอบเขตที่ตัวแทนผู้ใช้ปฏิเสธ XML ที่ไม่ถูกต้องคือ orthogonal
การแข่งขัน Lightness ใน Orbit

231

เมื่อเบราว์เซอร์จัดการกับมาร์กอัปเป็น XML:

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

เมื่อเบราว์เซอร์ใช้มาร์กอัปเป็น HTML:

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

เมื่อเบราว์เซอร์พิจารณาว่ามาร์กอัปเป็น HTML และคุณต้องการให้ XHTML 1.0 มาร์กอัป (ตัวอย่าง) ตรวจสอบ

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

12
เช่นเดียวกับเรื่องของความปลอดภัยของรหัสคุณควรล้อม CDATAs ของคุณด้วยความคิดเห็นแบบบล็อก/* ... */เพราะมิฉะนั้นถ้าการแบ่งบรรทัดถูกลบออกโค้ดจะแตก
BryanH

ไม่ควร "... เป็น XML" ในส่วนแรกเป็น "... เป็นข้อความที่ไม่ถูกตีความ"? ในstackoverflow.com/questions/2784183/what-does-cdata-in-xml-meanเราเห็น "... สตริงเหล่านี้มีข้อมูลที่สามารถตีความได้ว่าเป็นมาร์กอัป XML แต่ไม่ควรเป็น"
matt wilkie

@mattwilkie สิ่งที่ฉันหมายถึงด้วย "as XML" คือ "เมื่อเบราว์เซอร์ใช้ตัวแยกวิเคราะห์ XML ของพวกเขา (ตรงข้ามกับตัวแยกวิเคราะห์ HTML) เพื่อแยกวิเคราะห์มาร์กอัปเนื่องจากเอกสารถูกส่งด้วยประเภท mime ที่ยึดตาม XML หรือไฟล์ที่มีมาร์กอัป นามสกุลไฟล์แบบ XML "
Shadow2531

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 จะใช้กฎที่แตกต่างกัน โปรดทราบว่าเบราว์เซอร์ (ไม่ใช่ IE) ใช้ตัวแยกวิเคราะห์ XML เท่านั้นหากเอกสาร XHMTL ให้บริการกับประเภทเนื้อหา 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

3
@SalmanA นั่นเป็นหนึ่งใน odditys HTML และเรียกอย่างเป็นทางการETAGO เรียนรู้เพิ่มเติม: mathiasbynens.be/notes/etago (ในขณะที่บทความระบุว่าเบราว์เซอร์ไม่เคยใช้คุณสมบัตินั้นฉันค่อนข้างแน่ใจว่ามันทำให้เกิดปัญหากับฉันบางทีเครื่องมืออื่น ๆ )
user123444555621

1
ที่จริงฉันพบปัญหาในการตรวจสอบ - <script>var b = "<b>bold</b>";</script>ล้มเหลวในการตรวจสอบ แต่หลังจากอ่านคำตอบของคุณและเปลี่ยนเป็น<script>var b = "<b>bold<\/b>";</script>แก้ไข
Salman

30

โดยทั่วไปจะอนุญาตให้เขียนเอกสารที่เป็นทั้ง XHTML และ HTML ปัญหาคือภายใน XHTML ตัวแยกวิเคราะห์ XML จะตีความอักขระ &, <,> ในแท็กสคริปต์และทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์ XML ดังนั้นคุณสามารถเขียน JavaScript ของคุณด้วยเอนทิตีเช่น:

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

แต่นี่เป็นสิ่งที่ทำไม่ได้ ปัญหาที่ใหญ่กว่าคือถ้าคุณอ่านหน้าใน HTML สคริปต์แท็กจะถือว่า CDATA 'เป็นค่าเริ่มต้น' และ JavaScript ดังกล่าวจะไม่ทำงาน ดังนั้นหากคุณต้องการให้เพจเดียวกันเป็น OK ทั้งคู่โดยใช้ตัวแยกวิเคราะห์ XHTML และ HTML คุณจะต้องใส่แท็กสคริปต์ในองค์ประกอบ CDATA ใน XHTML แต่ไม่ต้องล้อมรอบใน HTML

เคล็ดลับนี้เป็นจุดเริ่มต้นขององค์ประกอบ CDATA เป็นความคิดเห็น JavaScript ใน HTML ตัวแยกวิเคราะห์ JavaScript จะละเว้นแท็ก CDATA (เป็นความคิดเห็น) ใน XHTML ตัวแยกวิเคราะห์ XML (ซึ่งเรียกใช้ก่อน JavaScript) ตรวจพบและปฏิบัติต่อส่วนที่เหลือจนกระทั่งสิ้นสุด CDATA เป็น CDATA


24

มันเป็นสิ่ง X (HT) ML เมื่อคุณใช้สัญลักษณ์เช่น<และ>ภายใน JavaScript เช่นสำหรับการเปรียบเทียบจำนวนเต็มสองจำนวนนี้จะต้องมีการแยกวิเคราะห์เช่น XML ดังนั้นพวกเขาจะทำเครื่องหมายเป็นจุดเริ่มต้นหรือจุดสิ้นสุดของแท็ก

CDATA หมายความว่าบรรทัดต่อไปนี้ (ทุกอย่างจนถึง]]>ไม่ใช่ XML และไม่ควรแยกวิเคราะห์ด้วยวิธีดังกล่าว


18

อย่าได้ใช้ CDATA ใน HTML4 แต่คุณควรใช้ CDATA ใน XHTML และต้องใช้ CDATA ในรูปแบบ XML ถ้าคุณมีสัญลักษณ์ที่ไม่ใช้ Escape เช่น <และ>


11
CDATA ไม่ถูกต้องใน HTML4 พูดง่ายๆก็คือมันไม่ได้เป็นส่วนหนึ่งของไวยากรณ์ CDATA เป็นไวยากรณ์ของ XML และ XHTML เป็นชุดย่อย XML ดังนั้นจึงควรใช้ภายใน XML (และชุดย่อย) เท่านั้น HTML ในทางกลับกันไม่ใช่ XML
Loren Segal

17

เพื่อให้แน่ใจว่าการตรวจสอบ XHTML ทำงานได้อย่างถูกต้องเมื่อคุณฝัง JavaScript ในหน้าของคุณแทนที่จะอ้างอิงจากภายนอก

XHTML ต้องการให้เพจของคุณปฏิบัติตามข้อกำหนดมาร์กอัป XML อย่างเคร่งครัด เนื่องจาก JavaScript อาจมีอักขระที่มีความหมายพิเศษคุณต้องล้อมไว้ใน CDATA เพื่อให้แน่ใจว่าการตรวจสอบไม่ได้ตั้งค่าสถานะว่าผิดรูปแบบ

ด้วยหน้า HTML บนเว็บคุณสามารถรวม JavaScript ที่จำเป็นระหว่างและแท็ก เมื่อคุณตรวจสอบ HTML บนหน้าเว็บของคุณเนื้อหา JavaScript จะถือเป็น CDATA (ข้อมูลตัวอักษร) ที่ผู้ตรวจสอบจะเพิกเฉย สิ่งนี้ไม่เป็นความจริงหากคุณปฏิบัติตามมาตรฐาน XHTML ล่าสุดในการตั้งค่าหน้าเว็บของคุณ ด้วย XHTML โค้ดระหว่างแท็กสคริปต์จะถูกพิจารณาว่าเป็น PCDATA (ข้อมูลอักขระที่แยกวิเคราะห์) ซึ่งจะถูกประมวลผลโดยผู้ตรวจสอบความถูกต้อง

ด้วยเหตุนี้คุณจึงไม่สามารถรวม JavaScript ระหว่างแท็กสคริปต์บนหน้าเว็บของคุณโดยไม่ทำให้หน้าเว็บของคุณ 'เสียหาย' (อย่างน้อยที่สุดเท่าที่ตัวตรวจสอบความเกี่ยวข้อง)

คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ CDATA ที่นี่และเพิ่มเติมเกี่ยวกับ XHTML ที่นี่



9

เมื่อคุณต้องการ XHTML ที่เข้มงวดคุณต้องมี CDATA น้อยกว่าและเครื่องหมายแอมเปอร์แซนด์จะไม่ถูกตั้งค่าสถานะเป็นอักขระที่ไม่ถูกต้อง



8

CDATA บอกให้เบราว์เซอร์แสดงข้อความตามที่เป็นและไม่แสดงเป็น HTML



5

จำเป็นต้องใช้ CDATA ในภาษาถิ่น XML ใด ๆ เนื่องจากข้อความภายในโหนด XML จะถือว่าเป็นองค์ประกอบย่อยก่อนที่จะถูกประเมินเป็น JavaScript นี่คือเหตุผลที่JSLint บ่นเกี่ยวกับ<ตัวละครใน regexes

อ้างอิง



2

วิธีนี้ทำให้เบราว์เซอร์รุ่นเก่าไม่แยกวิเคราะห์โค้ด Javascript และหน้าเว็บจะไม่แตก

ความเข้ากันได้ย้อนหลัง ต้องรักมัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.