IE浏览器没有触发jQuery Ajax的成功回调函数

15

我正在编写一个使用jQuery异步加载一些图像的脚本。

这是加载图像的函数的代码片段 -

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。

有什么想法吗?


我假设你已经查看了 Fiddler 中的响应?你在那里看到什么? - Craig Stuntz
错误函数是否被触发?你应该在那里放入一些代码,以查看是否有任何错误。 - Damovisa
是的,在你的 catch 中添加一个警告,看看它是否抛出了错误。还可能需要将其更改为 "GET" 而不是 "get"。 - Chad Grant
13个回答

17

解决这个问题的简单方法是在jQuery设置中提供 dataType: 'text'dataType: 'xml'dataType: 'json'或其他任何可用响应类型。

我遇到了同样的问题,在.ajax调用中指定dataType设置后,它可以正常工作。

IE不是一个聪明的浏览器,它不会默认假定字符串值。

试试吧……祝你好运。


11

尝试将cached-option选项设置为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

7

我曾遇到类似的问题——如果IE无法解析响应为xml,即使请求成功,它也会触发失败,因此,例如,如果您请求图像,则在错误块中返回xhr.status 200。

我将“成功”功能放在FF的成功块中,并在错误块中包裹了一个“if(xhr.status == 200)”条件。


哦,聪明。我可能需要再看一下。谢谢。 - Peter

4
请使用以下标签来支持跨浏览器 $.support.cors = true;

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
    }
}

这并不是我问题的真正答案,但它是一个可行的解决方法。


1

在 .ajax 配置中设置 'cache: false' 对我有用 :)


1

最近几天,我在使用JSONP Web Service时遇到了与IE和AJAX相关的问题。即使是代码中最小的错误也会导致IE中的所有内容崩溃。

最好的方法可能是使用Visual Web Developer Express或Visual Studio在IE中调试页面。以下是如何进行调试的教程:

如何使用Visual Web Developer Express调试JavaScript

按照说明操作,也许可以在AJAX请求开始处设置断点。

还可以尝试以下方法:

  • 从错误字段中删除“XMLHttpRequest”,我以前从未使用过它,我的代码仍然可以正常工作;
  • 确保您正在使用最新版本的jquery(1.3.2)?

希望您能尽快解决问题!


谢谢。这是一个很好的IE调试技巧,特别是对于IE6-7。虽然我不是IE8调试功能的粉丝,但这是一个开始。错误响应似乎没问题,只是无法成功。我也升级到了最新的jQuery版本。可能是我的服务器设置和IE的跨域脚本阻止或类似的问题。这是一个基于struts构建的动态网页。基本上,我想测试该URL是否存在图像。 - Peter

0
我遇到了类似的问题,来到这个问题。上面的答案解决了我的许多问题。然而,还有一个技巧我需要做。不要使用


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

使用

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

0

如果你成功了:

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

更改为:

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

0

你可以尝试另一种方法,与 John Saunders 的解决方案非常相似,尝试将 "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
    }
});

干杯。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接