Просмотр полной версии : XMLHttpRequest(В цыкле)
RightSeNN
08.02.2017, 07:04
Мне надо отправить запросы на 3(в будущем на болешее кол.) разных URLа. В ответ получить 3 html странички. Обработать(Получить цену на предмет из каждого URLa) А потом Создать HTML елементы(<div></div>) с этой ценой. Но создаеться только последний елемент(<div>).
$(document).ready(function (){
for (var i = 0; i < 4; i++) {
var modal = i;
var itemhref = ["https://mysite.com/item/1-1-Name1/", "https://mysite.com/item/1-2-Name2/", "https://mysite.com/item/1-3-Name3/"];
xhr = new XMLHttpRequest();
xhr.open('GET', itemhref[i], true);
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4)
{
if (xhr.responseText)
{
var data = xhr.responseText;
var priceactive = $('.ip-prices', data).children('div').children('span:eq(1)').text( );
var itemname = $('.item-h1', data).children('h1').text();
var itempriceid = "Price"+ '_' + itemname.replace(/\s/ig, '_');
//Название + Ссылка
$('div.wrapper').append('<div class="item_name" align="center"><a id=item_name href="">' + itemname + '</a><br></div>');
item_name.setAttribute("href", itemhref[modal])
$('div.wrapper').append('<span class=titlestyle>Price</span><div id=' + itempriceid + '>' + priceactive + '</div>');
}
}
}
}
});
Пробовал както запихнуть xhr.responseText в масив Data[i] но вообще тогда ничего не работает.
Также думал может надо както задержку между запросами поставить?
Подскажыте пожалуйста.
Diphenyl Oxalate
08.02.2017, 07:27
Потому что каждый раз создаётся div id="Price" (17 строка) и в него добавляется текст (20 строка).
Надо задавать разные id, типа Price + i, тогда будет id=Price0, Price1 и т.д. и ошибки не будет
Diphenyl Oxalate
08.02.2017, 07:29
А вообще, почему бы сразу не вставлять?
$('div.wrapper').append('<span class=titlestyle>Price</span><div>' + priceactive + '</div>');
Тогда необходимость в 17 и 20 строчке отпадает
RightSeNN
08.02.2017, 17:46
Потому что каждый раз создаётся div id="Price" (17 строка) и в него добавляется текст (20 строка).
Надо задавать разные id, типа Price + i, тогда будет id=Price0, Price1 и т.д. и ошибки не будет
Извеняюсь все не так. Я хотел укоротить код дабы вам было легче розобраться. Там еще чекаеться название-оно уникальное и именно оно прописываеться как ID. Потому заменяться на той стадии не может. Добавил ети строчки кода для наглядности.
А вообще, почему бы сразу не вставлять?
$('div.wrapper').append('<span class=titlestyle>Price</span><div>' + priceactive + '</div>');
Тогда необходимость в 17 и 20 строчке отпадает
Спасибо, зделал так. Реально укоротил код. Клас!
Зачем на каждый запрос создавать новый объект XMLHttpRequest? Достаточно одного и очередь запросов.
RightSeNN
08.02.2017, 18:07
как реализовать?
как реализовать?
Создать один объект, а как он работает, это описано в сети не один раз, почитайте, все будет понятно.
RightSeNN
09.02.2017, 07:02
Зачем на каждый запрос создавать новый объект XMLHttpRequest? Достаточно одного и очередь запросов.
Нашел похожий на мою задачку примерчик с использованием AJAX, переделал под свой запрос. И все заработало. Я незнаю такое ли вы мне советовали или нет так как досих пор незнаю что не так было в первом варианте. Но теперь все гуд. Если у когото стоит такаяже задачка как у меня парсить данные с нескольких юрлов можете тупо скопировать и заменить внутрянку функцыи analysisSite. Все будет работать.
(function($){ //Аналог - $(document).ready(function (){
var targeturl = ["https://mysite.com/item/1-1-Name1/", "https://mysite.com/item/1-2-Name2/", "https://mysite.com/item/1-3-Name3/"];
var i = 0;
function ajaxStart(){
$('#progress').show();
}
function ajaxStop(){
$('#progress').hide();
}
function parserGo(){
ajaxStart();
for (var i = 0; i < targeturl.length; i++) {
var myRequest = $.ajax(targeturl[i]);
myRequest.done(function (d) {
analysisSite(d);
ajaxStop();
});
myRequest.fail(function (e, g, f) {
alert('Epic Fail');
ajaxStop();
})
}
}
function analysisSite(data){
var itemname = '';
var itemnameid = '';
var priceactive = '';
var buyordermaxprice = '';
var itempreviewsrc = '';
var itempreviewid = '';
var itempriceid = '';
$(data).find('.item-h1').children('h1').each(function(){
itemname = $(this).text();
itemnameid = "Name"+ '_' + $(this).text().replace(/\s/ig, '_');
})
priceactive = $('.ip-prices', data).children('div').children('span:eq(1)').text( );
itempreviewsrc = $('.ip-pic', data).children('img').attr('src');
itempreviewid = "Preview"+ '_' + itemname.replace(/\s/ig, '_');
itempriceid = "Price"+ '_' + itemname.replace(/\s/ig, '_');
//Название + Ссылка
$('div.wrapper').append('<div class=item_name id=newdiv' + itemnameid + ' align="center"><a id=' + itemnameid + ' href=' + targeturl[i] + '>' + itemname + '</a></div>');
//Картинка превью
$('div.wrapper').append('<span class=itempreview><img id=' + itempreviewid + ' src='+itempreviewsrc+'></span><br>');
//Цена
$('div.wrapper').append('<span class=titlestyle>Price</span><div id=' + itempriceid + '>' + priceactive + '</div>');
}
$(function(){
$('#progress').hide();
$('#starter').click(parserGo);
});
})(jQuery);
Столкнулся с еще одной проблемкой. Не роботает ссылка указанная в строке №46. При просмотре кода странички, HREF там присутствует. Но ссылка какбы ниже названия. Название почемуто попадает в <div>, а ссылка остаеться в <a>. Есть предположения в чем косяк?
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot