アイデアを試す簡単な実験
別のページへのリンクを含むHTMLページがある簡単な例を作成しました。そのリンクをクリックすると、長いプロセス(10秒待機)をシミュレートするPHPスクリプトにAJAXリクエストが送信され、セッション内の変数が変更されます。次に、ターゲットページはその変数をエコーします。
そのリンクをクリックすると、ページは長いAJAXリクエストを開始しますが、別のページにも移動します。その結果、AJAXリクエストはキャンセルされ、他のページには「何も」印刷されません。
これがserver.phpです:
session_start();
$x = isset($_SESSION['x']) ? $_SESSION['x'] : 0;
sleep(10); /* simulates long process */
$_SESSION['x'] = ++$x;
echo $x;
index.html(重要な部分):
<a href="other.php">Click here</a>
index.html(<script>タグ内)のAJAXリクエスト:
document.querySelector('a').onclick = function(e) {
var xhr = new XMLHttpRequest();
xhr.onload = function(e) {
console.log(JSON.parse(xhr.responseText));
}
xhr.open('POST', 'server.php');
xhr.send();
}
考えられる解決策
サーバーでのみリクエストに時間がかかる場合は、そのプロセスの進行状況を返すエンドポイントを作成してから、すべてのページにjavascriptコードを追加して、このエンドポイントを使用し、進行状況をユーザーに表示します。