Як отримати відповідь на XMLHttpRequest?


187

Я хотів би знати, як використовувати XMLHttpRequest для завантаження вмісту віддаленої URL-адреси, а HTML-код веб-сайту, що отримує доступ, зберігається у змінній JS.

Скажіть, якщо я хотів би завантажити та попередити () HTML-код http://foo.com/bar.php , як би це зробити?



2
якщо ви відкриті для бібліотеки JS, jQuery дійсно спрощує це методом .load
scunliffe

20
слава богу, нарешті результат Google, який не стосується jQuery: |
Сем Влобергс

Відповіді:


277

Ви можете отримати це 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);
});

Зауважте, що вам потрібно враховувати таку ж політику походження для JavaScript, коли вона не працює в localhost. Ви можете розглянути можливість створити проксі-скрипт у своєму домені.


Як ми можемо створити проксі?
Кріс - молодший

працює як шарм :)
Анураг

29

Я б запропонував заглянути fetch. Це еквівалент ES5 і використовує Обіцянки. Він набагато легше читається та легко налаштовується.

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) => {});

Більше інформації:

Документація Mozilla

Чи можу я використовувати (94% жовтня 2019)

Підручник Метта Уолша


27

Простий спосіб використання XMLHttpRequestз pure JavaScript. Ви можете встановити, custom headerале це необов'язково використовувати на основі вимог.

1. Використання методу POST:

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.

2. Використання методу GET:

Будь ласка, запустіть нижче приклад і отримаєте відповідь 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();
}


Добре працює для мене.
Mayur S

Хороший приклад. Працює чудово.

16

У 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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.