我通过$.ajax()
方法提交表单。我的要求是这样的:
$.ajax(url, {
type: "POST",
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
dataType: "html json",
data: formData,
headers: {
"X-Requested-With": "XMLHttpRequest"
}
}).done(function (result) {
//handle correct json response or html response
}).fail(function (jqXHR, textStatus, errorThrown) {
console.log(jqXHR);
console.log(textStatus);
console.log(errorThrown.stack);
});
当服务器返回JSON响应时,所有响应都按预期进行。但是当响应为Html时,执行fail()
回调(响应的状态代码为200 - OK)和errorThrown.stack作为此值:
"SyntaxError: Unexpected token <
at Object.parse (native)
at jQuery.extend.parseJSON (http://localhost/Scripts/jquery-1.10.2.js:550:23)
at ajaxConvert (http://localhost/Scripts/jquery-1.10.2.js:8429:19)
at done (http://localhost/Scripts/jquery-1.10.2.js:8185:15)
at XMLHttpRequest.jQuery.ajaxTransport.send.callback (http://localhost/Scripts/jquery-1.10.2.js:8778:8)"
所以我认为它试图解析JSON而不是html。我不明白,因为我已将dataType
选项设置为"html json"
...
以下是有关请求/响应的一些信息:
请求标题
Accept:text/html, */*; q=0.01
Accept-Encoding:gzip,deflate
Accept-Language:pt-PT,pt;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Content-Length:2386
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With:XMLHttpRequest
响应标题
Cache-Control:private, s-maxage=0
Content-Length:56392
Content-Type:text/html; charset=utf-8
Date:Fri, 03 Oct 2014 09:52:13 GMT
Server:Microsoft-IIS/8.5
Vary:Accept-Encoding
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:4.0
X-Powered-By:ASP.NET
为什么会这样?
解决方案(基于@Oscar Bout回复)
$.ajax(url, {
type: "POST",
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
dataType: "html",
data: formData,
headers: {
"X-Requested-With": "XMLHttpRequest"
}
}).done(function (result) {
try {
var jsonResult = $.parseJSON(result);
//handle json result
} catch (e) {
$("#myDiv").html(result); //handle html result
}
}).fail(function (jqXHR, textStatus, errorThrown) {
console.log(jqXHR);
console.log(textStatus);
console.log(errorThrown.stack);
});
我认为使用try/catch
不是最好的方法,所以我正在听其他选项。
答案 0 :(得分:1)
您在dataType中所说的是“将html响应视为JSON”。
dateType函数中的2个值并不意味着它可以处理2种类型。 这意味着“将第一个视为第二个”。
所以这个错误很可悲。当html进来时,它被视为JSON。 解析那个并且很好......因为它不是JSON,但实际上HTML失败了。
该函数用于“语法正确json但带有html标题”。 您的回答可能是“语法正确html with html header”,因此“&lt;”在你的输出中。
也许对你来说,有一种方法可以使用 try {} catch(e){} 函数吗?
这里有dataType说明: http://api.jquery.com/jquery.ajax/