Ajax - зачем использовать JSON.parse (data) с dataType в $ .post () - PullRequest
0 голосов
/ 13 сентября 2018

Я использую ajax для динамического заполнения таблицы данных.

Вот код:

Javascript:

  $.post("/import_data.php", {add: new_row}, "json").done(function(data){
    data = JSON.parse(data);

    if (data[0] === 'example_1') {
      .....
      $("#error_1").modal("show");
    }
    else if (data[0] === 'example_2') {
      .....
      $("#error_2").modal("show");
    }
    else {
      table.row.add(data).order([0, 'desc']).draw();
    } 
  });

PHP (import_data.php):

 ...    
 $arr = array('info1', 'info2', 'info3', 'info4');
 echo json_encode($arr);

Но есть кое-что, что я не понимаю, почему я должен использовать строку JSON.parse (data), это не работа dataType или естьпроблема в моем коде?

Как я могу улучшить свой скрипт?

РЕДАКТИРОВАТЬ:

Console.log (data) - до JSON.parse (data):

["super","1","220","example"]

После JSON.parse (data):

(4) ["super", "1", "220", "example"]
0: "super"
1: "1"
2: "220"
3: "example"
length: 4
__proto__: Array(0)

Если я не поставлю JSON.parse(data) Вместо того, чтобы взять мне элемент super, онзабирает меня [

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

если вы запрашиваете $.post, то сначала вам требуется массив json для разбора, а затем получите значение массива. в противном случае вы можете использовать ajax-вызов, это лучше, и вам не нужно требовать Json.parse напрямую, вы можете получить значение массива.

пример:

 $.ajax({
        type: 'POST',
        url: "your url",
        dataType: 'json',
        data: {data: value},
        success: function (data) {
            alert(data[0])
            console.log(data[0]);
            //data = JSON.parse(data);
        },

=> Проверьте и попробуйте это.

0 голосов
/ 13 сентября 2018

Я потрясен, обнаружив, что данные не анализируются при передаче в обратный вызов done, когда вы полагаетесь на параметр dataType (я повторил вашу проблему локально) в вашем примере. Это потому, что jQuery $.post требует, чтобы вы передавали аргумент для параметра success, если вы собираетесь включить параметр dataType; см. ответ Адитьи Шармы с цитатой из документов об этом.

Вы все равно не должны полагаться на параметр dataType; вместо этого ваш PHP должен возвращать правильный заголовок Content-Type:

<!-- language: lang-php -->
<?php
header("Content-Type: application/json");
$arr = array('info1', 'info2', 'info3', 'info4');
echo json_encode($arr);

Если вы сделаете это, ваш $.post вызов будет работать нормально ( без JSON.parse вызова).

Если по какой-то причине вы не можете этого сделать, используйте обратный вызов успеха вместо done (или передайте null в качестве параметра success и продолжайте использовать .done); jQuery проанализирует JSON для вас из-за параметра "json":

<!-- language: lang-js -->
$.post("temp.php", {add: new_row}, function(data) {
    // ...
}, "json");

// or
$.post("temp.php", {add: new_row}, null, "json").done(function(data) {
    // ...
}, "json");

... а затем, опять же, нет необходимости в JSON.parse вызове.

Но, опять же, лучше, если PHP правильно определит тип ответа.

0 голосов
/ 13 сентября 2018

Последовательность dataType неверна.

jQuery.post (url [, data] [, success] [, dataType])

Согласно официальному doc .

Функция обратного вызова, которая выполняется в случае успешного выполнения запроса.Требуется, если указан dataType, но в этом случае может быть нулевым.

Попробуйте это

$.post("/import_data.php", {add: new_row}, function(data){

    if (data[0] === 'example_1') {
      .....
      $("#error_1").modal("show");
    }
    else if (data[0] === 'example_2') {
      .....
      $("#error_2").modal("show");
    }
    else {
      table.row.add(data).order([0, 'desc']).draw();
    } 
}, "json");

Или попробуйте установить обратный вызов на неопределенное значение

$.post("/import_data.php", {add: new_row}, null, "json").done(function(data){
    data = JSON.parse(data);

    if (data[0] === 'example_1') {
      .....
      $("#error_1").modal("show");
    }
    else if (data[0] === 'example_2') {
      .....
      $("#error_2").modal("show");
    }
    else {
      table.row.add(data).order([0, 'desc']).draw();
    } 
  });

Проверкаэто скрипка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...