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 image
var back = new Image();
var objImg = new Image();
back.src = './transparent.png';
objImg.src = './loading.gif';
objText.appendChild(objImg);
// Add events
x = 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かはてブコメントにて。