Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.02.2015, 08:56
Аспирант
Отправить личное сообщение для 1lider Посмотреть профиль Найти все сообщения от 1lider
 
Регистрация: 12.04.2013
Сообщений: 86

Вставка json данных
Добрый день. Вчера читал документацию по XMLHttpRequest. Нацарапал небольшой код. Не могу получить от сервера нормальную JSON строку и вывести её на страницу. В 43 и 44 строках кода, надо явно что-то переписать.


Скрипт JS:
var MyRequest = function(options) {
	options = {
		type: options.type.toUpperCase() || 'POST',
		url: options.url || '',
		dataType: options.dataType.toUpperCase() || 'HTML',
		param: options.param || '',
		success: options.success || function(){},
		error: options.error || function(){}
	}
	var xhr;
	var rand = Math.floor(Math.random( )*(9999999+1));
	if (window.XMLHttpRequest) {
        try { xhr = new XMLHttpRequest(); }
		catch (e){}
    } else if (window.ActiveXObject) {
		try { xhr = new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
		catch(e) {}
		try { xhr = new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
		catch(e) {}
		try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); }
		catch(e) {}
		try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); }
		catch(e) {}
	}
	xhr.open(options.type, options.url, true);
	if(options.dataType == 'HTML') {
		xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
	} else if(options.dataType == 'JSON') {
		xhr.setRequestHeader('Content-Type', 'application/json;charset=utf-8');
	}
	xhr.send(encodeURIComponent(options.param));
	xhr.onreadystatechange = function() {
		if(xhr.readyState == 4) {
			if(xhr.status == 200) {
				if(options.dataType == 'HTML') {
					return options.success(xhr.responseText);
				} else if(options.dataType == 'JSON') {
					// ЗДЕСЬ НАДО ЧТО-ТО ИСПРАВЛЯТЬ
					// ЗДЕСЬ НАДО ЧТО-ТО ИСПРАВЛЯТЬ
					// ЗДЕСЬ НАДО ЧТО-ТО ИСПРАВЛЯТЬ
					// alert(data) выдаёт 1234
					// alert(data.result) выдаёт undefined
					eval('var data = ('+xhr.responseText+')');
					return options.success(data);
				}
			} else {
				return options.error(xhr.statusText);
			}
		}
	}	
}
function get_data() {
	MyRequest({
		type: 'GET',
		dataType: 'JSON',
		url: '/my_result.php',
		success: function(data) {
			alert(data.result); // выдаёт undefined
		}, error: function(data) {
			alert("ERROR");
		}
	});
}


Файл my_result.php:
<?php
// так как тестирую именно json, то сразу делаю так:
echo json_encode(array('result'=>'1234'));
?>
Ответить с цитированием
  #2 (permalink)  
Старый 13.02.2015, 22:07
Кандидат Javascript-наук
Отправить личное сообщение для Brutus Посмотреть профиль Найти все сообщения от Brutus
 
Регистрация: 24.11.2013
Сообщений: 127

http://learn.javascript.ru/play/q5Cwk

Совет: Не начинай писать что-то больше 10 строк пока не изучишь всю теорию по вопросу
Ответить с цитированием
  #3 (permalink)  
Старый 14.02.2015, 08:10
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

// так как тестирую именно json, то сразу делаю так:
echo json_encode(array('result'=>'1234'));

Это зря. 1234, это число, не строка, и используйте опции json_encode, в частности JSON_NUMERIC_CHECK, чтобы на клиенте получить {12:'txt'} и {'result':1234}, а не {'12':'txt'} и {'result':'1234'}, что может быть важным для клиента.
Ответить с цитированием
  #4 (permalink)  
Старый 14.02.2015, 19:11
Кандидат Javascript-наук
Отправить личное сообщение для Brutus Посмотреть профиль Найти все сообщения от Brutus
 
Регистрация: 24.11.2013
Сообщений: 127

laimas,
Чувак {12:"txt"} не может быть это же объект, а вот {"result":1234} выйдет в случае если убрать кавычки json_encode(array('result'=>1234));

В доказательство первого:
<script>
      try {
      	    JSON.parse('{12:"txt"}');
      }
      catch (e){
      	    alert(e);
      }
</script>



Да, и кавычки двойные быть должны если парсить не с помощью eval

Последний раз редактировалось Brutus, 14.02.2015 в 19:58.
Ответить с цитированием
  #5 (permalink)  
Старый 14.02.2015, 20:51
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989


Я знаю об именовании. Имел другое ввиду, хотел сказать типа о таком:
<?
if(isset($_POST['p'])) {
    echo json_encode(array(1=>'222', 3=>'Err', 4=>123));
    exit;
}
?>
<!DOCTYPE HTML> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<style>

</style> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
<script> 
$(function() {
    $('form').submit(function() {
        $.post(location, {p:1}, function(d) {
            try {
                d = window.JSON.parse(d);
                for(k in d) {
                    document.forms[0].elements[k-1].value = d[k]+1;
                }
            } catch (e) {
                  
            }    
        });
       return false;
    });   
});
</script>     
</head> 

<body>
<form>
<input /> <input /> <input /> <input />
<button>Send</button>
</form>
</body> 
</html>


но или не досмотрел, или...
Кавычки над данными типа number что-ли? Зачем?

Последний раз редактировалось laimas, 14.02.2015 в 21:11.
Ответить с цитированием
  #6 (permalink)  
Старый 14.02.2015, 21:18
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от 1lider
options.type.toUpperCase() || 'POST'
Не канает. Получается что если type не передать - кирдык.
Сообщение от 1lider
xhr.setRequestHeader('Content-Type', 'application/json;charset=utf-8');
Тут должен быть заголовок с типом данных, которые ты отсылаешь на сервер. А отсылаешь ты всегоа url-encoded, а нифига не JSON.

send поставь после onreadystatechange.

И на кой тебе поддержка IE6-7?
__________________
В личку только с интересными предложениями
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
APi Яндекс.Карт | Вставка данных из JSON запроса MasterDmx AJAX и COMET 1 10.11.2014 15:24
Сортировка JSON данных в цикле Fareastaz jQuery 12 15.03.2013 20:20
Двойная Фильтрация данных таблицы David0707 Общие вопросы Javascript 0 19.03.2012 13:00
Вставка данных в textarea из модального окна (для Markitup) Roman Koff jQuery 0 26.08.2010 23:21
Преобразование данных с сервера в JSON frolvict Общие вопросы Javascript 1 04.04.2010 12:26