jQuery $ .ajax не работает в IE8, но работает в FireFox и Chrome - PullRequest
6 голосов
/ 27 апреля 2010

У меня есть следующий вызов 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 действительно передает все параметры / значения.

Вот что я получаю по ошибке:

LOG: @Error: undefined LOG: @Status: parsererror LOG: @Status Text: OK

Мне известно о проблеме с кешем в IE, и для ее устранения был реализован случайный параметр.

Вот JSON, который я получаю (я могу видеть его, используя Чарльза)

{
   "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');

Есть идеи?

Ответы [ 6 ]

4 голосов
/ 27 апреля 2010

Я бы закомментировал contentType и добавил dataType: "json"

из http://api.jquery.com/jQuery.ajax/

dataType: Тип данных, которые вы ожидаете от сервера.

contentType: При отправке данных на сервер используйте этот тип контента.

вы указываете, что отправляете json, но не- может быть, это проблема?

1 голос
/ 20 августа 2010

Я также столкнулся с несколько похожей проблемой с $ .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

1 голос
/ 27 апреля 2010

В большинстве случаев ошибки синтаксического анализа, связанные с IE, вызваны лишними запятыми. Например, [1, 2, 3,] допустимо в FF, но не в IE. В любом случае, вы должны вставить ответ JSON, без этого невозможно определить проблему.

0 голосов
/ 27 апреля 2010

Какую версию jQuery вы используете?

Если вы проверяете код jquery, parsererror генерируется при вызове jQuery.httpData (). Вот код из 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
0 голосов
/ 27 апреля 2010

Что если вы просто наберете alert(data); или var myObject = eval('(' + data + ')');?

А если вы вызываете функцию непосредственно из браузера, набрав в строке URL свой ajax-вызов со всеми параметрами в "get" (& param1 = param1value & param2 = ...)? Вы должны быть в состоянии прочитать ответ.

Что-то в ответе JSON сводит IE с ума.

0 голосов
/ 27 апреля 2010

Проверьте, вернется ли ваша страница OK или 'OK'. Только 'OK' является действительным JSON. Используйте инструмент типа JSONLint , чтобы проверить значение, полученное из запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...