$ .ajax не работает должным образом на IE6 - PullRequest
3 голосов
/ 23 декабря 2009

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

$.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.

Есть мысли?

Ответы [ 4 ]

2 голосов
/ 23 декабря 2009

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

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

    var data = xhr.responseText;
  }
});
1 голос
/ 23 декабря 2009

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

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

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

файл 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" %>

file 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 + "\"}");
        }
    }
}
1 голос
/ 23 декабря 2009

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

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

0 голосов
/ 23 декабря 2009

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

$.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

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