jquery.form.min.js的ajaxSubmit上传Excel文件,后台返回不是标准json格式回调函数中 textstatus报错parsererror

今天发现在返回值正确的情况下,ajax走error方法,没有走success方法,使用以下方法自测

原代码:
$.ajax({
url: environment.serverUrl + '/questionClassify/modify',
type: 'put',
data: JSON.stringify(body),
async: false,
// 返回的数据类型是json
dataType: 'application/json',
contentType: 'application/json;charset=UTF-8',
success: function (data) {
alert(data.message);
},
error: function (data) {
alert(data.responseText);
}
});

自测修改代码:
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}

运行结果:

alert(XMLHttpRequest.status); // 弹出 200 正常
alert(XMLHttpRequest.readyState); // 弹出 4 正常
alert(textStatus); // 弹出parsererror错误
alert(XMLHttpRequest.status); // 弹出 200 正常 alert(XMLHttpRequest.readyState); // 弹出 4 正常 alert(textStatus); // 弹出parsererror错误


parsererror错误是返回类型错误,在原代码中dataType: ‘application/json’,我指定了返回值为json,所以后端一定要返回标准格式的json字符串,要不jquery1.4+以上版本会报错的,因为不是用eval生成对象了,用的JSON.parse,如果字符串不标准就会报错。

解决方法:

先把 dataType: 'application/json',注释掉
在 success:function(data,textStatus){
console.log(data);
观察显示的串是否符合 json 格式


最后发现返回的值的确是json格式,但不是标准json格式,所有报错,在下水准太低,不会转为标准格式,所有我就把dataType: ‘application/json’,彻底注释掉了,不指定返回值类型了。
---------------------
版权声明:本文为CSDN博主「郭满亮-Felix」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/G165945348/article/details/85226142

查看jquery.form.min.js 源码得知有三个方法

options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
        var context = options.context || this ;    // jQuery 1.4+ supports scope context
        for (var i=0, max=callbacks.length; i < max; i++) {
            callbacks[i].apply(context, [data, status, xhr || $form, $form]);
        }
    };

    if (options.error) {
        var oldError = options.error;
        options.error = function(xhr, status, error) {
            var context = options.context || this;
            oldError.apply(context, [xhr, status, error, $form]);
        };
    }

     if (options.complete) {
        var oldComplete = options.complete;
        options.complete = function(xhr, status) {
            var context = options.context || this;
            oldComplete.apply(context, [xhr, status, $form]);
        };
    }

所以应用 complete 函数做回调函数,如果后台返回的不是标准json格式 Status的值会是 parsererror
function deleteform(){
$('#addExcelForm'){
  url:"",
  type:"POST",
  timeout:10000,
  dataType:'json',
  complete:functioin(xhr,Status){
    if(Stauts=='success'){
      var respMessage = xhr.responseText;
      if(respMessage.indexOf("Message")!=-1){
      var message = $.parseJSON(respMessage)
      if(message.message="上传成功" ){alert (message.message+message.number)}
     }
    }
 }
}
}

//responseText 为后台传的json数据,可以解析出来做操作。



原文地址:https://www.cnblogs.com/sunny3158/p/11321783.html