我有以下ajax调用,它在Firefox和Chrome中完美运行,但不适用于IE:
function getAJAXdates( startDate, numberOfNights, opts ) {
var month = startDate.getMonth() + 1;
var day = startDate.getDate();
var year = startDate.getFullYear();
var d = new Date();
var randNum = Math.floor(Math.random()*100000000);
$.ajax({
type : "GET",
dataType : "json",
url : "/availability/ajax/bookings?rand="+randNum,
cache : false,
data : 'month='+month+'&day='+day+'&year='+year+'&nights='+numberOfNights,
contentType : 'application/json; charset=utf8',
success : function(data) {
console.log('@data: '+data);
insertCellData(data, opts, startDate);
},
error:function(xhr, status, errorThrown) {
console.log('@Error: '+errorThrown);
console.log('@Status: '+status);
console.log('@Status Text: '+xhr.statusText);
}
});
}
我知道所有变量都传递了正确的内容,$ .ajax确实传递了所有参数/值。
这是我得到的错误:
日志:@Error:未定义 日志:@Status:parsererror 日志:@Status文字:好的
我知道IE上的缓存问题,并实施了一个随机参数来清除它。
这是我回来的JSON(我能用Charles查看)
{
"availability":[
{
"inventory_id":"5",
"booking_id":"21",
"start_date":"05-01-2010",
"number_nights":4,
"text":"deFrancisco, Martin - $500.00 ACTIVE",
"type":"BOOKING"
}
]
}
最后,这些是从后端发回的标头:
header('Content-Type: application/json; charset=utf8');
header("Cache-Control: no-cache");
header("Expires: 0");
header('Access-Control-Max-Age: 3628800');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
有什么想法吗?
答案 0 :(得分:4)
我会注释掉contentType并添加dataType:“json”
来自http://api.jquery.com/jQuery.ajax/
dataType:您期望从服务器返回的数据类型。
contentType:将数据发送到服务器时,请使用此内容类型。
你指的是你要发送json,但你不是 - 也许这就是问题?
答案 1 :(得分:1)
大多数情况下,IE特定的解析错误是由额外的逗号引起的。例如,[1, 2, 3,]
在FF中有效,但在IE中无效。无论如何,你应该粘贴JSON响应,没有它就不可能说出问题。
答案 2 :(得分:1)
我也遇到过与$ .ajax()(jquery v1.4.2)有些类似的问题。它在IE8中不起作用,而在Firefox中则起作用。
但是,我从IE8调试工具栏中注意到我的页面处于怪异模式。因此,我通过插入此doctype <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
强制使其在标准模式下工作。突然$ .ajax()有效!
我对quirks /标准模式并不是很了解,但“标准”这个词在某种程度上更接近于Firefox或Chrome,而不是IE。这就是我的想法。
答案 3 :(得分:0)
检查您的网页是返回OK
还是返回'OK'
。只有'OK'
是有效的JSON。使用JSONLint之类的工具检查来自请求的值。
答案 4 :(得分:0)
如果只输入alert(data);
或var myObject = eval('(' + data + ')');
?
如果你直接从浏览器调用这个函数,你可以在url栏上输入你的ajax调用,其中包含“get”中的所有参数(&amp; param1 = param1value&amp; param2 = ...)?您应该能够阅读回复。
JSON响应中的某些东西让IE变得疯狂。
答案 5 :(得分:0)
您使用的是哪个版本的jQuery?
如果检查jquery的代码,则在调用jQuery.httpData()时抛出parsererror。这是来自jquery的代码:
if ( status === "success" ) {
// Watch for, and catch, XML document parse errors
try {
// process the data (runs the xml through httpData regardless of callback)
data = jQuery.httpData( xhr, s.dataType, s );
} catch(err) {
status = "parsererror";
errMsg = err;
}
}
也许jQuery.httpData()值得一看。也就是说,您可以检查是否调用了jQuery.parseJSON以及它是否确实返回了一个对象。
if ( typeof data === "string" ) {
// Get the JavaScript object, if JSON is used.
if ( type === "json" || !type && ct.indexOf("json") >= 0 ) {
console.log(data); //add this
data = jQuery.parseJSON( data );
console.log("data parsed successfully"); //add this