サーバーからJSONファイルを一度ロードして、後でそのサイトでコンテンツを入力する必要があります。 XMLHttpRequest
のJSONファイルを読み込むのは非同期で、できるだけ早く行う必要があります。しかし、コンテンツを取り込むには、DOMをロードする必要があります。非同期XMLHttpRequestのデータが利用可能になった後にコードを実行する
現在、私はxhr.open('GET', 'records.json', false)
を呼び出して要求を同期させています。これは、JSONを読み込んで解析するのにブラウザがDOMをロードするのに要した時間よりも時間がかかる場合に必要でした。これが起こったとき(すなわち、接続が遅い場合)、DOMがロードされ、DOMContentLoaded
イベントリスナーのコードはであるlistData
で実行されます。悪い。
非同期XMLHttpRequest
を使用すると同時に、DOMContentLoaded
でコードを実行するにはどうすればよいですか? listData
が完全に読み込まれると(つまりJSON.parse()
が完了した)、DOMが利用可能になるとすぐにコードを実行したいのですが、両方の条件が満たされたら、私は行けます。
function thisFunctionIsCalledFromTheHtml() {
// Get the JSON data by using a XML http request
var listData;
var xhr = new XMLHttpRequest();
// The request needs to be synchronous for now because on slow connections the DOM is ready
// before it fetches everything from the json file
xhr.open('GET', 'records.json', false);
xhr.addEventListener("load", function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
listData = JSON.parse(xhr.responseText);
} else {
console.error('Error: ' + xhr.status + ' ' + xhr.statusText);
}
}
});
xhr.addEventListener("error", function() {
console.error('Error: ' + xhr.status + ' ' + xhr.statusText);
});
xhr.send(null);
document.addEventListener("DOMContentLoaded", function() {
var placeholderKeys = [];
for (var key in listData) {
var value = listData[key];
placeholderKeys = placeholderKeys.concat(value.title, value.abbr, value.keywords);
}
var filterInput = document.getElementById('input-id');
filterInput.placeholder = placeholderKeys[
Math.floor(Math.random() * placeholderKeys.length)
];
});
}
'DOMContentLoaded'は必要ありませんあなたはこの関数は要素 – charlietfl
@charlietfl後に置かれたスクリプトタグから呼び出されます。しかし、私は後までJSONを読み込むと待ちたくないことを確認した場合DOMがロードされました。できるだけ早くそれが起こるはずです。 – kleinfreund
代わりに約束を返し、約束コールバックを 'DOMContentLoaded'に入れます。 – charlietfl