Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   XMLHttpRequest(В цыкле) (https://javascript.ru/forum/misc/67282-xmlhttprequest-v-cykle.html)

RightSeNN 08.02.2017 07:04

XMLHttpRequest(В цыкле)
 
Мне надо отправить запросы на 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

Цитата:

Сообщение от Diphenyl Oxalate (Сообщение 443630)
Потому что каждый раз создаётся div id="Price" (17 строка) и в него добавляется текст (20 строка).
Надо задавать разные id, типа Price + i, тогда будет id=Price0, Price1 и т.д. и ошибки не будет

Извеняюсь все не так. Я хотел укоротить код дабы вам было легче розобраться. Там еще чекаеться название-оно уникальное и именно оно прописываеться как ID. Потому заменяться на той стадии не может. Добавил ети строчки кода для наглядности.
Цитата:

Сообщение от Diphenyl Oxalate (Сообщение 443631)
А вообще, почему бы сразу не вставлять?

$('div.wrapper').append('<span class=titlestyle>Price</span><div>' + priceactive + '</div>');


Тогда необходимость в 17 и 20 строчке отпадает

Спасибо, зделал так. Реально укоротил код. Клас!

laimas 08.02.2017 17:59

Зачем на каждый запрос создавать новый объект XMLHttpRequest? Достаточно одного и очередь запросов.

RightSeNN 08.02.2017 18:07

как реализовать?

laimas 08.02.2017 18:46

Цитата:

Сообщение от RightSeNN
как реализовать?

Создать один объект, а как он работает, это описано в сети не один раз, почитайте, все будет понятно.

RightSeNN 09.02.2017 07:02

Цитата:

Сообщение от laimas (Сообщение 443677)
Зачем на каждый запрос создавать новый объект 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>. Есть предположения в чем косяк?


Часовой пояс GMT +3, время: 02:14.