Kendiliğinden kapanan (geçersiz olmayan) etiketler HTML5'te geçerli mi?


670

W3C doğrulayıcı kendi kendine kapanan etiketleri (olanlarda bu son "gibi değil />üzerinde ") olmayan boşluk elemanları. (Geçersiz öğeler hiç içerik içermeyebilecek öğelerdir.) HTML5'te hala geçerli mi?

Kabul edilen boşluk elemanlarına bazı örnekler :

<br />
<img src="" />
<input type="text" name="username" />

Reddedilen geçersiz öğelere bazı örnekler :

<div id="myDiv" />
<span id="mySpan" />
<textarea id="someTextMessage" />

Not:
W3C validator aslında geçersiz kendiliğinden kapanan etiketleri kabul eder: yazarın basit bir yazım hatası ( \>yerine />) nedeniyle başlangıçta bir sorunu vardı ; ancak, kendiliğinden kapanan etiketler genel olarak HTML5'te% 100 geçerli değildir ve yanıtlar çeşitli HTML lezzetleri arasında kendiliğinden kapanan etiketler konusunda ayrıntılı olarak açıklanmaktadır.


2
@ Ben: oh, üzgünüm, bence haklısın. Bu durumda, orijinal soruyu yanlış anladım, OP'nin kendiliğinden kapanan etiketlerin HTML5'te geçerli olup olmadığını bilmek istediğini düşündüm. Ancak bu, kodunda sadece yazım hataları yazdığı veya kendi kendine kapanan etiketlerin nasıl uygun bir şekilde yazılacağını bilmediği anlamına gelir, bu da W3C doğrulayıcısının kodunu geçersiz olarak işaretlediği anlamına gelir.
Sk8erPeter

16
Gelecekteki okuyucular için zaman kazanmak için: evet, sorudaki sözdizimi yanlış ve hayır, değiştirmemelisiniz. OP nedenini açık ve haklı olarak açıklamıştır . Bu soruyu soran doğrulama hatalarına yol açtığından sözdizimi düzeltilmemelidir.
Jordan Gray

2
İnsanların Are hala kavga kesikler dönük olmalıdır hangi yönde? Haydi.
BoltClock

3
@BoltClock Yup, hala savaşıyor. Çocuklar: Bu soru soruyorsa \>, işe yaramaz bir düzeltme yazım hatası sorusu olarak kapatılmalıdır. Cevapların hepsi adres />. />Sürümü sadece kullanışlı bir tanesidir. Varsın olsun.
Gilles 'SO- kötü olmayı bırak'

1
O zaman soru yeniden düzenlenmelidir, çünkü W3C doğrulayıcı aslında kendi kendine kapanan etiketleri kabul eder. Orijinal amaca ilişkin bütünlüğünden ödün vermeden soruyu bu şekilde yeniden yazmak zordur. Bu nedenle, SO kurallarına uymak istiyorsak, bu gibi sorulardaki netliği feda etmek zorunda kalabiliriz, ancak daha iyi bir iyilik uğruna soruyu düzenlemek tek mantıklı şey gibi görünüyor. ortalama. Benzer bir konuyla ilgili başka birçok soru varsa meta ile ilgili başka bir tartışma başlatabiliriz.
osa

Yanıtlar:


1238
  • In HTML 4 , <foo /(evet, hayır ile >hiç) vasıtasıyla <foo>(hangi yol açar <br />anlam <br>>(yani <br>&gt;) ve <title/hello/anlam <title>hello</title>). Bu, tarayıcıların destekleme konusunda çok kötü bir iş çıkardığı bir SGML kuralıdır ve teknik özellik , yazarlara sözdiziminden kaçınmalarını önerir .

  • Gelen XHTML , <foo />anlamına gelir<foo></foo> . Bu, tüm XML belgeleri için geçerli olan bir XML kuralıdır. Bununla birlikte, XHTML genellikle text/html(en azından tarihsel olarak) tarayıcılar tarafından sunulan belgelerden farklı bir ayrıştırıcı kullanılarak işlenir application/xhtml+xml. W3C, XHTML olarak izlenecek uyumluluk yönergeleri sağlar text/html. (Temel olarak: Kendiliğinden kapanan etiket sözdizimini yalnızca öğe EMPTY olarak tanımlandığında (ve HTML etiketinde bitiş etiketi yasaklandığında) kullanın.

  • Gelen HTML5 , anlamı <foo /> elemanının türüne bağlıdır .

    • Geçersiz öğeler olarak atanan HTML öğelerinde (temel olarak "HTML5'ten önce var olan ve herhangi bir içeriğe sahip olması yasaklanan bir öğe"), bitiş etiketleri basitçe yasaktır. Başlangıç ​​etiketinin sonundaki eğik çizgiye izin verilir, ancak hiçbir anlamı yoktur. Sadece XML bağımlısı insanlar (ve sözdizimi vurgulayıcılar) için sözdizimsel şekerdir.
    • Diğer HTML öğelerinde eğik çizgi bir hatadır, ancak hata kurtarma tarayıcıların bunu yok saymasına ve etiketi normal bir başlangıç ​​etiketi olarak ele almasına neden olur. Bu genellikle eksik bir bitiş etiketi ile sonuçlanır ve sonraki öğelerin kardeş yerine çocuk olmasına neden olur.
    • Yabancı elemanlar (SVG gibi XML uygulamalarından içe aktarılır) bunu kendiliğinden kapanan sözdizimi olarak görür.

24
" ... XML bağımlısı. " XML uyumluluğunun kötü olduğunu düşünüyor görünüyorsunuz. Yine de, HTML5'teki sonuç, yine de açılı parantezlerle (yani XML'nin rahatsızlıklarının çoğuyla ilgili bir şey) uğraşmamız gerektiği gibi görünürken, XML tabanlı araçları (örneğin şablon araçları veya çeşitli işlemciler) kullanmayı zorlaştırıyor ). Hatta bir görüş nesil noktasından, bu gibi görünüyor <object data="..." />ve <img src="..."></src>süre değil Tamam <object data="..."></object>ve <img src="..." />alet tutarlılığı için daha zor hale getiren vardır. Bu kaybetme-kaybetme durumu gibi görünüyor.
Bruno

7
@Bruno - HTML XML'den önce gelir. İnsanların XHTML'ye geçme çabaları başarısız oldu. İle text/html, tarayıcılar eğik çizgiye özel bir anlam vermez, bu yüzden dahil etmek pratik bir amaca hizmet etmez. Sadece alışkanlıktan kurtulamayan insanlar için XML gibi görünmesini sağlamak için var.
Quentin

6
@Quentin Ben tamamen katılmıyorum. Ben sadece geçerli bir XML eşdeğeri mutlaka geçerli HTML5 (örneğin veya <img ...></img>yerine ) olmadığı için bir utanç buluyorum . HTML5 genel olarak daha az sıkı olduğu için (muhtemelen XHTML'nin neden başarısız olduğu), böyle bir şeye çok iyi tolerans gösterebilirdi . Ne yazık ki, öyle değil, bu nedenle XML tabanlı bir şablon oluşturucunun, boş elemanların veya kendi kendine kapanan elemanların üretimini nasıl ayırt edeceğini bilmesi gerekir: Tüm boş öğeleri yazmak için bir kuralınız bile olamaz . <img ...><img ... /><img ...></img><tag></tag>
Bruno

3
HTML 5 bile ufukta önce XHTML başarısız oldu ve uzun XHTML tedavi gibi şeyler yapacağını predated tarayıcı hatası düzeltme nedeniyle boş elemanlarını meydana gelmiş olamaz </br>olarak <br>öylesine <br></br>bir çift satır sonu olurdu. (ve gerçek dünyadaki kötü biçimlendirme ile geriye dönük uyumluluk (gibi </br>) HTML 5'in tasarım hedeflerinden biridir).
Quentin

1
FROM W3C: Geçersiz öğeler: alan, taban, br, col, gömme, hr, img, giriş, keygen, bağlantı, meta, param, kaynak, parça, wbr "Geçersiz öğeler yalnızca bir başlangıç ​​etiketine sahiptir; bitiş etiketleri belirtilmemelidir geçersiz elemanlar için. " w3.org/TR/html5/syntax.html#void-elements
Fabio Nolasco

406

Nikita Skvortsov'un belirttiği gibi, kendi kendine kapanan bir div geçerli olmayacak. Bunun nedeni, div'ın geçersiz bir öğe değil, normal bir öğe olmasıdır .

Göre HTML5 spec (diye bilinen herhangi içeriğe sahip olamaz, etiketleri boşluk elemanları ) kendi kendine kapanan * olabilir. Bu, aşağıdaki etiketleri içerir:

area, base, br, col, embed, hr, img, input, 
keygen, link, meta, param, source, track, wbr

Yukarıdaki etiketlerde "/" tamamen isteğe bağlıdır, ancak bundan <img/>farklı değildir <img>, ancak <img></img>geçersizdir.

* Not: yabancı unsurlar da kendi kendine kapanabilir, ancak bu cevabın kapsamı içinde olduğunu düşünmüyorum.


1
IE10'un Geliştirici Araçları bana "HTML1500: Etiket kendi kendine kapanamıyor. Açık bir kapanış etiketi kullanın." hatta <meta charset = "UTF-8" /> Bunun neden olduğu hakkında bir fikriniz var mı?
James in Indy

Tamam, kendiliğinden kapanan etiketlerin eğik çizgiye sahip olmaması gerektiğini öğrendim (ve kaldırmak hatamı düzeltir). Alıntı: tiffanybbrown.com/2011/03/23/…
James in Indy

Teknik özellik değişti. Şimdi, "boşluk" veya "kendiliğinden kapanan" unsurların gerektiğini değil HTML 5 doctype olarak görev eğik çizgi içerir. Ancak, XHTML olarak sunuluyorsa, eğik çizgi gerekebilir (bu durumda dokümanları kontrol edin). Pratik kullanımda, kapanış /dahil edilmiş olsa bile sayfalar genellikle beklendiği gibi görüntülenecektir , ancak bu garanti edilmez (tarayıcının kodu sizin için etkili bir şekilde yeniden yazmasına ve istediğiniz gibi yorumlamasına bağlıdır.) Ayrıca, herhangi bir nedenle sayfanızın HTML 5 doğrulamasını geçmesi gerekiyorsa, geçersiz öğeler için etiketleri kapatırsanız geçmeyebilir.
SherylHohman

@ SherylHohman'ın yorumu ile ilgili olarak, spesifikasyonun değiştiğine inanmıyorum (ya da değiştiyse geri değişti). Bkz. W3.org/TR/html5/syntax.html#start-tags (8.1.2.1.6) - geçersiz (veya yabancı) öğeler yine de eğik çizgi içerebilir.
ChrisC

63

Uygulamada, HTML'de kendi kendine kapanan etiketleri kullanmak, beklediğiniz gibi çalışmalıdır. Ancak , geçerli HTML5 yazma konusunda endişeleriniz varsa , bu tür etiketlerin kullanımının, kullanabileceğiniz iki farklı iki sözdizimi formunda nasıl davrandığını anlamalısınız. HTML5, benzer ancak özdeş olmayan bir HTML sözdizimini ve bir XHTML sözdizimini tanımlar. Hangisinin kullanılacağı web sunucusu tarafından gönderilen medya türüne bağlıdır.

Büyük olasılıkla, sayfalarınız text/htmldaha yumuşak HTML sözdizimini izleyen şekilde sunuluyor . Bu gibi durumlarda, HTML5 belirli başlangıç ​​etiketlerinin isteğe bağlı / sonlandırılmadan önce> olmasına izin verir. Bu durumlarda, / yani isteğe bağlı ve göz ardı olduğunu <hr>ve <hr />aynıdır. HTML özelliği bu "geçersiz öğeler" olarak adlandırılır ve geçerli olanların bir listesini verir. Kesin olarak, isteğe bağlı / yalnızca bu geçersiz öğelerin başlangıç ​​etiketleri içinde geçerlidir; örneğin <br />ve <hr />geçerli HTML5'tir, ancak <p />değildir.

HTML5 spesifikasyonu, HTML yazarları ve web tarayıcı geliştiricileri için neyin doğru olduğunu açıkça belirtir; ikinci grubun her türlü geçersiz "eski" sözdizimini kabul etmesi gerekir. Bu durumda, HTML5 uyumlu tarayıcıların kendi kendine kapalı etiketleri, örneğin <p />beklediğiniz gibi kabul edeceği ve beklediğiniz gibi oluşturduğu anlamına gelir. Ama bir yazar için, bu sayfa olur değil geçerli HTML5 olun. (Daha da önemlisi, bu tür yasadışı sözdizimini kullanarak elde ettiğiniz DOM ağacı ciddi şekilde bertaraf edilebilir; <span />örneğin, kendi kendine kapalı etiketler, işleri çok fazla karıştırmaya eğilimlidir ).

(Sunucunuzun XHTML dosyalarını XML MIME türü olarak nasıl göndereceğini bildiği olağandışı durumda, sayfanın XHTML DTD ve XML sözdizimiyle uyumlu olması gerekir .


31
<p />, kendi kendine kapanan bir etiket olarak değil, açılış etiketi olarak kabul edilir. Bu, belgenin geri kalanının tamamının P öğesi içinde olduğu anlamına gelir. "Muhtemelen" beklediğim bu değil ve önemsiz herhangi bir sayfada ciddi bir karışıklık yaratacaktır.
mhsmith

12

HTML5 temel olarak sondaki eğik çizgi orada değil gibi davranır. HTML5 sözdiziminde kendi kendine kapanan bir etiket diye bir şey yoktur.

  • Etiketleri Otomatik kapanan olmayan boşluk gibi unsurların <p/>, <div/>hiç iş olmaz. Sondaki eğik çizgi yoksayılır ve bunlar açılış etiketleri olarak kabul edilir. Bu muhtemelen yuvalama sorunlarına yol açacaktır.

    Bu, eğik çizginin önünde boşluk olup olmadığına bakılmaksızın doğrudur: <p />ve <div />aynı nedenden dolayı çalışmaz.

  • Etiketleri Otomatik kapanan boşluk gibi elementler <br/>veya <img src="" alt=""/> olacaktır çalışır, ancak eğik çizgi göz ardı edilir çünkü sadece ve doğru davranışlara neden olur bu durumda.

Sonuç olarak, eski "XHTML 1.0'da metin / html olarak görev yapan" herhangi bir şey daha önce olduğu gibi çalışmaya devam edecektir: geçersiz olmayan etiketlerde sondaki eğik çizgiler orada kabul edilmezken, boş öğelerdeki sondaki eğik çizgi işe yaramaz.

Bir not daha: HTML5 belgesini XML olarak temsil etmek mümkündür ve bu bazen "XHTML 5.0" olarak adlandırılır. Bu durumda, XML kuralları uygulanır ve kendi kendine kapanan etiketler her zaman işlenir. Her zaman bir XML mime türü ile sunulması gerekir.


5

Kendiliğinden kapanan etiketler HTML5'te geçerlidir, ancak zorunlu değildir.

<br>ve <br />ikisi de iyi.


12
HTML5 spesifikasyonuna göre, kendiliğinden kapanan sözdizimi ( />) geçersiz bir HTML öğesinde kullanılamaz.
naXa

3
Soru, veya gibi geçersiz olmayan öğelerdeki kendi kendine kapanan etiketlerle ilgiliydi . <p/><div/>
thomasrutter

2
Başlangıçta soru özellikle geçersiz olmayan unsurlarla ilgili değildi. Daha çok şuydu, hala <... />XHTML'de olduğu gibi kullanabilir misiniz veya /HTML5'te kaldırmak zorunda mısınız ? Soru daha sonra birkaç kez değiştirildi.
Nick

Her iki durumda da, cevap boşluğun göz ardı edileceği ve boş olarak bildirilmeyen öğeleri geçersiz kılacak, ancak boş öğelerle uyumlu olacaktır.
thomasrutter

4

Bu örnekte gösterildiği gibi, kendiliğinden kapanan etiketlerle çok dikkatli olurum:

var a = '<span/><span/>';
var d = document.createElement('div');
d.innerHTML = a
console.log(d.innerHTML) // "<span><span></span></span>"

Bağırsak hislerim <span></span><span></span>bunun yerine


2
Bu kabul edilen cevapta açıklanmıştır:On other [than void] HTML elements, the slash is an error, but error recovery will cause browsers to ignore it and treat the tag as a regular start tag. This will usually end up with a missing end tag causing subsequent elements to be children instead of siblings.
Palec

-1

Ancak -sadece kayıt için- bu geçersiz:

<address class="vcard">
  <svg viewBox="0 0 800 400">
    <rect width="800" height="400" fill="#000">
  </svg>
</address>

Ve burada bir eğik çizgi tekrar geçerli kılar:

    <rect width="800" height="400" fill="#000"/>

1
Çünkü svg, html yerine xml ile yazılmıştır. Farklı ayrıştırma kuralları kullanır
Electric Coffee
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.