3

В принципе, у меня есть что-то вроде этого:

$.ajax({ 
    type: "GET", 
    url: "my_url", 
      cache: true,     
      success: function(data) { 
       /* code here */ 
      }, 
     dataType: 'json' 
}); 

Этот код работает во всех тестируемых браузерах (IE7/8, Chrome, Safari, Firefox), но в IE6 успеха функция не вызывается.

Я использовал Fiddler, чтобы посмотреть, что происходит в HTTP-запросах, и все выглядит нормально, я получаю ожидаемый результат как HTTP-ответ, но успех, похоже, не вызван в IE6, то же самое для onerror.

Любые мысли?

ответ

1

Вы уверены, что это не просто кеш? Удалите кеш браузера и повторите проверку.

Хороший тестовый пример избавит вас от опции «кеш», а также сделает запрос POST (поскольку GET-вызовы ajax всегда кэшируются в ie6).

+0

Если скрипт показывает, был отправлен запрос HTTP, это означает, –

+0

Предоставление обстоятельств, мой вызов ajax не работает, если я использую POST или я удаляю «cache: true», и у меня нет никакого контроля над кодированием на стороне сервера. –

+0

Не могли бы вы объяснить, почему POST и/или кеширование делают ваш вызов AJAX неработоспособным? –

0

Что произойдет, если вы добавите функцию сбоя и оповещаете об этом в ответном тексте?

$.ajax({ 
     type: "GET", 
     url: "my_url", 
     cache: true, 
     success: function(data) { 
       /* code here */ 
      }, 
     error: function(data) { 
       alert(data.responseText); 
      }, 
     dataType: 'json'}); 

http://docs.jquery.com/Ajax/jQuery.ajax#options

+0

Я просто попробовал, он не показывает сообщение. –

+0

Извините, я неправильно назвал параметр функции ошибки. Должна быть ошибка: function (data) - я отредактировал выше, чтобы отразить это –

+0

такое же поведение и с ошибкой. :) –

1

Вы не упоминаем код на стороне сервера, который вы используете. У меня возникли проблемы с вызовами jQuery AJAX в IE при использовании ASP.NET на стороне сервера (обработчик ashx). Они ушли, когда я полностью прочитал запрос, прежде чем начать писать ответ (хотя в моем случае я использовал POST, а не запрос GET, поэтому тело запроса содержало некоторые данные).

Я написал следующий простой проект ASP.NET, чтобы протестировать вашу проблему в IE6. Однако я не могу воспроизвести (IE6 SP2 работает на виртуальной машине, поражая IIS 7.5). Не могли бы вы попробовать запустить его в своей среде и сообщить, работает ли он с IE6 для вас?

Примечание: Иногда, когда я очистил кэш IE6 и закомментировать строку «SetCacheability» в ashx.cs, первый клик на кнопку «Отправить» будет не показывать окно предупреждения успеха, хотя последующие щелчки сделал это показать. Возможно, все, что вам нужно, добавляет заголовки «no-cache» в ответ на вызов в вашей реализации?

файл index.html

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <title>AJAX GET test</title> 
    </head> 
    <body> 
     <input type="button" id="test" value="Send" /> 
     <script type="text/javascript" src="jquery-1.3.2.min.js"></script> 
     <script type="text/javascript"> 
      $("#test").click(function() { 
       $.ajax({ 
        url: "Api.ashx?param=one", 
        cache: true, 
        type: "GET", 
        dataType: "json", 
        success: function (data) { 
         alert("Success, result = " + data.result); 
        }, 
        error: function (request, status, err) { 
         alert("Error"); 
        } 
       }); 
      }); 
     </script> 
    </body> 
</html> 

файл Api.ashx

<%@ WebHandler Language="C#" CodeBehind="Api.ashx.cs" Class="AjaxTest.Api" %> 

файл Api.ashx.cs

using System.Diagnostics; 
using System.Text; 
using System.Web; 

namespace AjaxTest 
{ 
    public class Api : IHttpHandler 
    { 
     public bool IsReusable { get { return true; } } 
     public void ProcessRequest(HttpContext context) 
     { 
      var param = context.Request["param"]; // this flushes the request 
      Trace.WriteLine("Request: \"" + context.Request.RawUrl + "\", param: \"" + param + "\"", "** Debug"); 
      context.Response.StatusCode = 200; 
      context.Response.ContentType = "application/json"; 
      context.Response.ContentEncoding = Encoding.UTF8; 
      context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
      context.Response.Write("{\"result\":\"" + param + "\"}"); 
     } 
    } 
} 
2

Попробуйте использовать complete вместо success. Если он постоянно горит, вы можете оценить код состояния, чтобы определить, было ли это успешным ...

$.ajax({ 
    type: "GET", 
    cache: true, 
    complete: function(xhr) { 
    if(xhr.status != 200) { 
     throw "Error!"; 
     return; 
    } 

    var data = xhr.responseText; 
    } 
}); 
+0

Кажется, что xhr не определено в полном объеме, во всяком случае, я пробовал с 'alert ('complete')', и он не срабатывает. –

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