jQuery ajax 返回意外的数据类型


jQuery ajax returning unexpected data type

试图在非常有用的"handsontable"jscript库中实现一些服务器端错误检查。

以下调用效果很好:

jQuery.ajax({
    url: "index.php?option=com_catalogscontroller=batchsave",
    data: {"formData": querydata.getData().splice( 0, 1 ) },
    dataType: 'JSON',
type: 'POST',
    success: function ( response ) {
    if( response.success ) {
    } else {
    querydata.loadData( response.data );
    }
}
});

我认为进行错误检查的最有效方法是在服务器(PHP)端,创建一个多维数组来跟踪服务器发现的任何错误,然后在同一个ajax调用中返回该数组和表单数据。所以我修改了服务器代码,将表单数据和错误数组都返回到javascript ajax调用。即:

if( !empty( $errors ) ) // $errors is an multi dimensional array same size as the form data
    $result['success'] = false;
    $result['msg'] = 'There were errors detected';
    $result['data']['form'] = $formData;
    $result['data']['errors'] = $errors;
}
echo json_encode( $result );

然后在客户端,上面的 JavaScript 例程被修改为:

jQuery.ajax({
    url: "index.php?option=com_catalogscontroller=batchsave",
    data: {"formData": querydata.getData().splice( 0, 1 ) },
    dataType: 'JSON',
    type: 'POST',
    success: function ( response ) {
    if( response.success ) {
    } else {
            formErrors = response.data.errors; // formErrors is a global
    querydata.loadData( response.data.form );
    }
}
});
表单

的原始功能被保留(表单数据被检索并正确插入 html),但 formErrors 返回的结果让我感到困惑。紧跟在赋值"alert( formErrors )"之后的警报显示类似于列表的内容:

true,true,false,true,true

我还可以对特定索引发出警报而没有问题,例如 alert( formErrors[0][2] ); 将显示"false"。但是在 ajax 调用之外,数组似乎无法访问,从而给出"未定义"的错误。在 ajax 调用和 ajax 调用之外的例程中 alert( typeof formErrors ) 显示"对象",alert( formErrors) 给出与上面相同的逗号列表,但我不想要一个对象,我期待一个数组,或者只要我可以通过索引访问它,我就会对一个对象感到满意。我在这里错过了什么?

我遇到的问题似乎集中在 JSON 上。

大多数文档都确定了在支持 Javascript AJAX 调用的 php 例程中对 JSON 变量的要求。使用jQuery.ajax调用减轻了一些需求,但是如果你不知道自己在做什么(像我一样),很容易遇到麻烦。

我的 php 例程 JSON 使用以下语句对完整的响应记录进行编码:

return json_encode( $result );

因为我:

dataType: JSON

参数,这将导致 PHP 例程返回给 jQuery javascript 函数的结果的自动 json.parse()。但是,这并不成功,因为服务器代码中的 php json_encode调用不是递归的,因此当结果数组被解码时,该结果中的任何数组都不是。

然后,解决方案是对多维数组的组件进行 JSON 编码,然后在客户端对其进行解码。

if( !empty( $errors ) ) 
    $result['success'] = false;
    $result['msg'] = 'There were errors detected';
    $result['data']['form'] = json_encode( $formData );
    $result['data']['errors'] = json_encode( $errors );
}
echo json_encode( $result );

然后在客户端,专门解析(解码)这些数组:

jQuery.ajax({
    url: "index.php?option=com_catalogscontroller=batchsave",
    data: {"formData": querydata.getData().splice( 0, 1 ) },
    dataType: 'JSON',
    type: 'POST',
    success: function ( response ) {
        if( response.success ) {
        } else {
            formErrors = JSON.parse( response.data.errors ); // formErrors is a global
            querydata.loadData( JSON.parse( response.data.form ) );
        }
    }
});

坦率地承认,我真的不知道自己在做什么,但是上面构建的代码似乎对我为解释它而开发的逻辑是有意义的,并且它对我有用。无论如何,再次感谢Nathan和pdoherty926。