ここで紹介するソリューションは、サーバー側の処理中に [読み込み中...] ボックスを表示し、サーバー側の処理が完了すると非表示にする方法を示すことを目的としています。
私は非常に基本的な AJAX 機構 (FF でテストされていますが、IE でも問題ないはずです) でこれを行います。つまり、Prototype、jQuery、Dojo などのフレームワークは使用しません。
トリックをよりよく理解できるように、以下はほんの一例であり、すぐに使えるソリューションを装うものではありません。私は表面的なことをするつもりはありませんが、多くの言葉よりも明確な例の方がうまく説明できると思います。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>First Example</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style>
.hidden {
display: none;
}
.loadingInProgress {
color: #FFFFFF;
width: 75px;
background-color: #FF0000;
}
</style>
<script type="text/javascript">
var httpRequest;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
httpRequest = new XMLHttpRequest();
httpRequest.overrideMimeType('text/xml');
} else if (window.ActiveXObject) { // IE
try {
httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try {
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {}
}
}
if (!httpRequest) {
alert('Giving up :( Cannot create an XMLHTTP instance');
}
httpRequest.onreadystatechange = function(){
switch (httpRequest.readyState) {
case 1: // Loading
document.getElementById('loading').className = "loadingInProgress";
break;
case 4: // Complete
document.getElementById('loading').className = "hidden";
if (httpRequest.status == 200) {
// perfect!
} else {
// there was a problem with the request,
// for example the response may be a 404 (Not Found)
// or 500 (Internal Server Error) response codes
}
break;
}
};
function go() {
httpRequest.open('GET', document.getElementById('form1').action, true);
httpRequest.send('');
}
</script>
</head>
<body>
<div id="loading" class="hidden">Loading...</div>
<form id="form1" name="form1" action="doSomething.php">
<input type="button" value="Click to submit:" onclick="go()" />
</form>
</body>
</html>
ご覧のとおり<div>
、"Loading..." メッセージを保持する があります。
原則は、オブジェクトのに<div>
応じてを表示/非表示にすることです。XMLHttpRequest
readyState
onreadystatechange
のハンドラーを使用してXMLHttpRequest
、変更をトリガーしましたreadyState
。
私が使用するバックエンド php スクリプト (フォームの として宣言されているaction
) は、sleep(5) を実行して、"Loading..." メッセージを 5 秒間表示します。
<?php
sleep(5);
header('Cache-Control: no-cache');
echo "OK";
?>
通常、Cache-control: no-cache
ヘッダーを設定しないと、ブラウザーが応答をキャッシュし、必要に応じて要求を再送信するのを回避するため、ヘッダーが必要です。
「始める」AJAX ドキュメントの良い情報源はMozilla MDCです。
Prototype のような Javascript フレームワークを使用すると、ブラウザセーフなアプローチを利用して全体をより穏やかに処理でき、デバッグにかかる時間を節約できます。
編集:
私は ASP.NET も ASP も知らないので、php を選びました。申し訳ありません。