#javascript #html #css #fetch
#javascript #HTML #css #извлечение
Вопрос:
Я пытаюсь получить HTML страницы (как только я смогу заставить это работать, я буду извлекать определенный Div на запрошенной странице), затем распечатайте эту страницу в моем id="data"
div. Я могу видеть информацию, проходящую через обещание, но я не могу получить доступ к этой информации.
const proxyurl = "https://cors-anywhere.herokuapp.com/";
const url = "https://www.booking.com"; // site that doesn’t send Access-Control-*
fetch(proxyurl url) // https://cors-anywhere.herokuapp.com/https://example.com
.then(response => response)
.then(data => {
console.log(data.text());
return document.getElementById('data').innerHTML = data.text();
})
.catch((err) => console.log("Can’t access " url " response. Blocked by browser?" err));
<div id='data'></div>
Комментарии:
1.
.then(response => response.text()) .then(data => { document.getElementById('data').innerHTML = data; })
Ответ №1:
.text()
Метод, который вы вызываете в теле ответа, возвращает обещание. Таким образом, правильный способ доступа к нему был бы через цепочку обещаний.
Согласно документации:
Метод text() Body mixin принимает поток ответов и считывает его до завершения. Он возвращает обещание, которое разрешается с помощью объекта USVString (text).
Вот как должен выглядеть ваш обновленный фрагмент:
const proxyurl = "https://cors-anywhere.herokuapp.com/";
const url = "https://www.booking.com"; // site that doesn’t send Access-Control-*
fetch(proxyurl url) // https://cors-anywhere.herokuapp.com/https://example.com
.then(response => response.text())
.then(html => {
// console.log(html);
document.getElementById('data').innerHTML = html;
})
.catch((err) => console.log("Can’t access " url " response. Blocked by browser?" err));
<html>
<body>
<div id='data'>
</div>
</body>
</html>
Комментарии:
1. @mplungjan ах, даже не заметил
return
там! Обновлено
Ответ №2:
text()
Или json()
можно вызвать только один раз. В вашем коде вы вызываете это дважды. Итак, консоль.журнал выдает вам данные, и при следующем вызове data.text()
результат будет пустым.
Вы могли бы сделать это, как показано ниже
const proxyurl = "https://cors-anywhere.herokuapp.com/";
const url = "https://www.booking.com"; // site that doesn’t send Access-Control-*
fetch(proxyurl url) // https://cors-anywhere.herokuapp.com/https://example.com
.then(response => response)
.then(data => {
const resData = data.text();
console.log(resData);
document.getElementById('data').innerHTML = resData;
})
.catch((err) => console.log("Can’t access " url " response. Blocked by browser?" err));
<div id="data"></div>
Комментарии:
1. По-прежнему отображается объект promise. И зачем возвращать результат присвоения innerHTML?
return document.getElementById('data').innerHTML = resData;
2. возврат не требуется.
3. Основная проблема заключается в том, что вы не можете использовать
text()
илиjson()
только один раз. Что я делаю, так это присваиваю переменной, а затем получаю доступ к переменной. вот так просто.