2009-04-23 5 views
14

Я работаю над скриптом для загрузки некоторых асинхронных изображений с помощью jQuery.IE не запускает jQuery Ajax success

Вот фрагмент кода функции, которая загружает изображения -

try{ 
    for(img in imgsArray){ 
     $.ajax({  
      async: false, 
      type: "get", 
      url:imgsArray[img], 
      success:function(imgFile){ 
       alert("success"); 
       //do something useful 
      }, 
      error:function(XMLHttpRequest,status,error){ 
       //do nothing 
      } 
     });//ajax 
    } 
} 
catch(e){ 
    //oops 
} 

Я испытал это в Firefox, Webkit (Safari, Chrome), и она работает.

Изображения находятся в папке на сервере, и я использую jQuery 1.3.

любые идеи?

+0

Я полагаю, вы уже смотрели на ответ в Fiddler? Что вы там видите? –

+0

Выполняется ли функция ошибки? Вы должны поместить туда какой-то код, чтобы увидеть, что такое ошибка. – Damovisa

+0

Да, добавьте предупреждение в свой улов, чтобы узнать, не вызывает ли он ошибку. Также может захотеть изменить его на «GET», а не «получить» –

ответ

16

Простым решением этой проблемы является предоставление настроек jQuery dataType : 'text' или dataType : 'xml' или dataType : 'json' или любого другого доступного типа ответа.

У меня была такая же проблема, но она отлично работает после указания параметра dataType в.ajax-вызов.

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

Попробуйте ... удачи.

0

Я бы предложил использовать Charles Proxy, чтобы узнать, что происходит - т. Е. Является ли вообще вообще запрос? Каков ответ?

Кроме того, я думаю, что может быть какое-то исключение, поэтому почему бы вам не добавить некоторые предупреждения в разделе Catch, чтобы узнать, что происходит?

+0

Я поставил предупреждения в начале и в конце вызова ajax, а также в функции успеха и ошибки. Все они стреляли, кроме «успеха». Посмотрев на ответ, используя Fiddler, я обнаружил, что IE только возвращал 404 ответа. Так что в Firefox есть 202 и 404 ответа, но только 404 с IE. Я думаю, что это может быть модель безопасности IE и настройка моего сервера. – Peter

1

У меня были аналогичные проблемы с IE и AJAX за последние несколько дней с моей веб-службой JSONP. Даже самая маленькая ошибка в вашем коде может привести к разрыву в IE.

Возможно, самое лучшее, что нужно сделать, это отладить страницу в IE с помощью Visual Web Developer Express или Visual Studio. Вот учебник о том, как это сделать:

How to debug JavaScript with Visual Web Developer Express

Следуйте инструкциям, и, возможно, поставить точки останова в начале запроса AJAX.

Попробуйте эти вещи тоже:

  • Удаление «XMLHttpRequest» из поля ошибок, я никогда не использовал его раньше, и мой код работает нормально;
  • Убедитесь, что вы используете последнюю версию jQuery (1.3.2)?

Надеюсь, вы скоро это заработаете!

+0

Спасибо. Это отличный совет для отладки IE, особенно для IE6-7. Хотя я не поклонник функции отладки IE8, но это начало. Ответ на ошибку, похоже, в порядке, это просто не удастся. Я обновился до последней сборки jQuery. Это могут быть настройки моего сервера и межсайтовые скриптовые блоки IE или что-то в этом роде. Это динамическая веб-страница, построенная на стойках. В принципе, я хочу проверить, существует ли изображение на этом URL-адресе. – Peter

+0

Спасибо за предложения. – Peter

1

В конце концов мне пришлось создать отдельную функцию для браузеров IE.

Цель состояла в том, чтобы проверить изображение на месте, так что код выглядел что-то вроде -

//get the images from the array 
for(img in imgsArray){ 

    if($.browser.msie){  
    /* DOM manipulation method */ 
    //IE has problems with ajax so try this instead 
    //create a new image object with unique ID 
    var testImg = $("<img/>"); 
    var imgID = "imgID"+img; 

    //hide it.. 
    testImg .css({ "visibility":"hidden" }); 
    testImg .attr("src",imgsArray[img]); 
    testImg .attr("id",imgID); 

    //.. and insert it into the DOM or else test will always fail 
    //because it does not exist as far as browser is concerned 
    $("body").append(testImg); 

    //test for image 
    if(document.getElementById(imgID).width > 60){ 
     //do something useful 
    } 
} 

Это на самом деле не ответ на мой вопрос, но это функциональная работа вокруг.

7

У меня была аналогичная проблема - IE, похоже, вызывает сбой, если он не может проанализировать ответ как xml, даже если запрос был успешным, поэтому, если вы запрашиваете изображение, например, оно вернется a xhr.status из 200 в блоке ошибок.

Я закрепил свои «успешные» функциональные возможности в блоке успешности для FF и в блоке ошибок, заключенном в условное условие «if (xhr.status == 200)».

+0

Ooo. , умная. Мне, возможно, придется еще раз взглянуть на это. Спасибо – Peter

11

Попробуйте установить для кешированной опции значение false.

$.ajax({   
      async: false, 
      cache: false, 
      type: "get", 
      url:imgsArray[img], 
      success:function(imgFile){ 
        alert("success"); 
        //do something useful 
        }, 
        error:function(XMLHttpRequest,status,error){ 
        //do nothing 
      } 
    });//ajax 
-1

Если вы используете проверку ввода, если у вас есть один выбор, как «выбрано», если вы не то, не передать этот параметр Аяксу функции.

+0

Можете ли вы привести пример кода, чтобы проиллюстрировать это? –

3

использовать следующий тег для поддержки кросс-браузер

$ .support.cors = TRUE;

1

набор 'Кэш: ложь' внутри .ajax конфигурации работает для меня :)

0

если вы успеха:

Success: function (data) { 
        if (data != null) { 
         alert(data); 
         ; 
        } 
       }, 

изменения для этого:

success: function (data, textStatus, XMLHttpRequest) { 
       alert(data.d); 
      } 
0

Другая вещь, которую вы можете попробуйте, очень точно так же, как решение от Джона Сондерса, попробует «jsonp» как тип контента, а не json - для ожидаемого ответа типа данных json. Мне пришлось попробовать это с IE, чтобы убрать мою ошибку, что было нормальным кодом, работающим в любом другом браузере, кроме IE.

Вот мой код, который работал:

$.ajax({ 
    url: request_url, 
    data: { var1: 'stuff' }, 
    dataType: "jsonp", 
    type: "get", 
    async: true, 
    cache: false, 
    success: function(collections) { 
     // handle result 
    } 
}); 

Приветствия.

0

Я пришел к этому вопросу с аналогичными проблемами. И ответы выше фиксировали многие из моих проблем. Однако есть еще один трюк, который мне нужно сделать. Не используйте

$.ajax({..., 
success: myfunc,...}); 

использование

$.ajax({..., 
success: myfunc(),...});