【问题标题】:jQuery $.ajax Not Working in IE8 but it works on FireFox & ChromejQuery $.ajax 在 IE8 中不工作,但在 FireFox 和 Chrome 上工作
【发布时间】:2011-02-12 21:34:15
【问题描述】:

我有以下 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 确实传递了所有参数/值。

这是我得到的错误:

日志:@错误:未定义 日志:@Status:解析器错误 日志:@Status 文本:OK

我知道 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');

有什么想法吗?

【问题讨论】:

    标签: javascript jquery ajax json internet-explorer


    【解决方案1】:

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

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

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

    contentType:向服务器发送数据时,使用这个content-type。

    您指定要发送 json,但您不是 - 也许这就是问题所在?

    【讨论】:

    • 我添加了 contentType 以查看它是否解决了问题,但即使没有它也无法正常工作。谢谢
    【解决方案2】:

    大多数情况下,特定于 IE 的解析错误是由多余的逗号引起的。例如,[1, 2, 3,] 在 FF 中有效,但在 IE 中无效。无论如何,您应该粘贴 JSON 响应,没有它就无法说明问题。

    【讨论】:

    • JSON 对象似乎没问题。我将它添加到我的原始问题中,以便您查看。
    【解决方案3】:

    我也遇到了与 $.ajax() (jquery v1.4.2) 有点类似的问题。它在 IE8 中不起作用,而在 Firefox 中却起作用。

    但是,我从 IE8 调试工具栏注意到我的页面处于怪异模式。因此,我通过插入此文档类型<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 强制使其在标准模式下工作。突然 $.ajax() 起作用了!

    我不太了解怪癖/标准模式,但“标准”这个词在某种程度上更接近 Firefox 或 Chrome,而不是 IE。这就是我的想法。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • JSON 通过了 JSONLint 测试。我得到一个“HTTP/1.1 200 OK”返回
      【解决方案5】:

      如果您只输入alert(data);var myObject = eval('(' + data + ')'); 会怎样?

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

      JSON 响应中的某些东西让 IE 发疯了。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-03
          相关资源
          最近更新 更多