Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.02.2017, 07:04
Интересующийся
Отправить личное сообщение для RightSeNN Посмотреть профиль Найти все сообщения от RightSeNN
 
Регистрация: 08.02.2017
Сообщений: 10

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] но вообще тогда ничего не работает.
Также думал может надо както задержку между запросами поставить?
Подскажыте пожалуйста.

Последний раз редактировалось RightSeNN, 08.02.2017 в 17:51.
Ответить с цитированием
  #2 (permalink)  
Старый 08.02.2017, 07:27
Кандидат Javascript-наук
Отправить личное сообщение для Diphenyl Oxalate Посмотреть профиль Найти все сообщения от Diphenyl Oxalate
 
Регистрация: 21.01.2017
Сообщений: 139

Потому что каждый раз создаётся div id="Price" (17 строка) и в него добавляется текст (20 строка).
Надо задавать разные id, типа Price + i, тогда будет id=Price0, Price1 и т.д. и ошибки не будет
Ответить с цитированием
  #3 (permalink)  
Старый 08.02.2017, 07:29
Кандидат Javascript-наук
Отправить личное сообщение для Diphenyl Oxalate Посмотреть профиль Найти все сообщения от Diphenyl Oxalate
 
Регистрация: 21.01.2017
Сообщений: 139

А вообще, почему бы сразу не вставлять?

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


Тогда необходимость в 17 и 20 строчке отпадает
Ответить с цитированием
  #4 (permalink)  
Старый 08.02.2017, 17:46
Интересующийся
Отправить личное сообщение для RightSeNN Посмотреть профиль Найти все сообщения от RightSeNN
 
Регистрация: 08.02.2017
Сообщений: 10

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

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


Тогда необходимость в 17 и 20 строчке отпадает
Спасибо, зделал так. Реально укоротил код. Клас!
Ответить с цитированием
  #5 (permalink)  
Старый 08.02.2017, 17:59
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Зачем на каждый запрос создавать новый объект XMLHttpRequest? Достаточно одного и очередь запросов.
Ответить с цитированием
  #6 (permalink)  
Старый 08.02.2017, 18:07
Интересующийся
Отправить личное сообщение для RightSeNN Посмотреть профиль Найти все сообщения от RightSeNN
 
Регистрация: 08.02.2017
Сообщений: 10

как реализовать?
Ответить с цитированием
  #7 (permalink)  
Старый 08.02.2017, 18:46
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от RightSeNN
как реализовать?
Создать один объект, а как он работает, это описано в сети не один раз, почитайте, все будет понятно.
Ответить с цитированием
  #8 (permalink)  
Старый 09.02.2017, 07:02
Интересующийся
Отправить личное сообщение для RightSeNN Посмотреть профиль Найти все сообщения от RightSeNN
 
Регистрация: 08.02.2017
Сообщений: 10

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

Последний раз редактировалось RightSeNN, 09.02.2017 в 07:14.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
многоразовое приминение ajax в цыкле lol4eg AJAX и COMET 12 07.04.2010 21:08