プロが教える店舗&オフィスのセキュリティ対策術

HTML4の仕様では、「checked」属性には「checked」という値を設定する(しなければならない)と取れる記述があります。しかし実際には、省略して記述しているページをよく見かけますし、また省略しても正しく解釈されるブラウザがほとんどです。これがHTMLの仕様なのか各ブラウザ独自の慣習なのかよく分かりません。

HTML 4 Document Type Definition
http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401 …

※言うまでも無いことかもしれませんが「checked」属性以外にも「disabled」「readonly」などいくつかあります。


また、XHTMLでは(当然)省略不可となっていましたが、HTML5ではどうなっているのかよく分かりません。

このあたりのことについて教えてください。


質問は以下です
・HTML4では属性値の省略について仕様として省略可と明記しているのでしょうか。それともなんとなく慣習でそうなってしまったのでしょうか?
・もしもHTML4の仕様として省略可とされているのならば、仕様書上の記述個所を教えてください。
・HTML5ではどうなっているのでしょうか?まだ策定中とはいえ、さすがにこのレベルのことは議論が済んでいるように思います。省略可なのか不可なのか、仕様書上のどこかに記述されているのかまだ決まっていないのか、この点を教えてください。
・HTML5のDTDがあればそれを教えてください

以上、よろしくお願いします。

A 回答 (3件)

DTD を参照しておられますが、まず見るべきはそこではなく、SGML 宣言の内容です。


http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401 …

FEATURES / MINIMIZE / SHORTTAG YES となっています。すなわち、SGML の短縮タグ機構を許可する、ということです。

短縮タグ機構とは何か。
http://www1.u-netsurf.ne.jp/~7l1rll/SGMLsec6_0.h …

(a). 属性値が名前文字のみであるなら、引用符を省略して良い。
<input type=text>

(b). 列挙値(<input type="text"> のように取りうる値が決まっている)の場合、属性名を省略して良い。デフォルト値は初回に用いられた値。
<input text>

(c). 空タグを使って良い。
<p>段落<>段落</><>段落</>

(d). タグをまとめて良い。
<div<p>段落</p</div>

(e). 簡略終了タグを使って良い。
<p/段落/

ちなみに、XML における空要素の省略表記 <input/> は (e) のルールを応用したものです。

---
ですから「HTML を正規表現で処理したい」なんてのは、本当は現実離れした話なのです。とは言え、SGML パーサでさえこれらを全部認識できるものはありませんので、HTML4: B.3.3 ではこれらを使わないように、と注意書きがあります。

それなら、最初から SHORTTAG NO にしておけば良いではないか。ところが、古いブラウザの中にはこれらを中途半端に実装しているものがありました。例えば、disabled などについてです。

<input disabled>

これは (b) の応用です。それでいて、<input disabled="disabled"> は認識できなかった。つまり、属性名と属性値が同じ場合に限り省略でき、しかも省略した形しか認識できないブラウザがあったので、仕様書でもこの省略を許可せざるをえなかったのです。その上で、もうそういうのは止めてね、と注意を促したのです。

---
しかしながら、この省略法は使われ続けました。そこで、HTML(5) ではいっそ「属性名と属性値が同じ場合に限り、disabled のように省略できる」というのを仕様化してしまい、これを「論理型属性」と呼ぶことにしました(参考 URL)。すなわち、DOM 上では true/false として露出する属性です。

なお、注意書きにもあるように、contentEditable="true" のように "true" または "false" を取る属性は、論理型属性ではありません。混同しないようにして下さい。

それと、HTML(5) に DTD はありません。HTML(5) は SGML でも XML でもない、第三の形式です。どうしても必要なら、有志が DTD、RELAX NG、Schematron などのスキーマを作って配布しています。Validator.nu はそれを利用しています。

参考URL:http://www.whatwg.org/specs/web-apps/current-wor …

この回答への補足

属性名の省略を試してみようと
・<input radio>
・<input checkbox>
・<input button>
を書いたHTMLで試してみたのですが、FireFox11/Chrome18/IE8では認識しませんでした…。(すべてデフォルト値「type="text"」として処理されてしまいました)

属性名の省略として正式にサポートしているブラウザはないのですかね?(昔はあった?)

補足日時:2012/05/14 15:08
    • good
    • 0
この回答へのお礼

>列挙値の場合、属性名を省略して良い。

これはびっくりしました。「<input type="radio" checked>」等とだけ書いた場合、省略されているのは値だと思い込んでいました。しかしそうではなく属性名が省略されているのですね。


>HTML(5) に DTD はありません。HTML(5) は SGML でも XML でもない、第三の形式です。

おお、そうなんですか。以前自分でHTML5のDTDを探した時もあったのですが、どうしても見つかりませんでした。そもそも無いのですね。というか本来はDTDが適用されるべき対象ではなくなっているのですね。

少し難しかったのですが大変参考になりました。
ありがとうございました。

お礼日時:2012/05/14 13:22

No.2 にも書きましたが、タグ短縮をマトモにサポートしているブラウザなんてありませんよ。

しかし、中途半端に実装しているブラウザがちらほらあり、そのままでは相互運用性に支障をきたすので、とりあえずそれまでの分については仕様上もタグ短縮を認めるけれども、今後はやらないようにね、というのが HTML 4.0 規定の付録 B. 3 です。付録なので規範性はなかったんですけどね。

Fx 11、Ch 18 なら、すでに HTML(5) の解析ルールで動いているはずです。誤解している方をたまに見かけるので念のため申し上げておきますが、今後のブラウザは例えページが HTML 4.0 で書かれていようと XHTML 1.0 で書かれていようと、原則として全て HTML(5) のルールで解析します。文書型宣言によって解析ルールを切り替える、なんて器用なことはしてくれません(もちろん、文書型宣言の有無だけはモード切替のスイッチになります)。これによって、全てのブラウザは同じ DOM 木を構築する「はず」です。

HTML(5) のルール上、<input radio>、<input checkbox>、<input button> などは未知の論理型属性として無視されます(将来的にそれらが追加される可能性を考慮して、内部的に保存はされる)。つまり、<input my-extend-attr="my-extend-attr"> のように書いたのと同じことです。
    • good
    • 0
この回答へのお礼

>No.2 にも書きましたが、タグ短縮をマトモにサポートしているブラウザなんてありませんよ。

すみません。理解不足でした。
スッキリしました。ありがとうございました。

(それにしても本当にお詳しいですね。敬服します)

お礼日時:2012/05/15 20:54

HTML4の場合は checked と記述するだけでよく、XHTMLの場合は checked="checked" と記述しなければいけません。



質問者さんが示されている HTML4のDTDでもcheckedの値は括弧書きで書かれている通りオプション扱いですので省略可能です。

HTML5でも今の所は属性名だけの記述で良いという解釈のようです。

参考URL:http://www.w3.org/TR/html5/
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2012/05/14 13:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!