Bir komut dosyası etiketi içinde bir CDATA bölümü ne zaman gereklidir?


907

Are CDATA etiketleri zaman böylece komut etiketleri ve eğer hiç gerekli?

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>

18
XHTML aslında öldüğüne göre, bu artık ilgili bir mesele değil mi?
allyourcode

80
@allyourcode: XHTML'nin öldüğünü düşündüren nedir? HTML5? Onunla birlikte gitmek için XHTML5 var :)
Doktor J

4
@DoktorJ AFAIK xHTML sürüm 1'deydi. HTML eşdeğeri sürüm 4'tü. XHTML 2.0'da, xform, xlink, zaman ve svg ad alanlarını aynı özellikleri geliştirmenin bir yolu olarak spesifikasyona itmeyi amaçlayan bir çaba vardı. - xform / input-validation, time / animations, svg / canvas - eklenirken xHTML 2 spesifikasyonu için çabalar HTML 5 özelliklerine odaklanmıştır. Bu, xHTML 2'nin düşürüldüğü veya eski olduğu anlamına gelmez, ancak yakın gelecekte planlanmamıştır.
Mihai Stancu

14
Java Seam / JSF / Facelets geliştirmede XHTML ölmedi.
JoJo

15
@Mihai Stancu - bu tamamen doğru değil. W3C'ye göre HTML5 için bir XML sözdizimi vardır : " HTML5 için kullanılabilecek diğer sözdizimi XML'dir. Bu sözdizimi XHTML1 belgeleri ve uygulamaları ile uyumludur. Bu sözdizimini kullanan belgelerin bir XML ortam türü ve öğeleri gereksinimi ile sunulması gerekir konulmak üzere w3.org/1999/xhtml XML özelliklerine göre belirlenen kurallara aşağıdaki ad."
BrainSlugs83

Yanıtlar:


585

Eğer XML olarak ayrıştırma için belgenizi gerekirse bir CDATA bölümü gereklidir (örneğin bir XHTML sayfa XML olarak yorumlanır olduğunda) ve edebi yazabilmek istiyorum i<10ve a && byerine i&lt;10vea &amp;&amp; b XHTML çözümlü karakter verisi olarak JavaScript kodu ayrıştırmak gibi varsayılan olarak karakter verilerinin aksine. Bu, harici kaynak dosyalarında depolanan komut dosyalarıyla ilgili bir sorun değildir, ancak XHTML'deki herhangi bir satır içi JavaScript için muhtemelen bir CDATA bölümü kullanmak isteyeceksiniz.

Birçok XHTML sayfasının asla XML olarak ayrıştırılması amaçlanmadığını unutmayın, bu durumda bu bir sorun olmayacaktır.

Konuyla ilgili iyi bir yazı için bkz. Https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm


48
"Doğrulama" dan çok daha fazlası var. Çoğu katı XML ayrıştırıcısı, geçersiz bir karaktere çarparlarsa sayfa boyunca ilerlemez. W3C'yi mutlu etmek ve kırmızı yerine yeşil yapmaktan daha fazlası.
Loren Segal

40
Eğer kaçınırsanız &ve <karakterler, bir CDATA bölümü gerekmez; HTML ve XHTML'de iyi çalışır. Tüm önemli kodları harici komut dosyalarına koyarak ve örneğin satır içi komut dosyalarını kullanarak bunu kolayca başarabilirsiniz. değişkenleri başlangıç durumuna getirme (gerekirse dize değişmezlerinden kaçmak &/ dize / içine). <\x26\x3C
bobince

23
HTML5 durumunda ne olacak?
Mathew Attlee

5
@ Mathew Attle - bu iyi bir soru. İhtiyaç duyduğu dikkati aldığından emin olmak için ayrı bir konu üzerinde sormak harika bir soru olabilir.
Alex KeySmith

3
@Loren: O zaman hala tamamen doğrulama ile ilgili. Bir kullanıcı aracısının geçersiz XML'i reddetme derecesi dikeydir.
Yörüngedeki Hafiflik Yarışları

231

Tarayıcılar işaretlemeye XML olarak davrandığında:

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

Tarayıcılar işaretlemeye HTML olarak davrandığında:

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

Tarayıcılar işaretlemeyi HTML olarak değerlendirdiğinde ve XHTML 1.0 işaretlemenizin (örneğin) doğrulanmasını istediğinizde.

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

12
Kod güvenliği meselesi olarak, CDATA'larınızı blok yorumlarla çevrelemek daha iyidir /* ... */çünkü aksi halde satır kesmeleri kaldırılırsa kod kırılacaktır
BryanH

"... XML olarak" ilk bölümde "... yorumlanmamış metin olarak" olmamalıdır? Gelen stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean biz "verileri içeren bu dizeleri ... bkz olabilir XML biçimlendirmesi olarak yorumlanabilir, ancak olmamalıdır."
matt wilkie

@mattwilkie, "XML olarak" ile kastettiğim "Belge XML tabanlı bir mime türü ile gönderildiği veya işaretleme içeren dosya olduğu için tarayıcılar XML ayrıştırıcısını (HTML ayrıştırıcısının aksine) kullandıklarında msgstr "XML tabanlı bir dosya uzantısı".
Shadow2531

127

HTML

HTML ayrıştırıcısı , komut dosyası arasındaki <script>ve </script>komut dosyasının bir parçası olarak her şeyi ele alır . Bazı uygulamaların doğru bir kapanış etiketine bile ihtiyacı yoktur; özelliklerine</ göre doğru olan " " dilinde kod yorumlamasını durdururlar .

Güncelleme HTML5'te ve mevcut tarayıcılarda artık durum böyle değil.

Dolayısıyla, HTML'de bu mümkün değildir :

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

Bir CDATAbölümün hiçbir etkisi yoktur . Bu yüzden yazman gerekiyor

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

veya benzeri.

Bu, olarak sunulan XHTML dosyaları için de geçerlidir text/html. (IE XML içerik türlerini desteklemediğinden, bu çoğunlukla doğrudur.)

XML

XML'de farklı kurallar geçerlidir. (IE olmayan) tarayıcıların yalnızca XHMTL belgesi bir XML içerik türüyle sunuluyorsa XML ayrıştırıcı kullandığını unutmayın.

XML ayrıştırıcısı için, bir scriptetiket diğer herhangi bir etiketten daha iyi değildir. Özellikle, bir komut dosyası düğümü " <" tarafından tetiklenen metin olmayan alt düğümler içerebilir ; ve " &" 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>

Bu soruna geçici bir çözüm bulmak için, tüm komut dosyasını bir CDATAbölüme sarabilirsiniz . Bu ayrıştırıcıya şunu söyler: 'Bu bölümde, " <" ve " &" işaretlerine kontrol karakteri olarak davranmayın . " JavaScript motorunun " <![CDATA[" ve " ]]>" işaretlerini yorumlamasını önlemek için , bunları yorumlara yazabilirsiniz.

Komut dosyanız " <" veya " &" içermiyorsa , CDATAyine de bir bölüme ihtiyacınız yoktur .


2
Yapıyı tanıyan (önerilen) HTML5 için “CDATA bölümünün hiç etkisi yoktur” ifadesi doğru değildir. w3.org/TR/html5/syntax.html#cdata-sections
danorton

3
@danorton İlginç. Bence bu oldukça çirkin bir karışım. Yine de komut dosyası içeriğinde bir etkisi yok.
user123444555621

2
Herhangi bir </ iç komut dosyası etiketinin kötü olduğunu bilmiyordum .
Salman A

3
@SalmanA Bu HTML'nin tuhaflıklarından biri ve resmen ETAGO olarak adlandırılıyor . Daha fazla bilgi edinin: mathiasbynens.be/notes/etago (makale hiçbir tarayıcının bu özelliği uygulamadığını belirtirken, benim için biraz sorun yarattığından eminim. Belki başka bir araçta)
user123444555621

1
Aslında doğrulama sorunlarıyla karşılaştım - <script>var b = "<b>bold</b>";</script>doğrulayamıyor ama cevabınızı okuduktan ve <script>var b = "<b>bold<\/b>";</script>düzelttikten sonra değiştirdim .
Salman A

30

Temel olarak hem XHTML hem de HTML olan bir belgenin yazılmasına izin vermektir. Sorun, XHTML içinde XML ayrıştırıcısının komut dosyası etiketindeki &, <,> karakterlerini yorumlaması ve XML ayrıştırma hatasına neden olmasıdır. Böylece, JavaScript'inizi varlıklarla yazabilirsiniz, örneğin:

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

Ancak bu pratik değildir. Daha büyük sorun, sayfayı HTML olarak okursanız, etiket komut dosyasının 'varsayılan olarak' CDATA olarak kabul edilmesidir ve bu tür JavaScript çalışmaz. Bu nedenle, aynı sayfanın hem XHTML hem de HTML ayrıştırıcıları kullanarak Tamam olmasını istiyorsanız, komut dosyası etiketini XHTML'deki CDATA öğesine eklemeniz gerekir, ancak HTML'ye dahil ETMEMELİSİNİZ.

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 yok sayar (bu bir yorumdur). XHTML'de, XML ayrıştırıcısı (JavaScript'ten önce çalıştırılır) bunu algılar ve geri kalanını CDATA sonuna kadar CDATA olarak değerlendirir.


24

Bu bir X (HT) ML olayı. JavaScript gibi <ve >JavaScript gibi semboller kullandığınızda , örneğin iki tamsayıyı karşılaştırmak için bunun XML gibi ayrıştırılması gerekir, böylece bir etiketin başı veya sonu olarak işaretlenirler.

CDATA, aşağıdaki satırların (sonuna kadar olan her şeyin ]]>XML olmadığı ve dolayısıyla bu şekilde ayrıştırılmaması gerektiği) anlamına gelir .


18

Do not HTML4 içinde CDATA da kullanabilirsiniz ancak gerektiği XHTML'de CDATA kullanabilir ve gereken sen <ve> gibi çıkış kullanılmayan semboller varsa XML CDATA da kullanabilirsiniz.


11
CDATA HTML4'te geçerli değil. Basitçe söylemek gerekirse, bu dilbilgisinin bir parçası değil. CDATA, XML'in sözdizimidir ve XHTML bir XML alt kümesidir. Bu nedenle yalnızca XML (ve alt kümeleri) içinde kullanılmalıdır. HTML ise XML değil.
Loren Segal

17

Harici olarak başvurmak yerine sayfanıza JavaScript eklediğinizde XHTML doğrulamasının doğru şekilde çalışmasını sağlar.

XHTML, sayfanızın kesinlikle XML biçimlendirme gereksinimlerine uygun olmasını gerektirir. JavaScript özel anlamı olan karakterler içerebileceğinden, doğrulamanın hatalı biçimlendirilmiş olarak işaretlenmediğinden emin olmak için CDATA'ya sarmalısınız.

Web'deki HTML sayfaları ile ve arasına gerekli JavaScript'i ekleyebilirsiniz. Web sayfanızdaki HTML'yi doğruladığınızda JavaScript içeriği, doğrulayıcı tarafından göz ardı edilen CDATA (karakter verileri) olarak kabul edilir. Web sayfanızı oluştururken daha yeni XHTML standartlarını izlerseniz aynı şey geçerli değildir. XHTML ile kod etiketleri arasındaki kod, doğrulayıcı tarafından işlenen PCDATA (ayrıştırılmış karakter verileri) olarak kabul edilir.

Bu nedenle, web sayfanızı 'kırmadan' sayfanızdaki komut dosyası etiketlerinin arasına JavaScript ekleyemezsiniz (en azından doğrulayıcı söz konusu olduğunda).

Sen öğrenebilirsiniz burada CDATA'da hakkında daha fazla ve burada XHTML hakkında daha fazla .



9

Sıkı XHTML uyumluluğu için CDATA'ya daha az ihtiyacınız vardır ve ve işaretleri geçersiz karakterler olarak işaretlenmez.


8

xhtml doğrulaması sırasında xml hatalarını önlemek için.


8

CDATA, tarayıcıya metni olduğu gibi görüntülemesini ve HTML olarak göstermemesini söyler.


6

CDATA, içeriğin XML olmadığını belirtir.




2

Böylece eski tarayıcı Javascript kodunu ayrıştırmaz ve sayfa kırılmaz.

Geriye dönük uyumluluk. Seveceksin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.