Возврат содержимого HTML в виде строки с заданным URL. Функция Javascript
Я хочу написать функцию javascript, которая возвращает HTML-содержимое в виде строки с заданным URL-адресом функции. Я нашел аналогичный ответ на Stackru.
Я пытаюсь использовать этот ответ, чтобы решить мою проблему.
Тем не менее, кажется, как будто document.write()
ничего не пишет. Когда я загружаю страницу, я получаю пустой экран.
<html>
<head>
</head>
<body>
<script type="text/JavaScript">
function httpGet(theUrl)
{
var xmlHttp = null;
xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", theUrl, false );
xmlHttp.send( null );
return xmlHttp.responseText;
}
document.write(httpGet("https://stackru.com/"));
</script>
</body>
</html>
6 ответов
Вам нужно вернуться, когда readystate==4, например
function httpGet(theUrl)
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
return xmlhttp.responseText;
}
}
xmlhttp.open("GET", theUrl, false );
xmlhttp.send();
}
Единственное, что я нашел для кросс-сайта, это эта функция:
<script type="text/javascript">
var your_url = 'http://www.example.com';
</script>
<script type="text/javascript" src="jquery.min.js" ></script>
<script type="text/javascript">
// jquery.xdomainajax.js ------ from padolsey
jQuery.ajax = (function(_ajax){
var protocol = location.protocol,
hostname = location.hostname,
exRegex = RegExp(protocol + '//' + hostname),
YQL = 'http' + (/^https/.test(protocol)?'s':'') + '://query.yahooapis.com/v1/public/yql?callback=?',
query = 'select * from html where url="{URL}" and xpath="*"';
function isExternal(url) {
return !exRegex.test(url) && /:\/\//.test(url);
}
return function(o) {
var url = o.url;
if ( /get/i.test(o.type) && !/json/i.test(o.dataType) && isExternal(url) ) {
// Manipulate options so that JSONP-x request is made to YQL
o.url = YQL;
o.dataType = 'json';
o.data = {
q: query.replace(
'{URL}',
url + (o.data ?
(/\?/.test(url) ? '&' : '?') + jQuery.param(o.data)
: '')
),
format: 'xml'
};
// Since it's a JSONP request
// complete === success
if (!o.success && o.complete) {
o.success = o.complete;
delete o.complete;
}
o.success = (function(_success){
return function(data) {
if (_success) {
// Fake XHR callback.
_success.call(this, {
responseText: data.results[0]
// YQL screws with <script>s
// Get rid of them
.replace(/<script[^>]+?\/>|<script(.|\s)*?\/script>/gi, '')
}, 'success');
}
};
})(o.success);
}
return _ajax.apply(this, arguments);
};
})(jQuery.ajax);
$.ajax({
url: your_url,
type: 'GET',
success: function(res) {
var text = res.responseText;
// then you can manipulate your text as you wish
alert(text);
}
});
</script>
После получения ответа просто вызовите эту функцию, чтобы добавить данные к элементу тела
function createDiv(responsetext)
{
var _body = document.getElementsByTagName('body')[0];
var _div = document.createElement('div');
_div.innerHTML = responsetext;
_body.appendChild(_div);
}
Код @satya изменен, как показано ниже
function httpGet(theUrl)
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
createDiv(xmlhttp.responseText);
}
}
xmlhttp.open("GET", theUrl, false);
xmlhttp.send();
}
Вы не можете сделать это в общем случае
...из-за той же политики происхождения , которую браузеры используют для ограничения доступа к сайту B из кода, работающего на сайте A. Когда вы пытаетесь (с
XMLHttpRequest
или же
fetch
д.), вы получите сообщение об ошибке, говорящее что-то вроде:
В запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».
Подробнее в ответах на этот вопрос и в ссылке СОП выше. Но в основном: речь идет не о том, чтобы люди не видели контент сайта B, а о невозможности сделать это из контекста (браузера), который может хранить аутентификационную информацию для текущего пользователя, которая раскрыла бы его личную информацию, если бы вы могли читать сайт B. контент из браузера этого пользователя.
Очень небольшое количество веб-сайтов может обслуживать свой контент, используя заголовки
совместного использования ресурсов между источниками (вышеупомянутыеAccess-Control-Allow-Origin
и другие), чтобы позволить любому сайту читать их содержимое, но это очень необычно.
Если вы хотите получить содержимое подавляющего большинства сайтов, вам придется использовать для этого код, работающий не в браузере (например, код, работающий где-то на сервере). На протяжении многих лет было много сайтов, которые позволяли вам запрашивать их с помощью URL-адреса и возвращать вам содержимое этого URL-адреса, запрошенного их сервером (и, таким образом, не подпадает под SOP, поскольку информация аутентификации на основе браузера текущего пользователя для другого сайт не используется), но они, как правило, возникают, а затем снова исчезают, поскольку на самом деле нет хорошей модели дохода для поддержки требований к пропускной способности. В конце концов, зачем платить за это кому-то еще, когда вы можете просто запустить свой собственный сервер дешево (или даже бесплатно) и сделать это самостоятельно.
Вот версия принятого ответа, что 1)
returns
значение из функции (исправление) и 2) не нарушается при использовании
"use strict";
Я использую этот код для предварительной загрузки
.txt
файл в мой
<textarea>
когда пользователь загружает страницу.
function httpGet(theUrl)
{
let xmlhttp;
if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else { // code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
return xmlhttp.responseText;
}
}
xmlhttp.open("GET", theUrl, false);
xmlhttp.send();
return xmlhttp.response;
}
На некоторых веб-сайтах
XMLHttpRequest
может отправить вам что-то вроде
<script src="#"></srcipt>
. В этом случае попробуйте использовать HTML-документ, такой как скрипт в разделе:
<html>
<body>
<iframe src="website.com"></iframe>
<script src="your_JS"></script>
</body>
</html>
Теперь вы можете использовать JS для получения текста из HTML, например
getElementbyId
.
Но это может не работать для некоторых сайтов с междоменной блокировкой.