Jintrick.netagenda2008年08月アーカイブ → 2008年08月01日

id属性をランダムな文字列に

div:Wind Report - AOLダイアリーより

この一文を読んで思い出したのでメモ。(classはともかく)idはむしろその性質上、全く無意味な文字列にしておいた方が良い場合も多い。idはユニークであることが求められるのだから、できる限りバッティングしないように名づけてやるとその性質を保ちやすい。

例えば、脚注にidをつけて記事内でリンクする場合など。このとき記事内の登場順にfootnote1, footnote2, ..などという安易なidをつけてしまうと、文書を結合したときに簡単にバッティングしてしまう。私は昔章立ての書籍をハイパーテキスト化したときにこの罠に嵌ったことがあるが、ウェブ日記などの場合も注意が必要だ。各記事が色々な属性で連結されてしまう。まあ連結した時点でパースしてチェックすればいいんだけど、誰が(何が)連結するかも分からない場合だってある。

idに日付に関連する数値を含めることを検討してみたこともあるが、「日付」という属性で列挙された場合に危険だったりして、突き詰めると―― 十分に長く、全く無意味な、ランダムな文字列にすることが(前述の意味で)最も望ましい。例:id="A83KCI23NSO9ZZ"。

一概に無意味にすべきだとは全く思わないし、実際そこまでしたことはないが、無意味な文字列(単なる識別子以上の意味を持たない文字列)にしたときに違和感を感じたなら、またはその必要性に全く心当たりがなかったら、それは本来idにする必然性がないのかもしれない。

追記

id属性値については「仕様に沿っている」という前提であることは、今更念のため書いておく。

id属性の値をランダムな文字列にする利点がもう一つあった。Internet Explorer(知っている限りバージョン5以降)のJavascript/JScriptのHTMLオブジェクトモデルでは、要素がid属性をもっていると、その値と同じ識別子をグローバル変数として、その要素を参照することができる。なんか不正確な書き方だな。面倒なので例示すると、id="Bakabon" という属性を持ったp要素の親ノードは、Bakabon.parentNode で参照できる。しかしスクリプト内のグローバルな位置に、function Bakabon{} というコンストラクタが定義されていたりすると、このフィーチャーは失われる。ちなみに id="Bakabon-no-Papa" といった、JScriptの識別子の要件を充たさない文字列であった場合も同様だ(この例ではダッシュが演算子として扱われる)。

id属性の値を、ランダム、かつJScriptの識別子の要件を満たすようにしてやると、比較的安全にこのフィーチャーを利用することができる。idが一意性の求められる「記号」ならば、まさにその性質を保存するようなルールに基づいて決定してやるのは自然なことだ。その一意性を前提としてやれば、計算機に任せられることは多くなる。


webmaster@jintrick.net
公開: 2008年08月01日
カテゴリ: HTML