繁体   English   中英

jQuery $ .ajax在IE8中不起作用,但它适用于FireFox和Chrome

[英]jQuery $.ajax Not Working in IE8 but it works on FireFox & Chrome

我有以下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');

有任何想法吗?

我会注释掉contentType并添加dataType:“json”

来自http://api.jquery.com/jQuery.ajax/

dataType: 您期望从服务器返回的数据类型。

contentType: 将数据发送到服务器时,请使用此内容类型。

你指的是你发送json,但你不是 - 也许这是问题?

大多数情况下,IE特定的解析错误是由额外的逗号引起的。 例如, [1, 2, 3,]在FF中有效,但在IE中无效。 无论如何,你应该粘贴JSON响应,没有它就不可能告诉问题。

我也遇到过与$ .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">强行使其在标准模式下工作<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 突然$ .ajax()有效!

我不太了解怪癖/标准模式,但“标准”这个词不知何故感觉更接近Firefox或Chrome,而不是IE。 这就是我的想法。

@see http://en.wikipedia.org/wiki/Quirks_mode

检查您的页面是否只返回OK或返回'OK' 只有'OK'才是有效的JSON。 使用JSONLint之类的工具检查来自请求的值。

如果只输入alert(data);怎么办? var myObject = eval('(' + data + ')');

如果你通过在url栏上输入你的ajax调用直接从浏览器调用函数,所有参数都在“get”中(&param1 = param1value&param2 = ...)? 您应该能够阅读回复。

JSON响应中的某些东西让IE变得疯狂。

你使用的是什么版本的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM