XMLHttpRequestを使用してリモートURLのコンテンツをロードし、アクセスしたサイトのHTMLをJS変数に格納する方法を知りたいです。
たとえば、http://foo.com/bar.phpのHTMLをロードしてalert()したい場合、どうすればよいでしょうか。
XMLHttpRequestを使用してリモートURLのコンテンツをロードし、アクセスしたサイトのHTMLをJS変数に格納する方法を知りたいです。
たとえば、http://foo.com/bar.phpのHTMLをロードしてalert()したい場合、どうすればよいでしょうか。
回答:
あなたはでそれを得ることが可能XMLHttpRequest.responseText
でXMLHttpRequest.onreadystatechange
ときXMLHttpRequest.readyState
に等しいですXMLHttpRequest.DONE
。
以下に例を示します(IE6 / 7との互換性はありません)。
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
alert(xhr.responseText);
}
}
xhr.open('GET', 'http://example.com', true);
xhr.send(null);
IE6 / 7だけでなく、ブラウザー間の互換性を高めるためだけでなく、ブラウザー固有のメモリリークやバグをカバーするため、また、アジャクショナルリクエストを発生させる際の冗長性を減らすために、jQueryを使用できます。
$.get('http://example.com', function(responseText) {
alert(responseText);
});
localhostで実行していない場合は、JavaScriptの同じ生成元ポリシーを考慮する必要があることに注意してください。ドメインでプロキシスクリプトを作成することを検討してください。
を調べることをお勧めしfetch
ます。ES5と同等であり、Promiseを使用します。より読みやすく、簡単にカスタマイズできます。
const url = "https://stackoverflow.com";
fetch(url)
.then(
response => response.text() // .json(), etc.
// same as function(response) {return response.text();}
).then(
html => console.log(html)
);
Node.jsでは、次fetch
を使用してインポートする必要があります。
const fetch = require("node-fetch");
同期的に使用する場合(トップスコープでは機能しません):
const json = await fetch(url)
.then(response => response.json())
.catch((e) => {});
より詳しい情報:
使用するための簡単な方法XMLHttpRequest
でpure JavaScript
。設定できますcustom header
が、必要に応じてオプションで使用します。
window.onload = function(){
var request = new XMLHttpRequest();
var params = "UID=CORS&name=CORS";
request.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
console.log(this.responseText);
}
};
request.open('POST', 'https://www.example.com/api/createUser', true);
request.setRequestHeader('api-key', 'your-api-key');
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.send(params);
}
POSTメソッドを使用してパラメータを送信できます。
以下の例を実行すると、JSON応答が返されます。
window.onload = function(){
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
console.log(this.responseText);
}
};
request.open('GET', 'https://jsonplaceholder.typicode.com/users/1');
request.send();
}
ではXMLHttpRequest
、使用XMLHttpRequest.responseText
すると以下のような例外が発生する可能性があります
Failed to read the \'responseText\' property from \'XMLHttpRequest\':
The value is only accessible if the object\'s \'responseType\' is \'\'
or \'text\' (was \'arraybuffer\')
次のようにXHRからの応答にアクセスする最良の方法
function readBody(xhr) {
var data;
if (!xhr.responseType || xhr.responseType === "text") {
data = xhr.responseText;
} else if (xhr.responseType === "document") {
data = xhr.responseXML;
} else {
data = xhr.response;
}
return data;
}
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
console.log(readBody(xhr));
}
}
xhr.open('GET', 'http://www.google.com', true);
xhr.send(null);