Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   jQuery и xml (https://javascript.ru/forum/jquery/15733-jquery-i-xml.html)

vladvk 11.03.2011 03:32

jQuery и xml
 
Совсем измучился, нужна помощь
вот код -
$(document).ready(function(){
        $.ajax({
    type: "GET",
    url: "011pags.xml",
    dataType: "xml",
 
    success: function(xml) {
	$('#kod_tovar1').keyup(function(){
$(xml).find("product").each(function()
                        {
						var id = $(this).attr('id')

						
						if ($('#kod_tovar1').val() == id)
				{						
                $('#nazvanie1').val($(this).attr('name'))
				$('#kod_tovar1').val($(this).attr('id'))
				$('#cena1').val($(this).attr('price'))
		    } 
         });	
       });
	   
		   
		            
       }
   }); 
});
    </script>

xml файл -
<page addtobag="1" category="12" id="2">
<product height="450" id="48555" name="Набор" price="$0" width="450" x="429" y="0">
<subproduct id="75182" name="Сумка" price="$0"/>
<subproduct id="19180" name="Ручка" price="$0"/>
</product>
</page>

как видно у product есть дочка subproduct как вытащить id одновременно у родителя и дочки чтобы потом сравнить с тем что ввел пользователь.

micscr 11.03.2011 08:32

ну так запускай в цикле еще и цикл по детям у product.

лучше предобработай эти данные сначала, а не бегай по дереву xml при каждом отпускании кнопки:
$xml = $(xml);
// И формируй следующую структуру:
data = {};
data[id] = {};
data[id].name =
data[id].price =

Эти данные сохрани в переменной объявленной в $(document).ready и обработчик keyup выведи в ready изнутри той функции.

vladvk 11.03.2011 09:44

Спасибо.
Можно поподробней по какому принципу формировать структуру data

micscr 11.03.2011 09:56

Я вроде написал:
пробегаешь по всем необходимым элементам(которые с id), имеешь им id, name, price.
Будет такой:
Код:

data[48555].name = 'Набор'
                .price = '$0'
data[75182].name = 'Сумка'
                .price = '$0'
...

Это будет объект со свойствами равными твоим id. Проверять так:
id = $(this).val();
if (id in data) {
  $(что то).val(data[id].name);
}

vladvk 11.03.2011 10:14

Мысль уловил спасибо.
А как правильно задать значения для data

micscr 11.03.2011 10:30

$('[price]').each(function(){
  var id = this.id;
  data[id] = {};
  data[id].name = $(this).attr('name');
  // ...
});

vladvk 11.03.2011 10:59

Господи все в голове смешалось, пните чтоли.
почему здесь - $('[price]').each(function(){

micscr 11.03.2011 11:06

изучайте основы джиквери !!!
Вам что надо - собрать данные с <product> и его <subproduct>. Чтобы не бегать по дереву, я их нахожу как имеющие атрибут price

vladvk 11.03.2011 11:34

Спасибо

vladvk 11.03.2011 13:53

Что то у меня не получается
$(document).ready(function(){
 $('#kod_tovar1').keyup(function(){
        $.ajax({
    type: "GET",
    url: "011pags.xml",
    dataType: "xml",
    success: function(xml) {
	
$xml = $(xml);
$('[price]').each(function(){
  var id = this.id;
	data[id] = {};
	data[id].name = $(this).attr('name');
	data[id].price = $(this).attr('price');
	 
id = $(this).val();
if (id in data) {
  $('#nazvanie1').val(data[id].name);
   $('#cena1').val(data[id].price);
}

   });     
                   
	   }
	   });
   }); 
});

micscr 11.03.2011 14:22

$.ajax вытащи из keyup. Так примерно:
$(document).ready(function(){
  var data = null;
  var flag = false;
  $.ajax({
    type: "GET",
    url: "011pags.xml",
    dataType: "xml",
    success: function(xml) { 
       flag = false;
       // формируем data 
       flag = true;
   }
  ); 
  $('#kod_tovar1').keyup(function(){
    if (data && flag) {
        // проверка текущего значения с теми, что в data
    }
  });
});

vladvk 11.03.2011 18:45

непойму почему alert на выходе дает [object Object] в 26 строчке
$(document).ready(function(){
  var data = null;
  var flag = false;
  $.ajax({
    type: "GET",
    url: "011pags.xml",
    dataType: "xml",
    success: function(xml) { 
       flag = false;

  $(xml).find('[price]').each(function()
                        {
						var id = $(this).attr('id')
						data = {};
	data[id] = $(this).attr('id');
	data[id].name = $(this).attr('name');
	data[id].price = $(this).attr('price');
       flag = true;
	  
	   });
	  }   
  }); 
    $('#kod_tovar1').keyup(function(){
    if (data && flag) {   
id = $(this).val();
alert (data);
if (id in data) {
   $('#kod_tovar1').val(data[id]);
  $('#nazvanie1').val(data[id].name);
  $('#cena1').val(data[id].price);
}
  }
});
});

micscr 12.03.2011 09:24

А что должно давать?
var x = {}
alert(x)

vladvk 12.03.2011 18:34

Не пойму как правильно свойства задать здесь:
data[id] = {};

vladvk 13.03.2011 03:56

А это так и должно быть:
alert (data[id]); == > undefined

micscr 13.03.2011 08:02

data = {}
data[1] = {}
data[1].name = 'aaa';
data[1].price = '1000';

vladvk 13.03.2011 20:38

Толи я тупой толи ....
Совсем запутался, пните куда рыть
$(xml).find('[price]').each(function()
                        {	
						var id = $(this).attr('id');
						//var name = $(this).attr('name');
						//var price = $(this).attr('price');
		//for(var id in data) {												
	data = {};
	for(var id in data) {
	data[id] = {};
	//for(var id in data) {
	data[id].name = $(this).attr('name');
	data[id].price = $(this).attr('price');	
	}
	
	  console.log(data[id]);
	 
	 						
});

micscr 14.03.2011 12:20

ты data в цикле постоянно обнуляешь(data = {};).
Я выше показывал где объявлять, там где писал:
var data = null;

пиши data = {};

vladvk 14.03.2011 17:46

Спасибо.
В осле не работает, почемуто

vladvk 15.03.2011 00:07

Все работает.
Огромное спасибо micscr за помощь.
вот рабочий код:
$(document).ready(function(){
 var data = null;
  data = {};
  var id = null;
  data[id] = {};
  var flag = false;
 $.ajax({
    type: "GET",
    url: "011pags.xml",
    dataType: "xml",
	    error: function(XMLHttpRequest, textStatus, errorThrown) { 
	        alert("Error AJAX: " + textStatus + ", " + errorThrown); 
	    },
    success: function (xml) { 
       flag = false;	   	     
  $(xml).find('[price]').each(function()
                        {	
						var id = $(this).attr('id');
	data[id] = {};
	data[id].id = $(this).attr('id');
	data[id].name = $(this).attr('name');
	data[id].price = $(this).attr('price');						
});	
       flag = true;	 
	   } 	  	   
	  });  	  	   
	     	     $('#vvod_kod').keyup(function(){
		 
    if (data && flag) {   
id = $(this).val();
if (id in data) {

var ids = 0;
  
//$('.quantity').css('background': '#f4fff5', 'padding-left': '3px', 'height': '15px', 'border': '1px');
$('#add_tb').append('<tr id="tr-' + ids + '"><td class="quantity"><img src="images/del.jpg" width="15" height="15" onclick="removeInput(\'' + ids + '\')" /></a><input size="10" type="text" name="kodtovar_' + ids + '" id="kodtovar_' + ids + '" value="'+ data[id].id +'"></td><td class="quantity"><input size="72" type="text" name="nazvanie_' + ids + '" id="nazvanie_' + ids + '" value="'+ data[id].name +'"></td><td class="quantity"><input size="9" type="text" name="stranica_' + ids + '" id="stranica_' + ids + '" value=""></td><td class="quantity"><input size="11" type="text" name="cena_' + ids + '" id="cena_' + ids + '" value="'+ data[id].price +'"></td><td class="quantity"><input size="11" type="text" name="kolihectvo_' + ids + '" id="kolihectvo_' + ids + '" value="1"></td><td class="quantity"><input size="5" type="text" name="summa_' + ids + '" id="summa_' + ids + '" value="'+ data[id].price +'"></td></tr>');  
ids++;
}
  }
});
});
function removeInput(id) {
 $("#tr-"+id).remove();
}


Осталась одно еще проблемка
<page addtobag="1" category="12" id="4">
<product height="450" id="44241" name="Надфель" price="$0" width="450" x="429" y="0"/>
</page>
<page addtobag="1" category="13" id="5">
<product height="450" id="99326" name="Ручка" price="$0" width="450" x="0" y="0">
<subproduct id="22098" name="Пенал" price="$0"/>
</product>
</page>

Например
вводим 22098 получаем id=5 page и умножаем на 2
вводим 44241 получаем id=4 page и умножаем на 2
вводим 99326 получаем id=5 page и умножаем на 2
Пока даже мыслей нет как можно раализовать данную штуку
Пожалуйста набросайте план реализации

vladvk 15.03.2011 01:45

Еще маленько доработал скрипт
var pric = data[id].price;
price = pric.slice(1);

удаляет знак доллара в price

micscr 15.03.2011 16:24

Цитата:

Пожалуйста набросайте план реализации
храни там же где и data само дерево ответа($(xml)).
$xx = $(xml);
// ...

// и в обработчике нажатия кнопки:
var id = $(что то).val(); //22098 
var res2 = null;
var res = $xx.find('#' . id);
if (res.length) {
 res2 = res.closest('page').attr('id') * 2;
}
alert(res2);

vladvk 15.03.2011 19:34

И так и сюк кручу а он зараза выдает
или null или undefined

vladvk 15.03.2011 19:49

Почемуто эта конструкция не срабатывает
if (res.length) {
 res2 = res.closest('page').attr('id') * 2;
 alert (res2);
}

vladvk 15.03.2011 20:36

Прикрутил калькулятор
при изменении количества выводится сумма
<td class="quantity"><input maxlength="2" size="11" type="text" name="kolihectvo_' + ids + '" id="kolihectvo_' + ids + '" value="1" onkeyup="countSumma(\'' + ids + '\')"></td>


function countSumma(ids) {
var sum = $("#cena_"+ids).val() * $("#kolihectvo_"+ids).val();
$("#summa_"+ids).val(+ sum );
}

vladvk 16.03.2011 22:35

Вот так работает
var res = $xx.find('#' + id);

vladvk 20.03.2011 14:44

ни чего не понимаю
пытаюсь отправить форму
$('#check').submit(function() { 
var aaa = $("kodtovar_" + ids).val();
$.post('check.php', {a: aaa}, function(data) {
  $('#my_form').html(data);

});
});


check.php
<?php 
//header("Content-type: text/html; charset=utf-8");
$a = $_POST[a];
echo $a;
?>

выводится пустая страница


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