jQuery ajax返回意外的数据类型

时间:2013-09-10 22:10:39

标签: php javascript jquery ajax arrays

尝试在非常有用的“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)之外的例程中都显示'object'和alert(formErrors)给出与上面相同的逗号列表,但我不想要一个对象,我期待一个数组或者我对一个对象感到满意,只要我可以通过索引访问它。我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

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

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

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

return json_encode( $result );

因为我:

dataType: JSON
在jQuery.ajax()调用中的

参数,这会导致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。