Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   AJAX возвращение массива (https://javascript.ru/forum/jquery/16809-ajax-vozvrashhenie-massiva.html)

zeraid 23.04.2011 15:49

AJAX возвращение массива
 
Вот у меня есть аякс запрос:

setInterval(function() {
  $.ajax({
   type: "POST",
   url: "/mnemo_1.php",
   data: "cvet=dav_vod_k_1",
   dataType: "text",
   async: false,
   success: function (data){color = data;},
   error: function(){alert('Problem');}
 }).responseText;
}, 1000);


Возможно ли в этом запросе получать из файла php массив значений, сформированный в нем? Если да - то с точки зрения синтаксиса как реализовать.

walik 23.04.2011 19:14

JSON

zeraid 23.04.2011 19:21

Опишу ситуацию подробнее.

Вот содержимое пхп файла (к которому обращается аякс запрос):

$MASSIV["dav_vod_k_1"] = array("cvet"=>dav_vod_k_1($row1, 1), "znach"=>dav_vod_k_1($row1, 0));
$MASSIV["tem_ugaz_1"] = array("cvet"=>tem_ugaz_1($row1, 1), "znach"=>tem_ugaz_1($row1, 0));

return $MASSIV[];


То-есть пхп файл возвращает массив.

Этот массив передается соответственно сюда:


setInterval(function() {
  $.ajax({
   type: "POST",
   url: "/mnemo_1.php",
   data: "cvet=dav_vod_k_1",
   dataType: "text",
   async: false,
   success: function (data){color = data;},
   error: function(){alert('Problem');}
 }).responseText;
}, 1000);


То-есть в переменную data. Так вот как с ним работать дальше в JS???

walik 23.04.2011 19:30

ОЙ блин, тяжелый случай.
Почитайте про AJAX лучше.
JS получает то что выводится (echo, print, printf и т.д.) а не return.
$str = '"dav_vod_k_1":{"cvet":"'.dav_vod_k_1($row1, 1).'","znach":"'.dav_vod_k_1($row1, 0).'"},';
$str .= '"tem_ugaz_1":{"cvet": "'.tem_ugaz_1($row1, 1).'","znach":"'.tem_ugaz_1($row1, 0).'"}';
echo '({'.$str.'})';

А в JS уже пишите:
var obj = eval(data);

и обращаетесь так:
obj.dav_vod_k_1.cvet

Как то так короче.
Но почитайте получше про AJAX
Ну а потом и про JSON (ссылка выше)

zeraid 23.04.2011 21:24

про ajax прочитал все давно. Просто ни в одном источнике было написано что return тоже работает. На практике же нет.....

И я так опнел что вы предлагаете работать со строкой. Щас попробую разобратся.

walik 23.04.2011 21:32

вот простой пример JSON:
var str = '({"name":"Valik","age":"20","country":"Moldova"})'; // К примеру строка которая приходит от сервера
var user = eval(str); // Превращаем так сказать строку в объект
alert(user.name+', '+user.age+' лет, '+user.country); // Обращаемся к свойствам объекта

AlexBabievCom 01.06.2014 18:45

Цитата:

Сообщение от walik (Сообщение 101913)
вот простой пример JSON:
var str = '({"name":"Valik","age":"20","country":"Moldova"})'; // К примеру строка которая приходит от сервера
var user = eval(str); // Превращаем так сказать строку в объект
alert(user.name+', '+user.age+' лет, '+user.country); // Обращаемся к свойствам объекта

Здравствуйте.

У меня возвращается массив в виде JSON:

[
{"type":"email","subtype":"","contact":"9651139 383 @mail.ru","ext":""},
{"type":"email","subtype":null,"contact":"alex@ bab iev.com","ext":""},
{"type":"tel","subtype":"","contact":"123","ext ":" "},
{"type":"tel","subtype":"","contact":"123","ext ":" "}
]

Я его обрабатываю так: var contacts = eval(str)
Попробовал по аналогии обратиться к значениям так alert(contacts.type);

Но я получаю undefined. Массим многомерный. Обычно с массивами я работаю так contacts[ключ][ключ], но с JS имею дело крайне редко и не могу понять как надо работать с объектами.

Подскажите как обращаться к этим элементам?
Например, если я хочу обратиться к этим значениям: {"type":"tel","subtype":"","contact":"123","ext ":" "}, то как мне это нужно сделать ?

Sweet 01.06.2014 18:57

Во-первых, не нужно использовать eval. Для разбора json есть специальный метод: JSON.parse. Например, такой код упадет с синтаксической ошибкой:
eval('{"type":"tel","subtype":"","contact":"123","ext ":" "}')

Во-вторых, если запрос
Цитата:

Сообщение от AlexBabievCom
возвращается массив

, то и перебирай его как массив: либо в цикле for, либо с помощью метода .forEach.

Sweet 01.06.2014 18:59

Цитата:

Сообщение от AlexBabievCom
Обычно с массивами я работаю так contacts[ключ][ключ]

В js так работают с объектами. А с массивами - contacts[индекс].
Т.е. в твоём случае так:
alert(contacts[0].type);

Vlasenko Fedor 01.06.2014 19:00

var data = [{
    "type": "email",
    "subtype": "",
    "contact": "9651139 383 @mail.ru",
    "ext": ""
  }, {
    "type": "email",
    "subtype": null,
    "contact": "alex@ bab iev.com",
    "ext": ""
  }, {
    "type": "tel",
    "subtype": "",
    "contact": "123",
    "ext ": " "
  }, {
    "type": "tel",
    "subtype": "",
    "contact": "123",
    "ext ": " "
  }];

  for (var el, i = 0; i < data.length; i++) {
    el = data[i];
    alert(el.type + "\r\n" + el.subtype + "\r\n" + el.contact + "\r\n" + el.ext);
  }

AlexBabievCom 01.06.2014 22:02

Цитата:

Сообщение от walik (Сообщение 101913)
вот простой пример JSON:
var str = '({"name":"Valik","age":"20","country":"Moldova"})'; // К примеру строка которая приходит от сервера
var user = eval(str); // Превращаем так сказать строку в объект
alert(user.name+', '+user.age+' лет, '+user.country); // Обращаемся к свойствам объекта

Цитата:

Сообщение от Sweet (Сообщение 314299)
В js так работают с объектами. А с массивами - contacts[индекс].
Т.е. в твоём случае так:
alert(contacts[0].type);

Огромное спасибо за помощь!

AlexBabievCom 01.06.2014 22:02

Цитата:

Сообщение от walik (Сообщение 101913)
вот простой пример JSON:
var str = '({"name":"Valik","age":"20","country":"Moldova"})'; // К примеру строка которая приходит от сервера
var user = eval(str); // Превращаем так сказать строку в объект
alert(user.name+', '+user.age+' лет, '+user.country); // Обращаемся к свойствам объекта

Цитата:

Сообщение от Poznakomlus (Сообщение 314300)
var data = [{
    "type": "email",
    "subtype": "",
    "contact": "9651139 383 @mail.ru",
    "ext": ""
  }, {
    "type": "email",
    "subtype": null,
    "contact": "alex@ bab iev.com",
    "ext": ""
  }, {
    "type": "tel",
    "subtype": "",
    "contact": "123",
    "ext ": " "
  }, {
    "type": "tel",
    "subtype": "",
    "contact": "123",
    "ext ": " "
  }];

  for (var el, i = 0; i < data.length; i++) {
    el = data[i];
    alert(el.type + "\r\n" + el.subtype + "\r\n" + el.contact + "\r\n" + el.ext);
  }

Огромное спасибо за помощь!

AlexBabievCom 01.06.2014 22:28

Цитата:

Сообщение от Poznakomlus (Сообщение 314300)
var data = [{
    "type": "email",
    "subtype": "",
    "contact": "9651139 383 @mail.ru",
    "ext": ""
  }, {
    "type": "email",
    "subtype": null,
    "contact": "alex@ bab iev.com",
    "ext": ""
  }, {
    "type": "tel",
    "subtype": "",
    "contact": "123",
    "ext ": " "
  }, {
    "type": "tel",
    "subtype": "",
    "contact": "123",
    "ext ": " "
  }];

  for (var el, i = 0; i < data.length; i++) {
    el = data[i];
    alert(el.type + "\r\n" + el.subtype + "\r\n" + el.contact + "\r\n" + el.ext);
  }

Интересно... когда я запускаю этот код, то все ок. Когда я делаю так:

ajax({
		   url:"/contacts.php?addrbook="+addrbook_uid,
		   method:"POST",
		   data:
		   {
		   		//first_area:document.getElementById("area_1").value,
		   		//second_area:document.getElementById("area_2").value
		  },
		   success: 
		   	function(data){
		   		//document.getElementById("status").innerHTML=data; 
		   		alert(data);
		   		for (var el, i = 0; i < data.length; i++) {
					el = data[i];
					alert(el.type + "\r\n" + el.subtype + "\r\n" + el.contact + "\r\n" + el.ext);
  				}
		  	}
		});


то получается вместо значений выводит UNDEFINED.

функция ajax тут http://i.babiev.com/js/ajax.js

почему такое может быть?

Vlasenko Fedor 01.06.2014 22:40

добавь

dataType: "json",

reno4 15.06.2016 00:48

Цитата:

Сообщение от walik (Сообщение 101900)
ОЙ блин, тяжелый случай.
Почитайте про AJAX лучше.
JS получает то что выводится (echo, print, printf и т.д.) а не return.
$str = '"dav_vod_k_1":{"cvet":"'.dav_vod_k_1($row1, 1).'","znach":"'.dav_vod_k_1($row1, 0).'"},';
$str .= '"tem_ugaz_1":{"cvet": "'.tem_ugaz_1($row1, 1).'","znach":"'.tem_ugaz_1($row1, 0).'"}';
echo '({'.$str.'})';

А в JS уже пишите:
var obj = eval(data);

и обращаетесь так:
obj.dav_vod_k_1.cvet

Как то так короче.
Но почитайте получше про AJAX
Ну а потом и про JSON (ссылка выше)

Мда. Красиво сказано. Но работать не будет. Тем более, переменную, которая объявлена внутри AJAX, снаружи вообще никто не увидит. А те переменные, которые объявлены снаружи, внутри AJAX модифицировать бесполезно - снаружи эти изменения тоже никто не увидит!

laimas 15.06.2016 05:46

Цитата:

Сообщение от reno4
Красиво сказано


Это вряд ли. Если вы сами собираетесь формировать JSON, значит нужно соблюдать соглашения. Самому же заниматься этим в рамках РНР/Javasript нет необходимости, и там, и там для этого уже есть готовое корректно выполняющее данную операцию.


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