Alternative Design Project

ADP: クッキーとValidなStrict HTML(続々)

2004年10月04日 21:47 | コメント(0) | トラックバック(0)

クッキーがらみの変更、うまくいきそうなので、ここでまとめてみる。

まずこれまでのあらすじ。Movable Type(ADPは2.661)の元のテンプレートは、コメントの名前の保持にクッキーを使っている。form要素にname属性を書いて、それを参照してCookieに覚えさせていた名前を表示するJavaScriptを動かしている。元のテンプレートは、XHTML 1.0 Transitionalだからいいんだけれど、XHTML 1.0 Strictにしようと思うとDTD上、formにnameは使えない。nameをidに変えただけだと、JavaScriptのエラーになる。 そこで、もともとのJavaScriptを使わず、保持された名前の表示にDOMを使ってみた。DOMを解釈できたら、名前を表示するというやり方。

これだと、DOMが解釈できないならば、Remember info?(名前、アドレスを登録しますか?)の選択はもともとできない、というか、どっちにしろ覚えていることにならないので、Remember info?の行もJavaScriptで書くことにした。ここまでが前の話。

で、DOMが解釈できるかどうかで判別しているわりに、Cookieが使えるかどうかは判別していなかったことに気づいた。セキュリティの設定などにより、Cookieが使えないならば、やはりRemember info? Yes or Noの選択は意味をなさない。選択はできないのに、そういう選択肢が出るのは気持ち悪いし、来場者のためにならない。ので、Cookieが使えるかどうかについても判別させることにする。

これによって、JavaScriptでDOMを解釈し、Cookieが使える環境であればRemember info?の行が表示され、そこでYesを選んでおけば名前やアドレスが保持される。DOMを解釈しないUAであったり、Cookieが使えない設定にしている場合は、Remember info?自体が表示されない。来場者を混乱させる障害物を減らすことが出来る。かつ、ソースはXHTML 1.0 Strictにできる。

やり方。

まず、Individual Entry ArchiveのRemember info?があるところを消し飛ばし、以下のようにスクリプトを呼ぶ。

<script type="text/javascript" src="<$MTBlogURL$>mtcmt.js"></script>

mtcmt.jsでは、DOMを解釈できて、かつ、navigator.cookieEnabledがtrueになったときにRemember info?を書く。cookieEnabledは知らない場合はundefinedになるし、知っているけれどCookieが無効な場合はfalseになるが、どっちの場合もRemember info?を表示しないことになる。

if (document.getElementById && document.createElement && navigator.cookieEnabled){
 document.write('Remember info? <label for="bakecookie">Yes</label><input id="bakecookie" type="radio" name="bakecookie" /> <label for="forget">No</label><input id="forget" type="radio" name="bakecookie" onclick="forgetMe(this.form)" value="Forget Info" />');
}

覚えていた名前とかを表示するのは、mtcmt2.jsというスクリプトにやらせる。Cookieが使えなければbakecookieなるidも存在しないので、ここでもnavigator.cookieEnabledを判別に用いる。

if (document.getElementById && document.createElement && navigator.cookieEnabled){
 document.getElementById('email').setAttribute('value',getCookie('mtcmtmail'));
 document.getElementById('author').setAttribute('value',getCookie('mtcmtauth'));
 document.getElementById('url').setAttribute('value',getCookie('mtcmthome'));
 if (getCookie('mtcmtauth')) {
   document.getElementById('bakecookie').setAttribute('checked','checked');
 } else {
   document.getElementById('forget').setAttribute('checked','checked');
 }
}

最後に、Individual Entry Archiveのformのところを以下のようにする。ここだけ、書き方がテンプレートの流用になっているが、bakecookieがあったりなかったりするので、onsubmitのところにもbakecookieがあるかどうかをまず判別させる。

<form method="post" action="<$MTCGIPath$><$MTCommentScript$>" onsubmit="if (this.bakecookie &amp;&amp; this.bakecookie[0].checked) rememberMe(this)">

つぎはぎだらけなので、抜本的に直せばもっとよくなると思うが、しばらくこれでいってみることにする。

トラックバック(0)

トラックバックURL: http://adp.daa.jp/cgi/mt2/mt-tb.cgi/355

XHTML 1.0 Strictなコメントフォーム(Ogawa::Memoranda): 2004年11月18日 14:47
XHTML 1.0 Strictでは、form要素にname属性が使えません。したがって、そのname属性の代わりにid属性を使うことにすると、標準のIndividual Archive Templateなどに含まれている以下のコードが使えなくなります。 <script type="text/javascript" language="javascript...

コメント(0)

コメントの内容確認のため、反映されるまで時間がかかる場合があります。e-mailはサイトに掲載されません。

このページの先頭へ