javascript - Bir script etiketi içinde CDATA bölümü ne zaman gereklidir?
CDATA etiketleri script etiketlerinde hiç gerekli midir ve gerekiyorsa ne zaman?
Başka bir deyişle, bu ne zaman ve nerede:
<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>
buna tercih edilir
<script type="text/javascript">
...code...
</script>
Cevap #1
Belgenizin XML olarak ayrıştırılmasını istiyorsanız (örneğin bir XHTML sayfası XML olarak yorumlandığında) ve i<10 ve a && b ifadelerini i<10 ve a && b yerine yazabilmek istiyorsanız, bir CDATA bölümü gereklidir; çünkü XHTML, JavaScript kodunu varsayılan olarak karakter verisi yerine ayrıştırılmış karakter verisi olarak ayrıştıracaktır. Bu, harici kaynak dosyalarında depolanan betiklerle bir sorun değildir, ancak XHTML içindeki herhangi bir satır içi JavaScript için muhtemelen bir CDATA bölümü kullanmak isteyeceksiniz.
Birçok XHTML sayfanın XML olarak ayrıştırılmak için tasarlanmadığını unutmayın; bu durumda bu bir sorun olmayacaktır.
Konu hakkında iyi bir yazı için bkz. https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm
Cevap #2
Tarayıcılar işaretlemeyi XML olarak ele aldığında:
<script>
<![CDATA[
...code...
]]>
</script>
Tarayıcılar işaretlemeyi HTML olarak ele aldığında:
<script>
...code...
</script>
Tarayıcılar işaretlemeyi HTML olarak ele aldığında ve XHTML 1.0 işaretlemenizin (örneğin) doğrulanmasını istediğinizde.
<script>
//<![CDATA[
...code...
//]]>
</script>
Cevap #3
HTML
Bir HTML ayrıştırıcı, <script> ile </script> arasındaki her şeyi betiğin bir parçası olarak kabul edecektir. Bazı uygulamalar doğru bir kapanış etiketi gerektirmez; betik yorumlamayı ".</" noktasında durdurur, bu standartlara göre doğrudur
Güncelleme HTML5'te ve mevcut tarayıcılarda, durum artık böyle değil.
Yani, HTML'de bu mümkün değildir:
<script>
var x = '</script>';
alert(x)
</script>
CDATA bölümü hiçbir etkisi yoktur. Bu yüzden yazmanız gerekir
var x = '<' + '/script>'; // or
var x = '<\/script>';
veya benzeri.
Bu aynı zamanda text/html olarak sunulan XHTML dosyaları için de geçerlidir. (IE XML içerik türlerini desteklemediğinden, bu çoğunlukla doğrudur.)
XML
XML'de farklı kurallar geçerlidir. (IE dışındaki) tarayıcıların yalnızca XHTML belgesi XML içerik tipi ile sunulduğunda bir XML ayrıştırıcı kullandığını unutmayın.
XML ayrıştırıcısı için, bir script etiketi diğer herhangi bir etiketten daha iyi değildir. Özellikle, bir script düğümü, "<" ile tetiklenen metin dışı alt düğümler içerebilir; ve bir "&" işareti bir karakter varlığını belirtir.
Yani, XHTML'de bu mümkün değildir:
<script>
if (a<b && c<d) {
alert('Hooray');
}
</script>
Bunu aşmak için, tüm betiği bir CDATA bölümüne sarabilirsiniz. Bu, ayrıştırıcıya şunu söyler: 'Bu bölümde, "<" ve "&" karakterlerini kontrol karakteri olarak ele alma.' JavaScript motorunun "<![CDATA[" ve "]]>" işaretlerini yorumlamasını önlemek için, bunları yorum satırlarına sarabilirsiniz.
Eğer skriptiniz herhangi bir "<" veya "&" içermiyorsa, zaten bir CDATA bölümüne ihtiyacınız yok.
Cevap #4
Temelde, hem XHTML hem de HTML olan bir belge yazılmasına izin vermektir. Sorun, XHTML içinde XML ayrıştırıcısının script etiketi içindeki &, <, > karakterlerini yorumlayacak olması ve bu durumun XML ayrıştırma hatasına yol açmasıdır. Bu yüzden, JavaScript’inizi ögeler ile yazabilirsiniz, örneğin:
if (a > b) alert('hello world');
Ama bu pratik değil. Daha büyük sorun, sayfayı HTML olarak okursanız, script etiketinin varsayılan olarak CDATA olarak kabul edilmesi ve böyle bir JavaScript’in çalışmaması. Bu nedenle, aynı sayfanın hem XHTML hem de HTML çözümleyicileriyle sorunsuz çalışmasını istiyorsanız, XHTML’de script etiketini CDATA elementi içinde kapsamanız, ancak HTML’de kapsamamanız gerekir.
Bu hile, bir CDATA öğesinin başlangıcını bir JavaScript yorumu olarak işaretler; HTML'de JavaScript ayrıştırıcısı CDATA etiketini yoksayar (bu bir yorumdur). XHTML'de, JavaScript'ten önce çalıştırılan XML ayrıştırıcısı bunu algılar ve CDATA sonuna kadar olan kısmı CDATA olarak işler.
Cevap #5
Bu bir X(HT)ML meselesi. JavaScript içinde < ve > gibi semboller kullandığınızda, örneğin iki tam sayıyı karşılaştırmak için, bu XML gibi ayrıştırılmalı, dolayısıyla bir etiketin başlangıcı veya sonu olarak işaretlenecektir.
CDATA, sonraki satırların (]]> işaretine kadar olan her şey) XML olmadığını ve bu yüzden bu şekilde parse edilmemesi gerektiğini ifade eder.
Cevap #6
HTML4'te CDATA kullanmayın, ancak XHTML'de CDATA kullanmalısınız ve eğer < ve > gibi kaçışsız semboller varsa XML'de CDATA kullanmak zorundasınız.
Cevap #7
Sayfanızda JavaScript dışarıdan referans verilmek yerine gömülü olduğunda XHTML doğrulamasının doğru çalışmasını sağlamak için.
XHTML, sayfanızın XML işaretleme gereksinimlerine tam olarak uymasını gerektirir. JavaScript özel anlam taşıyan karakterler içerebileceğinden, doğrulamanın bunu hatalı olarak işaretlememesi için onu CDATA ile sarmanız gerekir.
Web üzerindeki HTML sayfalarında gerekli JavaScript'i ve etiketleri arasına dahil edebilirsiniz. Web sayfanızdaki HTML'i doğruladığınızda, JavaScript içeriği CDATA (karakter verisi) olarak kabul edilir ve bu nedenle doğrulayıcı tarafından göz ardı edilir. Bununla birlikte, web sayfanızı oluştururken daha yeni XHTML standartlarını takip ederseniz durum böyle değildir. XHTML ile script etiketleri arasındaki kod PCDATA (parçalanmış karakter verisi) olarak kabul edilir ve bu nedenle doğrulayıcı tarafından işlenir.
Bunun nedeniyle, web sayfanızın geçerliliğini bozmadan sayfanızdaki script etiketlerinin arasına JavaScript ekleyemezsiniz (en azından doğrulayıcı açısından).
CDATA hakkında daha fazla bilgiyi burada öğrenebilirsiniz ve XHTML hakkında daha fazla bilgiyi burada öğrenebilirsiniz.
Cevap #8
CDATA, içindekilerin XML olmadığını gösterir.
İşte Wikipedia'da bir açıklama
