2010-04-27 3 views
6

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

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

LOG: @error не определен LOG: @Status: parsererror LOG: @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'); 

Любые идеи?

ответ

4

я закомментируйте CONTENTTYPE и добавить DATATYPE: «JSon»

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

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

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

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

+0

Я добавил contentType, чтобы узнать, разрешает ли он проблему, но она не работает даже без нее. спасибо – Sam3k

1

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

+0

объект JSON, кажется, хорошо. Я добавил его в свой первоначальный вопрос, чтобы вы могли взглянуть. – Sam3k

0

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

+0

JSON прошел тест JSONLint. Я получаю сообщение «HTTP/1.1 200 OK» – Sam3k

0

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

И если вы вызываете функцию непосредственно из браузера, набрав в строке URL вашего АЯКС вызов со всеми параметрами «получить» (& param1 = param1value & param2 = ...)? Вы должны уметь читать ответ.

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

0

Какую версию 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 
1

Я также столкнулся с некоторой аналогичной проблемой с $ .ajax() (jquery v1.4.2). Он не работает в IE8, тогда как в Firefox он работает.

Однако, я заметил из панели инструментов отладки IE8, что моя страница находится в режиме quirks. Итак, я решительно заставляю его работать в стандартном режиме, вставив этот doctype <!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

Смежные вопросы