jquery $ .post - json - правильный способ отправки / получения входных данных (только на стороне клиента) - Задание с двумя вопросами - PullRequest
5 голосов
/ 23 августа 2010

Давайте представим, что у нас есть что-то вроде:

$.post('somescript.php', 'WHAT CAN WE PUT HERE?',
        function(replyData) {

1) По умолчанию третий аргумент метода $ .POST будет правильно читать ответ XMLResponse?Итак, зачем нам этот аргумент 'replyData'?Каковы причины, по которым мы можем иметь этот аргумент?

2) Второй аргумент принимает данные, которые будут отправлены.Хорошо.Я хотел бы использовать json, однако я не уверен, должен ли я использовать формат json для этого второго аргумента или для поля ввода, которое будет содержать эти данные?

ДополнительноПримечания: Данные будут поступать из поля ввода, и мне нужно отправить его через ajax-запрос $ .POST на сервер.Я собираюсь использовать функции php json encode и json decode.

Заранее спасибо, MEM

Ответы [ 4 ]

5 голосов
/ 23 августа 2010

Аргумент replyData содержит текст ответа, возвращаемого сервером, который вы можете затем манипулировать, чтобы отобразить на своей странице, убедиться, что серверная часть успешно обработала данные и т. Д. это (например, если вы не возвращаете никаких данных).

Данные, которые вы предоставляете (в формате JSON), все еще должны быть в форме строки запроса, например, param=value. Значение также необходимо правильно кодировать, используя encodeURIComponent () :

$.post('somescript.php', 'data='+encodeURIComponent(myJSON),
    function(replyData) {

Затем вы можете получить доступ к JSON в сценарии PHP через $ _ POST superglobal:

$data = json_decode($_POST['data']);

Однако JSON будет немного излишним для простого поля ввода. Редко использовать JSON вместо пар имя / значение для полей формы.

0 голосов
/ 23 августа 2010

В целом я согласен с Энди E , что если вы посмотрите на строку данных, которые будут опубликованы, они должны выглядеть как

'data='+encodeURIComponent(myJSON)

Я хочутолько чтобы понять, что на практике второй параметр $ .post используется в основном не в виде строки:

$.post('somescript.php', 'data='+encodeURIComponent(myJSON), ... );

, а в качестве объекта:

$.post('somescript.php', {data: myJSON}, ...);

Тогда вызов jQuery encodeURIComponent функционирует и создает строку 'data='+encodeURIComponent(myJSON) с учетом jQuery.param () внутри.Гораздо важнее понять, что для получения myJSON необходимо создать эту строку JSON с учетом некоторых функций кодирования JSON из объекта, который содержит данные, которые вы хотите опубликовать.Таким образом, на практике код будет выглядеть следующим образом:

$.post('somescript.php', { data: JSON.stringify(myObject) }, ...);

, где JSON.stringify - это функция JavaScript из json2.js, которую вы можете бесплатно загрузить с http://www.json.org/js.html.

0 голосов
/ 23 августа 2010

1) Третий аргумент - функция обратного вызова. Если вы предоставляете анонимную функцию, как в вашем примере, вам нужно назвать аргумент для доступа к ней. Если вы возвращаете структуру JSON, вы можете получить доступ к replyData.foo и т. Д.

2) Вы можете извлечь значения из вашей формы и построить структуру JSON.

var data = {};
data.threadid = $(form).find('input[name=threadid]').val();
data.commentid = $(form).find('input[name=commentid]').val();

$.post('somescript.php', data, function(replyData) { alert(replyData.foo); } );
0 голосов
/ 23 августа 2010

Я украл эту функцию из Drupal и исправил запятую в массивах и объектах, из-за которых Zend_Json_Server генерировал исключения.

    var toJson = function(v) {
  // typeof null == object so we check beforehand;
  if ( v == null ){
    return null;  
  }

  switch (typeof v) {
    case 'boolean':
      return v == true ? 'TRUE' : 'FALSE';
    case 'number':
      return v;
    case 'string':
      return '"'+ v +'"';
    case 'object':
      if ( !(v instanceof Array) ){
          var output = "{";
          for(i in v) {
            output = output + '"'+i+'"' + ":" + toJson(v[i]) + ",";
          }
          output = output.substr(0,output.length-1) + "}"; // Fix the trailing comma error wich isn't officialy allowed.
      }else{
          var output = "[";
          for(i in v) {
            output = output + toJson(v[i]) + ",";
          }
          output = output.substr(0,output.length-1) + "]"; // Fix the trailing comma error wich isn't officialy allowed.
      }
      return output;
    default:
      return null;
  }
}

Теперь просто отправьте данные таким образом:

var myJsonString = toJson($('myform').serialize());

, который вернет строку json, сгенерированную из вашей переменной.Работает для большинства моих приложений.

...