ユーザーがボタンをクリックして、xhr get リクエストを介してデータを取得できるページがあります。データが読み込まれて解析されている間、読み込み中のメッセージが表示され、準備ができたらデータに置き換えられます。私は dojo ライブラリを使用しているので、jQuery やその他のライブラリは含めません。
これは、私が使用しているセットアップの簡略化されたバージョンです。
HTML
<div id = "clickMe"> Click Me! </div>
<div id = "results" class = "hidden">
Please wait while we retrieve the results
</div>
CSS
.hidden {display: none;}
Javascript
// Bind function to click me div
var clickMe = document.getElementById('clickMe');
clickMe.addEventListener('click', getResults, false);
function getResults () {
// Display the loading message while results are retrieved
var resultsDiv = document.getElementById('results');
resultsDiv.classList.remove('hidden');
// Get the data and parse it here using a standard dojo.xhrGet method
var displayResults = getData();
// Output data to resultsDiv, overwriting loading message
resultsDiv.innerHTML = displayResults;
}
私が抱えている問題は、「非表示」クラスを削除して結果の div を表示する前に、getData 関数が完了するまで getResults 関数が常に待機することです。これは、データの処理中に遅延が発生した場合でも、ユーザーには読み込みメッセージが表示されず、取得されたデータのみが表示されることを意味します。ただし、アラートを途中で配置すると、機能が強制的に一時停止され、読み込みメッセージが表示されます。
function getResults () {
// Display the loading message while results are retrieved
var resultsDiv = document.getElementById('results');
resultsDiv.classList.remove('hidden');
// The loading message will be displayed if this alert is included
alert ("Hello world!");
// Get the data and parse it here using a standard dojo.xhrGet method
var displayResults = getData();
// Output data to resultsDiv, overwriting loading message
resultsDiv.innerHTML = displayResults;
}
アラートを console.log に置き換えてみましたが、読み込みメッセージが表示されない状態に戻ります。また、読み込み中のメッセージを表示する際にコールバック関数としてデータを取得するように設定しようとしましたが、やはり何も表示されません。get リクエストを sync: true と sync: false に設定して試しましたが、やはりうまくいきません。
getData の待機中にロード中のメッセージが表示されるようにするにはどうすればよいですか?
編集:
これが getData 関数です。同期ありとなしの両方を試しました。
function getData() {
var targetUrl = //some url;
var restResponse;
dojo.xhrGet({
url: targetUrl,
sync: true; // no difference when this is omitted
load: function(result) {
restResponse = result;
}
});
// Parse the rest response - fairly long function so I won't paste it here
var parsedResponse = parseResult(restResponse);
return parsedResponse;
}