it-swarm-tr.com

Neden kendi kendine kapanan komut dosyası öğeleri çalışmıyor?

Tarayıcıların doğru olarak tanımamasının nedeni nedir:

<script src="foobar.js" /> <!-- self-closing script element -->

Sadece bu tanınır:

<script src="foobar.js"></script>

Bu, XHTML desteği kavramını bozuyor mu?

Not: Bu ifade en azından IE (6-8 beta 2) için doğrudur.

1247
dimarzionist

XHTML 1 teknik özelliği şöyle diyor:

Ek.3. Öğenin Küçültülmesi ve Boş Öğenin İçeriği

İçeriği EMPTY (örneğin, boş bir başlık veya paragraf) olmayan bir öğenin boş bir örneği göz önüne alındığında simge durumuna küçültülmüş formu kullanmaz (örneğin, <p> </p> kullanın ve <p /> kullanmayın).

XHTML DTD script elemanlarını şu şekilde belirtir:

<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
456
squadette

Brad ve filonun söylediklerini eklemek için, kendi kendine kapanan XML sözdizimi <script /> aslında doğru XML'dir doğru XML'dir, ancak pratikte çalışması için sunucunun ayrıca, HTTP İçerik Türü başlığında (ve değil application/xhtml+xml) text/html gibi bir XML mimetipi ile belgelerinizi doğru biçimlendirilmiş XML olarak göndermesi gerekir.

Ancak, bir XML mimetipi göndermek, sayfalarınızın IE7 tarafından ayrıştırılmamasına neden olur, bu yalnızca text/html öğesini beğenir.

w içinden:

Özetle, 'application/xhtml + xml', XHTML Ailesi dokümanları için kullanılmalı ve 'text/html' kullanımı HTML uyumlu XHTML 1.0 dokümanlarıyla sınırlı tutulmalıdır. 'application/xml' ve 'text/xml' de kullanılabilir, ancak uygun olan her durumda, 'genel XML ortam türleri yerine' application/xhtml + xml 'kullanılmalıdır.

Birkaç ay önce buna şaşırmıştım ve tek uygulanabilir (FF3 + ve IE7 ile uyumlu) çözümü eski <script></script> sözdizimini text/html (HTML sözdizimi + HTML mimetipi) ile kullanmaktı.

Sunucunuz text/html türünü HTTP başlıklarına gönderirse, düzgün şekilde oluşturulmuş XHTML belgeleriyle bile, FF3 +, HTML oluşturma modunu kullanır; bu, <script /> 'nin çalışmayacağı anlamına gelir (bu bir değişiklik, Firefox önceden daha az katıydı).

Bu, http-equiv meta elementleri, belgenizin içindeki XML prolog veya doktrin ile ilgili herhangi bir sorun olmadan bağımsız olarak gerçekleşir - Firefox, HTML veya XML ayrıştırıcısının belgenin içinde görünüp görünmeyeceğini belirleyen text/html başlığını aldıktan sonra dallanır. <script /> öğesini anlayın.

225
joelhardi

Herhangi birinin merak etmesi durumunda, asıl sebep, HTML'nin aslında XML'in garip ağabeyi olan SGML'nin bir lehçesiydi. SGML-topraklarında, elemanlar DTD'de kendiliğinden kapanan (örneğin, BR, HR, INPUT), dolaylı olarak kapatılabilir (örneğin P, LI, TD) veya açıkça kapatılabilir (örn. TABLE, DIV, SCRIPT) olarak belirtilebilir. Elbette XML'in bunun hiçbir konsepti yoktur.

Modern tarayıcılar tarafından kullanılan etiket çorbası ayrıştırıcıları, bu ayrıcalık modellerini artık saf SGML olmasa da, bu mirastan çıkardılar. Ve elbette, özenle hazırlanmış XHTML'niz, XML mime türü ile göndermediğiniz sürece, kötü yazılmış SGML'den ilham alan etiket çorbası olarak değerlendirilir. Bu yüzden de ...

<p><div>hello</div></p>

... tarayıcı tarafından şu şekilde yorumlanır:

<p></p><div>hello</div><p></p>

... DOM'a karşı kodlamayı denediğinizde sizi uyandırabilecek hoş ve karanlık bir hatanın tarifi.

150
greim

Internet Explorer 8 ve önceki sürümleri XHTML ayrıştırmayı desteklemez. Bir XML bildirimi ve/veya bir XHTML doktipi kullansanız bile, eski IE belgeyi düz HTML olarak ayrıştırır. Düz HTML'de, kendi kendine kapanan sözdizimi desteklenmez. Sondaki eğik çizgi göz ardı edilir, açık bir kapanış etiketi kullanmanız gerekir.

IE 9 ve üstü gibi XHTML ayrıştırma desteğine sahip tarayıcılar bile, belgeye XML içerik türüyle sunulmadığı sürece, belgeyi HTML olarak ayrıştırır. Ancak bu durumda eski IE belgeyi hiç göstermeyecek!

44
JacquesB

Yukarıdaki insanlar sorunu çoktan açıkladılar, ancak her şeyi açıklığa kavuşturabilecek tek şey, insanlar <br/> ve HTML belgelerinde her zaman böyle olsa da, böyle bir pozisyondaki herhangi bir / temelde yok sayılıyor ve yalnızca denemede kullanılıyor XML ve HTML olarak ayrıştırılabilir bir şey yapmak için. Örneğin, <p/>foo</p> dosyasını deneyin ve düzenli bir paragraf elde edin.

26
Marijn

Kendiliğinden kapanış komut dosyası etiketi çalışmaz, çünkü komut dosyası etiketi satır içi kod içerebilir ve HTML bir niteliğin varlığına bağlı olarak bu özelliği açacak veya kapatacak kadar akıllı değildir.

Öte yandan, HTML dış kaynaklara referanslar eklemek için mükemmel bir etikete sahiptir: <link> etiketi ve kendi kendine kapanıyor olabilir. Stil sayfalarını, RSS ve Atom yayınlarını, kanonik URI'leri ve diğer tüm güzellik türlerini dahil etmek için zaten kullanılıyor. Neden JavaScript değil?

Senaryo etiketinin kendi içinde olmasını istiyorsan, dediğim gibi yapamazsın, ama akıllı olsa da, bir alternatif var. Kendiliğinden kapanan link etiketini kullanabilir ve aşağıdaki gibi bir metin/javascript ve rel komut dosyası olarak kullanarak JavaScript'inize linkini kullanabilirsiniz:

<link type="text/javascript" rel ="script" href="/path/tp/javascript" />
22
defau1t

XML ve XHTML'den farklı olarak, HTML kendi kendine kapanan sözdizimi hakkında hiçbir bilgiye sahip değildir. XHTML'yi HTML olarak yorumlayan tarayıcılar, / karakterinin etiketin kendi kendine kapanması gerektiğini gösterdiğini bilmez; bunun yerine boş bir öznitelik gibi yorumluyorlar ve çözümleyici hala etiketin 'açık' olduğunu düşünüyor.

<script defer><script defer="defer"> olarak kabul edilir, <script /><script /="/"> olarak kabul edilir.

20
rpetrich

Internet Explorer 8 ve daha üstü, XHTML, application/xhtml+xml için uygun MIME türünü desteklemez. XHTML'yi text/html olarak sunuyorsanız, Internet Explorer'ın bu eski sürümlerinin bir şey yapması için yapmanız gereken, HTML 4.01 olarak yorumlanacaktır. Kısa sözdizimini yalnızca, kapanış etiketinin çıkarılmasına izin veren herhangi bir öğeyle kullanabilirsiniz. HTML 4.01 Özelliği .

XML 'short form',/adında bir öznitelik olarak yorumlanır, çünkü (eşittir işareti yoktur), "/" nin kapalı bir değerine sahip olarak yorumlanır. Bu kesinlikle HTML 4.01’de yanlıştır - bildirilmemiş niteliklere izin verilmez - ancak tarayıcılar bunu görmezden gelir.

IE9 ve üstü XHTML 5 desteğiapplication/xhtml+xml ile birlikte verilir.

18
Mike Dimmick

Çünkü SCRIPT TAG GEÇERLİ BİR ELEMAN değil.

Bir HTML Belgesinde - VOID ELEMENTS yapma bir "kapanış etiketine" gerek yok!

xhtml bölümünde, her şey Geneldir, bu nedenle hepsine sonlandırma örn. bir "kapanış etiketi"; Br dahil, basit bir satır sonu, <br></br> veya onun shorthand <br />.

Ancak, bir Script Elemanı hiçbir zaman geçersiz veya parametrik Eleman değildir, çünkü komut dosyası etiketi başka bir şeyden önce bir Tarayıcı Talimatıdır, Veri Açıklaması beyanı değildir.

Prensip olarak, bir anlamsal sonlandırma talimatı, örneğin, bir "kapanış etiketi", sadece anlamsal olanı takip eden bir etiket ile sonlandırılamayan talimatları işlemek için gereklidir. Örneğin:

<H1> semantiği, aşağıdaki <P> tarafından sonlandırılamaz, çünkü önceki H1 komut setini geçersiz kılmak ve bu nedenle sonlandırmak için kendi semantiğinden yeterince taşımaz. stream 'i yeni bir paragraf satırına bölebilse de, mevcut yazı tipi boyutunu ve stil satır yüksekliği dökülmesini geçersiz kılmak için "yeterince güçlü" değildir akış aşağı , yani H1'den sızıyor (çünkü P'de yok).

Bu, "/" (sonlandırma) sinyalinin nasıl ve neden icat edildiğidir.

Genel açıklama yok sonlandırma < /> gibi bir etiket, karşılaşılan basamağın herhangi bir şekilde düşmesi için yeterli olurdu, örneğin: <H1>Title< />, ancak bu her zaman böyle olmaz, çünkü aynı zamanda Akış'ın çoklu ara etiketlemesi "iç içe geçebilme" yeteneğine sahip olmak istiyoruz: bir başka kaskata sarılmadan/düşmeden önce sellere bölünür. Sonuç olarak, < /> gibi genel bir sonlandırıcı, sonlandırılacak bir özelliğin hedefini belirleyemez. Örneğin: <b>kalın<i> kalın-italik < /> italik </>normal. Kuşkusuz niyetimizi doğru yapamamakta ve muhtemelen bold bold-itallic bold normal olarak yorumlayacaktır.

Bir ambalajın yani = yani kabın nasıl doğduğudur. (Bu kavramlar o kadar benzerdir ki ayırt edilmesi imkansızdır ve bazen aynı öğenin her ikisi de olabilir. <H1> aynı anda hem sarıcı hem de kapsayıcıdır. Oysa <B> yalnızca anlamsal bir sarıcıdır). Bir anlamsızlık kabına gerek yok. Ve elbette bir DIV Elementinin icadı geldi.

DIV elemanı aslında bir 2BR-Kabıdır. Elbette CSS'nin gelmesi, bütün durumu aksi takdirde olacağından daha tuhaflaştırdı ve dolaylı olarak, çok büyük sonuçlarla büyük bir karışıklığa neden oldu!

CSS ile, yeni icat edilmiş bir DIV'nin BR öncesi ve sonrası davranışını kolayca geçersiz kılabildiğiniz için, genellikle "hiçbir şey yapmaz" olarak adlandırılır. Bu, doğal olarak yanlış! DIV'ler blok elementlerdir ve doğal olarak son sinyallemeden önce ve sonra akış hattını kıracaklardır. Kısa süre sonra WEB, DIV-itis sayfasından acı çekmeye başladı. Çoğu hala öyle.

Herhangi bir HTML Etiketinin yerel davranışını tamamen geçersiz kılma ve tamamen yeniden tanımlama özelliğine sahip CSS'nin ortaya çıkışı, bir şekilde HTML varlığının tüm anlamını karıştırmayı ve bulanıklaştırmayı başardı ...

Birdenbire tüm HTML etiketleri eskiydi, görünmez hale geldiler, tahrif edildiler, tüm orijinal anlamlarını, kimliklerini ve amaçlarını ellerinden aldılar. Her nasılsa, artık gerekli olmadıkları izlenimini edinebilirsin. Söylemek: Tüm veri sunumu için tek bir konteyner sarmalayıcı etiketi yeterli olacaktır. Sadece gerekli özellikleri ekleyin. Neden bunun yerine anlamlı etiketler yok; Etiket adlarını giderken görün ve CSS'nin geri kalanını rahatsız etmesine izin verin.

Xhtml bu şekilde doğdu ve elbette ki yeni gelenler tarafından çok pahalı bir şekilde ödendi ve neyin ne olduğunu ve hepsinin lanet olası amacını çarpıtılmış bir vizyonu. W3C, World Wide Web'den Neyin Neyin Yanlış Niye Olduğunu Görüyor, Yoldaşlar?

HTML'nin amacı akış insan alıcı için anlamlı veridir.

Bilgi sunmak için.

Resmi kısım, yalnızca bilgi dağıtımının netliğine yardımcı olmak için vardır. xhtml bilgilere en ufak bir önem vermez. - Buna göre, bilgi kesinlikle önemli değil.

Bu konudaki en önemli şey bilmek ve anlamaktır ki xhtml sadece genişletilmiş bir HTML sürümü değildir, xhtml tamamen farklı bir canavardır; topraklama; ve bu nedenle onları ayrı tutmak akıllıca olacaktır.

5
Bekim Bacaj

'True XHTML', 'faux XHTML' ile HTML arasındaki farkın yanı sıra sunucu tarafından gönderilen MIME türünün önemi de zaten burada çok iyi tanımlanmıştır idi. Hemen şimdi denemek istiyorsanız, burada yetenekli tarayıcılar için kendi kendine kapanan komut dosyası etiketi de dahil olmak üzere canlı önizleme ile basit bir düzenlenebilir pasajı:

div { display: flex; }
div + div {flex-direction: column; }
<div>Mime type: <label><input type="radio" onchange="t.onkeyup()" id="x" checked  name="mime"> application/xhtml+xml</label>
<label><input type="radio" onchange="t.onkeyup()" name="mime"> text/html</label></div>
<div><textarea id="t" rows="4" 
onkeyup="i.src='data:'+(x.checked?'application/xhtml+xml':'text/html')+','+encodeURIComponent(t.value)"
><?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
[<!ENTITY x "true XHTML">]>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
  <p>
    <span id="greet" swapto="Hello">Hell, NO :(</span> &x;.
    <script src="data:text/javascript,(g=document.getElementById('greet')).innerText=g.getAttribute('swapto')" />
    Nice to meet you!
    <!-- 
      Previous text node and all further content falls into SCRIPT element content in text/html mode, so is not rendered. Because no end script tag is found, no script runs in text/html
    -->
  </p>
</body>
</html></textarea>

<iframe id="i" height="80"></iframe>

<script>t.onkeyup()</script>
</div>

Textarea altında Hello, true XHTML. Nice to meet you! görmelisiniz.

Yetkisiz tarayıcılar için textarea'nın içeriğini kopyalayabilir ve .xhtml (veya .xht) uzantılı ( bu ipucu için Alek'e teşekkürler ) bir dosya olarak kaydedebilirsiniz.

2
myf