コメント投稿時にフォームボタンをグレーアウトする for Movable Type
本サイトで適用している、コメントを投稿時にフォームボタンをグレーアウトするためのカスタマイズです。カスタマイズ方法については以前よりリクエストを頂いておりました。公開が遅くなって申し訳ありません。
ここでは Movable Type でのカスタマイズ方法を紹介致します。他のブログツールについては順次公開していきたいと思います。
カスタマイズ元記事は下記です。ありがとうございました。
1.本カスタマイズの機能
- コメントフォームの「投稿」ボタンクリック時にフォームボタンをグレーアウトにする
- コメントフォームの「確認」ボタンクリック時はグレーアウトにしない
「確認」ボタンクリック時にグレーアウトしないのは、下記の理由のようにユーザビリティ上好ましくないと思ったためです。
- 「確認」でグレーアウトした場合、ブラウザの「戻る」でグレーアウトのままになる(投稿不能になる)
- 「確認」ボタンをクリックした時に「投稿」ボタンを押してしまったと錯覚する可能性がある
以下、カスタマイズ方法です。動作は Windows XP + IE6.0 / IE7.0 / Firefox2 / Opera9 で確認しています。テンプレートは Movable Type デフォルトテンプレートで確認していますが、当サイトの公開テンプレートでも動作します。
またカスタマイズにあたってはテンプレートにできるだけ手を加えないようにしています。
2.JavaScript 外部ファイルの作成
下記の内容を disabledButton.js
という名前で保存し、メインページと同じディレクトリにアップロードしてください。
var disabledFlag = 0;
var isIE = (document.documentElement.getAttribute("style") ==
document.documentElement.style);
function addFormAttribute(form) {
isIE ? form.setAttribute("onsubmit", new Function("if (this.bakecookie.checked) rememberMe(this);disableSubmit(this);")) :
form.setAttribute('onsubmit','if (this.bakecookie.checked) rememberMe(this);disableSubmit(this);');
var elements = form.elements;
for (var i = 0; i < elements.length; i++) {
if (elements[i].type == 'submit' && elements[i].getAttribute('name') == 'post') {
isIE ? elements[i].setAttribute("onclick", new Function("setHiddenValue(this);")) :
elements[i].setAttribute('onclick','setHiddenValue(this)');
}
}
}
function disableSubmit(form) {
if(!disabledFlag){
return;
}
var elements = form.elements;
for (var i = 0; i < elements.length; i++) {
if (elements[i].type == 'submit' || elements[i].type == 'button') {
elements[i].disabled = true;
}
}
}
function setHiddenValue(button) {
if (button.name) {
var q = document.createElement('input');
q.type = 'hidden';
q.name = button.name;
q.value = button.value;
button.form.appendChild(q);
disabledFlag = 1;
}
}
3.テンプレート修正
エントリー・アーカイブ/コメント・プレビューの </head>
の直前に下記を追加します。
<script type="text/javascript" src="<$MTBlogURL$>disabledButton.js"></script>
また、同じテンプレートの body
要素に下記の青色部分を追加します。
<body class="layout-two-column-right individual-entry-archive" onload="individualArchivesOnLoad(commenter_name);addFormAttribute(document.comments_form);">
addFormAttribute
の直前のセミコロン ";
" もお忘れなく。
4.注意事項
コメント・プレビュー画面に本カスタマイズを適用する場合、コメント・プレビュー・テンプレートに必ず下記のタグ(青色部分)をフォームに追加してください。これを追加しないとグレーアウトしません。
:
<p>
<label for="comment-url">URL:</label>
<input id="comment-url" name="url" size="30" value="<$MTCommentPreviewURL$>" />
</p>
<p>
<label for="comment-bake-cookie"><input type="checkbox"
id="comment-bake-cookie" name="bakecookie" onclick="if (!this.checked) forgetMe(document.comments_form)" value="1" />
この情報を登録しますか?</label>
</p>
<p id="comments-open-text">
:
5.補足
- グレーアウトする仕組み
- 「投稿」ボタンのクリックにより
onclick
イベントハンドラを起動します。ハンドラから起動されたsetHiddenValue
でクリックされたボタンをhidden
型のinput
要素として追加します。続いてonsubmit
イベントハンドラが起動され、ハンドラから起動されたdisableSubmit
でフォームボタンをdisabled
にします。 - 「確認」ボタンクリック時にグレーアウトしない仕組み
setHiddenValue
の中で、変数disabledFlag
に 1 を設定し、disableSubmit
の処理で、disabledFlag
フラグが 1 の場合のみbutton
要素をdisabled
にします(もっと良い実装があると思いますが)。onsubmit
属性の再書き込みform
要素のonsubmit
属性を用いてdisableSubmit
関数を起動していますが、属性値には "if (this.bakecookie.checked) rememberMe(this)
" が元から設定されているため、追加スクリプトで元関数と新たに加えた関数の両方を起動するように上書きしています。- IE の不具合対処
- IE では、JavaScript の
getAttribute
/setAttribute
で class ・style・イベント属性などを操作できないというバグがあり、その対処を施しています。IE 不具合対処の参考サイトは下記です。ありがとうございました。
- 複数のsubmitボタンをonsubmitで判定する方法
- JavaScriptの時間を0パディングする方法
- JavaScriptでJSONデータを作る方法
- JavaScriptやjQueryで設定されたイベントの定義場所を調べる方法
- javascript:void(0)のまとめ
- setTimeout()やsetInterval()で引数を渡す方法
- JavaScriptのFormDataの使い方
- JavaScriptメールアドレスチェッカー
- PCのブラウザでiPhoneやAndroidのようなパスワードフォームを実現するJavaScriptライブラリ「FormTools」
- JavaScriptでフォーカスのあたっている要素を取得する「document.activeElement」
- 入力フォームの全角・半角を勝手に変換してくれるJavaScript
- JavaScriptエラーを表示・確認する方法のまとめ
- ソーシャルボタンのJavaScriptでfunctionの前に「!」がついている理由
- JavaScriptでCSSの擬似クラスを設定する方法
- JavaScriptの正規表現で文字列を抜き出す「グループ化」
こんにちは。
こちらの記事も使わせていただきました。
ありがとうございます。
グレーアウトすると二度押しがなくていいですね。
とても重宝しています。
ただ、TypeKeyでログインしたときは
グレーアウトしないのですが、それは設置段階でどこか私がミスをしているのでしょうか(^^)?
>ヨンシマイさん
こんにちは。
ご返事遅くなり申し訳ありません。
カスタマイズ内容につきましては TypeKey に依存するものではありませんので、サイン・インの有無にかかわらず同じ振る舞いになると思います。
とは言いながら当方の動作確認が不十分かもしれません。
サイトの方はカスタマイズを外されているようでしたので設置されている状態で再度ご連絡頂ければ幸いです。
それではよろしくお願い致します。
とても便利な機能ですね。
ちなみに当方では複数のユーザーに各カテゴリーのエントリー投稿をしてもらい、コンテンツを運営しているのですが、時として投稿者がついうっかりして投稿ボタンをダブルクリックすることがあるようで、先日DBにて運営していたMTのデータベースが壊れてしまい再構築できなくなってしまう事態を経験しました。
投稿ボタンをダブルクリックして二重ポストしたことがデータベースの破損の一番の原因なのかは定かではありませんが、できれば「新規エントリー画面」とそのエントリーの「確認画面」からの投稿ボタンのグレーアウト方法について記事にしていただけないでしょうか?
コメント時の二重ポスト防止のこの手法を流用すればよいのかなっと安易に思ってみたりもしましたがなんとなく違うような気もしたり・・・。
お時間ありましたらこのコメントに対しての記事取り上げをお願いします。
>Kenさん
こんにちは。
ご要望の件、承りました。実験して、うまく動作するようであればエントリーしたいと思います。なおMTのバージョンは3.xという認識です。
それではよろしくお願い致します。
管理人様へ
>ご要望の件、承りました。
感謝いたします。実験後、無事正常に動作した後、エントリーして頂けることを心待ちにしております。
ビジネスシーンでもCMSとして利用されている方(企業)も多いと思われますので、きっと、重宝されると思います。お手数をおかけ致しますが何卒、よろしくお願い致します。
>MTのバージョンは3.xという認識です。
了解しました。ちなみに当方は「Ver.3.34」を使用しております。
>Kenさん
こんばんは。
「エントリー投稿時のフォームボタンをグレーアウトするプラグイン for Movable Type 3.3x」をエントリーしましたのでお試し頂ければ幸いです。
それではよろしくお願い致します。