Вы, похоже, полностью игнорируете, что AJAX здесь : вы делаете асинхронный запрос страницы в Yahoo, что означает, что вы устанавливаете запрос в браузере, а затем продолжаете обрабатывать свой сценарий, пока ждете. Вот и вся цель.
Текст ответа недоступен сразу после установки вызова, но когда вы добавляете alert
, вы добавляете задержку, зависящую от человека, которая просто случается , чтобы быть достаточно длинной для асинхронного запроса чтобы вернуться, в вашем случае.
Вы можете сделать запрос AJAX синхронным («AJAX», так как «Асинхронный Javascript And XML» является неправильным и лучше называется XmlHttpRequest):
var url = "http://query.yahooapis.com/v1/public /yql?"+"q=select%20*%20from%20html%20where%20url%3D%22"+encodeURIComponent(url)+"%22&format=xml'&callback=?";
// Your asynchronous call:
$.getJSON(url, function(data) { ... });
// A synchronous alternative:
$.ajax({
type: 'GET',
url: url,
dataType: 'json',
data: {},
async: false,
success: function(data) { ... },
});
Теперь запрос будет выполнен (или не выполнен) до того, как ваш код продолжится.
Или, чтобы сохранить асинхронный запрос, вы можете переместить код, который вы хотите выполнить после его завершения, в функцию обратного вызова:
while (...) {
function myFunction() {
var x = document.getElementById("prova").textContent;
alert(x);
}
fetch_and_handle(website_url, myFunction);
}
function fetch_and_handle(url, handler) {
var container = $('#prova');
var url = "http://query.yahooapis.com/v1/public /yql?"+"q=select%20*%20from%20html%20where%20url%3D%22"+encodeURIComponent(url)+"%22&format=xml'&callback=?";
$.getJSON(url, function(data) {
if (data.results[0]) {
var data = filterData(data.results[0]);
container.html(data);
if (handler != undefined) {
handler();
}
}
else {
var errormsg = '<p>Error: could not load the page.</p>';
container.html(errormsg);
}
}
}
Я также добавил var
в нескольких местах: когда вы создаете локальную переменную, используйте var
. И я исправил некоторые отступы.