มีCDATAแท็กเคยจำเป็นในแท็กสคริปต์และหากดังนั้นเมื่อ?
กล่าวอีกนัยหนึ่งคือเมื่อไรและที่ไหน:
<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>
ดีกว่านี้:
<script type="text/javascript">
...code...
</script>
มีCDATAแท็กเคยจำเป็นในแท็กสคริปต์และหากดังนั้นเมื่อ?
กล่าวอีกนัยหนึ่งคือเมื่อไรและที่ไหน:
<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>
ดีกว่านี้:
<script type="text/javascript">
...code...
</script>
คำตอบ:
จำเป็นต้องใช้ส่วน CDATA หากคุณต้องการให้เอกสารของคุณแยกวิเคราะห์เป็น XML (เช่นเมื่อหน้า XHTML ถูกตีความว่าเป็น XML) และคุณต้องการที่จะสามารถเขียนตัวอักษรi<10
และa && b
แทนที่จะเป็นi<10
และa && b
เนื่องจาก XHTML จะแยกรหัส JavaScript เป็นข้อมูลอักขระแยกวิเคราะห์ ตรงข้ามกับข้อมูลตัวอักษรโดยค่าเริ่มต้น นี่ไม่ใช่ปัญหากับสคริปต์ที่เก็บไว้ในไฟล์ต้นฉบับภายนอก แต่สำหรับ JavaScript แบบอินไลน์ใด ๆ ใน XHTML คุณอาจต้องการใช้ส่วน CDATA
โปรดทราบว่าหน้า XHTML จำนวนมากไม่เคยถูกแยกวิเคราะห์เป็น XML ซึ่งในกรณีนี้จะไม่มีปัญหา
หากต้องการเขียนบทความที่ดีให้ดูที่https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm
&
และ<
ตัวละครคุณไม่จำเป็นต้องมีส่วน CDATA มันจะทำงานได้ดีทั้งใน HTML และ XHTML คุณสามารถทำได้โดยใส่โค้ดที่สำคัญทั้งหมดลงในสคริปต์ภายนอกและเพียงแค่ใช้สคริปต์แบบอินไลน์เพื่อ ตัวแปรเริ่มต้น (หนี&
/ <
ถึง\x26
/ \x3C
ในสตริงตัวอักษรถ้าคุณต้องการ)
เมื่อเบราว์เซอร์จัดการกับมาร์กอัปเป็น XML:
<script>
<![CDATA[
...code...
]]>
</script>
เมื่อเบราว์เซอร์ใช้มาร์กอัปเป็น HTML:
<script>
...code...
</script>
เมื่อเบราว์เซอร์พิจารณาว่ามาร์กอัปเป็น HTML และคุณต้องการให้ XHTML 1.0 มาร์กอัป (ตัวอย่าง) ตรวจสอบ
<script>
//<![CDATA[
...code...
//]]>
</script>
/* ... */
เพราะมิฉะนั้นถ้าการแบ่งบรรทัดถูกลบออกโค้ดจะแตก
เครื่องมือแยกวิเคราะห์ 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 จะใช้กฎที่แตกต่างกัน โปรดทราบว่าเบราว์เซอร์ (ไม่ใช่ IE) ใช้ตัวแยกวิเคราะห์ XML เท่านั้นหากเอกสาร XHMTL ให้บริการกับประเภทเนื้อหา XML
สำหรับตัวแยกวิเคราะห์ XML script
แท็กนั้นไม่ดีไปกว่าแท็กอื่น ๆ โดยเฉพาะอย่างยิ่งโหนดสคริปต์อาจมีโหนดย่อยที่ไม่ใช่ข้อความซึ่งทริกเกอร์โดย " <
"; และเครื่องหมาย " &
" หมายถึงเอนทิตีของอักขระ
ดังนั้นใน XHTML นี่เป็นไปไม่ได้:
<script>
if (a<b && c<d) {
alert('Hooray');
}
</script>
หากต้องการแก้ไขสิ่งนี้คุณสามารถรวมสคริปต์ทั้งหมดในCDATA
ส่วน สิ่งนี้จะบอกตัวแยกวิเคราะห์: 'ในส่วนนี้อย่าใช้ " <
" และ " &
" เป็นตัวควบคุม ' เพื่อป้องกันไม่ให้เอ็นจิ้น JavaScript ตีความเครื่องหมาย " <![CDATA[
" และ " ]]>
" คุณสามารถใส่คำเหล่านั้นลงในความคิดเห็น
หากสคริปต์ของคุณไม่มี " <
" หรือ " &
" คุณไม่จำเป็นต้องมีCDATA
ส่วนใด ๆ
</
ไม่ดี
<script>var b = "<b>bold</b>";</script>
ล้มเหลวในการตรวจสอบ แต่หลังจากอ่านคำตอบของคุณและเปลี่ยนเป็น<script>var b = "<b>bold<\/b>";</script>
แก้ไข
โดยทั่วไปจะอนุญาตให้เขียนเอกสารที่เป็นทั้ง XHTML และ HTML ปัญหาคือภายใน XHTML ตัวแยกวิเคราะห์ XML จะตีความอักขระ &, <,> ในแท็กสคริปต์และทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์ XML ดังนั้นคุณสามารถเขียน JavaScript ของคุณด้วยเอนทิตีเช่น:
if (a > b) alert('hello world');
แต่นี่เป็นสิ่งที่ทำไม่ได้ ปัญหาที่ใหญ่กว่าคือถ้าคุณอ่านหน้าใน HTML สคริปต์แท็กจะถือว่า CDATA 'เป็นค่าเริ่มต้น' และ JavaScript ดังกล่าวจะไม่ทำงาน ดังนั้นหากคุณต้องการให้เพจเดียวกันเป็น OK ทั้งคู่โดยใช้ตัวแยกวิเคราะห์ XHTML และ HTML คุณจะต้องใส่แท็กสคริปต์ในองค์ประกอบ CDATA ใน XHTML แต่ไม่ต้องล้อมรอบใน HTML
เคล็ดลับนี้เป็นจุดเริ่มต้นขององค์ประกอบ CDATA เป็นความคิดเห็น JavaScript ใน HTML ตัวแยกวิเคราะห์ JavaScript จะละเว้นแท็ก CDATA (เป็นความคิดเห็น) ใน XHTML ตัวแยกวิเคราะห์ XML (ซึ่งเรียกใช้ก่อน JavaScript) ตรวจพบและปฏิบัติต่อส่วนที่เหลือจนกระทั่งสิ้นสุด CDATA เป็น CDATA
มันเป็นสิ่ง X (HT) ML เมื่อคุณใช้สัญลักษณ์เช่น<
และ>
ภายใน JavaScript เช่นสำหรับการเปรียบเทียบจำนวนเต็มสองจำนวนนี้จะต้องมีการแยกวิเคราะห์เช่น XML ดังนั้นพวกเขาจะทำเครื่องหมายเป็นจุดเริ่มต้นหรือจุดสิ้นสุดของแท็ก
CDATA หมายความว่าบรรทัดต่อไปนี้ (ทุกอย่างจนถึง]]>
ไม่ใช่ XML และไม่ควรแยกวิเคราะห์ด้วยวิธีดังกล่าว
อย่าได้ใช้ CDATA ใน HTML4 แต่คุณควรใช้ CDATA ใน XHTML และต้องใช้ CDATA ในรูปแบบ XML ถ้าคุณมีสัญลักษณ์ที่ไม่ใช้ Escape เช่น <และ>
เพื่อให้แน่ใจว่าการตรวจสอบ XHTML ทำงานได้อย่างถูกต้องเมื่อคุณฝัง JavaScript ในหน้าของคุณแทนที่จะอ้างอิงจากภายนอก
XHTML ต้องการให้เพจของคุณปฏิบัติตามข้อกำหนดมาร์กอัป XML อย่างเคร่งครัด เนื่องจาก JavaScript อาจมีอักขระที่มีความหมายพิเศษคุณต้องล้อมไว้ใน CDATA เพื่อให้แน่ใจว่าการตรวจสอบไม่ได้ตั้งค่าสถานะว่าผิดรูปแบบ
ด้วยหน้า HTML บนเว็บคุณสามารถรวม JavaScript ที่จำเป็นระหว่างและแท็ก เมื่อคุณตรวจสอบ HTML บนหน้าเว็บของคุณเนื้อหา JavaScript จะถือเป็น CDATA (ข้อมูลตัวอักษร) ที่ผู้ตรวจสอบจะเพิกเฉย สิ่งนี้ไม่เป็นความจริงหากคุณปฏิบัติตามมาตรฐาน XHTML ล่าสุดในการตั้งค่าหน้าเว็บของคุณ ด้วย XHTML โค้ดระหว่างแท็กสคริปต์จะถูกพิจารณาว่าเป็น PCDATA (ข้อมูลอักขระที่แยกวิเคราะห์) ซึ่งจะถูกประมวลผลโดยผู้ตรวจสอบความถูกต้อง
ด้วยเหตุนี้คุณจึงไม่สามารถรวม JavaScript ระหว่างแท็กสคริปต์บนหน้าเว็บของคุณโดยไม่ทำให้หน้าเว็บของคุณ 'เสียหาย' (อย่างน้อยที่สุดเท่าที่ตัวตรวจสอบความเกี่ยวข้อง)
คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ CDATA ที่นี่และเพิ่มเติมเกี่ยวกับ XHTML ที่นี่
CDATA บ่งชี้ว่าเนื้อหาภายในไม่ใช่ XML
นี่คือคำอธิบายเกี่ยวกับวิกิพีเดีย
เมื่อคุณต้องการ XHTML ที่เข้มงวดคุณต้องมี CDATA น้อยกว่าและเครื่องหมายแอมเปอร์แซนด์จะไม่ถูกตั้งค่าสถานะเป็นอักขระที่ไม่ถูกต้อง
เพื่อหลีกเลี่ยงข้อผิดพลาด xml ในระหว่างการตรวจสอบ xhtml
CDATA บอกให้เบราว์เซอร์แสดงข้อความตามที่เป็นและไม่แสดงเป็น HTML
CDATA บ่งชี้ว่าเนื้อหาภายในไม่ใช่ XML
จำเป็นต้องใช้ CDATA ในภาษาถิ่น XML ใด ๆ เนื่องจากข้อความภายในโหนด XML จะถือว่าเป็นองค์ประกอบย่อยก่อนที่จะถูกประเมินเป็น JavaScript นี่คือเหตุผลที่JSLint บ่นเกี่ยวกับ<
ตัวละครใน regexes
อ้างอิง
เมื่อคุณต้องการให้มันตรวจสอบ (ใน XML / XHTML - ขอบคุณLoren Segal )
วิธีนี้ทำให้เบราว์เซอร์รุ่นเก่าไม่แยกวิเคราะห์โค้ด Javascript และหน้าเว็บจะไม่แตก
ความเข้ากันได้ย้อนหลัง ต้องรักมัน