Keputusan desain - mengapa menghasilkan <p> tanpa </p>?

14

tl; dr

Beberapa program yang banyak digunakan, yang menghasilkan html, hanya akan menghasilkan tag paragraf pembuka, dan tidak menutupnya, dengan asumsi bahwa browser akan menutup paragraf dengan benar.

Secara sepintas, menurut saya asumsi bahwa browser akan menutup paragraf dengan benar adalah tidak benar. Apakah interpretasi saya benar? Secara umum, pengorbanan apa yang terlibat dalam keputusan semacam ini?


Menjelajahi kode sumber moinmoin, baris kode berikut menarik perhatian saya:

# We only open those tags and let the browser auto-close them:
_auto_closing_tags = set(['p'])

( sumber )

Setelah membaca melalui sisa implementasi, saya meyakinkan diri sendiri bahwa ya, memang, ketika moinmoin menghasilkan kode html untuk salah satu halamannya, itu akan dengan benar menghasilkan tag pembuka paragraf, jika perlu, sementara pada saat yang sama sengaja menghindari salah satu tag penutup paragraf (meskipun bisa dengan sepele melakukannya).

Untuk kasus penggunaan khusus saya, yang agak tidak biasa, perilaku ini tidak benar. Saya tergoda untuk mengirim laporan bug dan / atau mengubah perilaku. Namun, sepertinya keputusan desain ini dibuat dengan bijaksana. Saya tidak cukup berpengalaman dalam seluk-beluk standar html, atau berbagai implementasi browser, untuk dapat mengetahui apakah ini perilaku yang benar secara umum, dan saya merasa bahwa naluri saya untuk memperbaiki / mengubah perilaku ini mungkin sesat.

Apakah kode ini membuat asumsi yang valid tentang implementasi browser? Apakah html yang dihasilkan valid? Secara umum, pengorbanan apa yang mungkin saya lewatkan di sini?

blueberryfields
sumber
2
Meskipun jawaban saat ini, ini terlihat seperti desain yang gila. "Jadilah liberal dalam apa yang Anda terima dan konservatif dalam apa yang Anda kirim" dan semua itu. Ini juga sama sekali tidak perlu. Saya pasti akan mengirimkan laporan bug (sangat bernada) ke Moinmoin. Paling tidak mereka harus mendokumentasikan dan berkomentar perilaku tidak intuitif ini dengan jelas.
Konrad Rudolph

Jawaban:

33

Tag akhir untuk pelemen bersifat opsional dalam HTML, dan hanya diperlukan dalam XHTML. Namun, konsep HTML5 memperkenalkan serangkaian kondisi ketika ptag akhir sebenarnya opsional:

Tag akhir elemen p dapat dihilangkan jika elemen p segera diikuti oleh alamat, artikel, selain, blockquote, dir, div, dl, fieldset, footer, form, h1, h2, h3, h4, h5, h5, h6, header , hgroup, hr, menu, nav, ol, p, pre, section, table, atau ul, elemen, atau jika tidak ada lagi konten dalam elemen induk dan elemen induk bukan elemen.

Sumber: spesifikasi HTML5

Yang mengatakan, satu-satunya argumen yang pernah saya dengar untuk menghilangkan tag akhir untuk pelemen adalah ukuran dokumen. Anda sepenuhnya memutuskan apakah itu masuk akal untuk dokumen Anda atau tidak. Secara pribadi saya cenderung menyertakan semua tag akhir opsional, kalau-kalau saya tidak memenuhi persyaratan ketika tag akhir opsional.

yannis
sumber
5
Pikiran besar berpikir sama, saya kira. :)
Robert Harvey
@RobertHarvey Anda memenangkan babak ini, dalam 12 detik ...
yannis
2
Argumen lain yang mendukung menghilangkan tag akhir: mereka jelas dari struktur dokumen, dan ketika disalahgunakan, juga dapat memperkenalkan spasi kosong palsu.
Jon Purdy
1
Mampu menghilangkan tag akhir secara eksplisit merupakan fitur desain SGML, yang menjadi dasar pembuatan HTML. Itu juga BUKAN fitur XML, yang menjadi dasar XHTML.
Alan Shutko
4
Salah satu argumen yang sering saya lihat adalah tampilannya lebih bersih. Khususnya dalam kasus <li>tag, tag bertindak lebih seperti poin-poin.
DisgruntledGoat
16

The spesifikasi W3C HTML5 secara khusus menyatakan bahwa:

Tag akhir elemen p dapat dihilangkan jika elemen p segera diikuti oleh alamat, artikel, selain, blockquote, dir, div, dl, fieldset, footer, form, h1, h2, h3, h4, h5, h5, h6, header , hr, menu, nav, ol, p, pra, bagian, tabel, atau elemen ul, atau jika tidak ada lagi konten dalam elemen induk dan elemen induk bukan elemen.

Jadi pada dasarnya spek telah menyediakan banyak cara dimana kompleksitas (besar atau kecil yang mungkin terjadi) dari penutupan tag dapat dihindari. Setiap implementasi browser yang sesuai harus mengakomodasi pengecualian ini.

Robert Harvey
sumber