クッキーがらみの変更、うまくいきそうなので、ここでまとめてみる。
まずこれまでのあらすじ。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 && this.bakecookie[0].checked) rememberMe(this)">
つぎはぎだらけなので、抜本的に直せばもっとよくなると思うが、しばらくこれでいってみることにする。
トラックバックURL: http://adp.daa.jp/cgi/mt2/mt-tb.cgi/355