Note: この記事は、3年以上前に書かれています。Webの進化は速い!情報の正確性は自己責任で判断してください。
送信ボタンの連打防止スクリプト。ボタンを無効化する方法では、システム側の問題で送信できなくなったりもしたので、大きめの<div>を上に被せてしまうことにしました。
<form action="#" method="post"><p><input type="text" value="" /><input type="submit" value=" 送信 " /><input type="image" src="" alt=" 送信 " /></p></form>
実際の動作はサンプルページで確認してもらうとして、この場合のHTMLはこれだけでOKです。
Script
window.onload = createOBJ;function createOBJ() {if (!document.getElementsByTagName('form')){ return; }// Create object//// <div id="wrapper">// <p>処理中です...<br /><img src="./loading.gif"></p>// </div>//var objBody = document.getElementsByTagName("body")[0];var objWrap = document.createElement("div");objWrap.setAttribute('id','wrapper');objWrap.style.display = 'none';objBody.appendChild(objWrap);var objText = document.createElement("p");objText.innerHTML = '処理中です...<br />';objWrap.appendChild(objText);// Set imagevar back = new Image();var objImg = new Image();back.src = './transparent.png';objImg.src = './loading.gif';objText.appendChild(objImg);// Add eventsx = document.getElementsByTagName('input');for(i=0;i<x.length;i++) {if(x[i].getAttribute('className') == 'cancel' || x[i].getAttribute('class') == 'cancel') continue;if(x[i].type == 'submit' || x[i].type == 'image') {x[i].onclick = function(){ veilofDarkness(objWrap, this)};x[i].onkeypress = function(){ veilofDarkness(objWrap, this)};}}}function veilofDarkness(wrap,obj) {scroll(0,0);window.setTimeout( function() { obj.disabled = true;}, 1)wrap.style.display = 'block';window.setTimeout( function() { obj.disabled = false;}, 5000)}
onloadで実行し、要素を生成した上で隠す。同時にonclickイベントを付加し、イベント起動時に要素を展開してフォームを隠す。setTimeout()はIE用。IEはsetTimeout()が無いと連打できちゃいます。
<div>要素に乗っけたロード画像と半透明の背景画像は、削除しても動作上は問題ない。用途に応じてカスタムしてください。世の中には便利なサービスもあるので~。
memo: 送信ボタンに「class="cancel"」を付けたとき、無効になるように調整しました。送信後にリロードしない場合とかに。
CSS
#wrapper {position: absolute;top: 0;left: 0;width: 100%;height: 100%;color: #fff;background: transparent url(transparent.png) repeat !important;background: none;filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="./transparent.png", sizingMethod="scale");text-align: center;}#wrapper p {position: relative;left: 0;top: 30%;width: 200px;margin: 0 auto;}#wrapper img {padding: 10px;}
生成した<div>要素用のCSS。これに関しては、特に語ることは無いかな。AlphaImageLoaderに関しては、以前のエントリに纏めてあります。
Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。