IE中的$ .ajax调用错误,但不是FireFox

时间:2009-07-06 17:27:28

标签: jquery

我正在尝试$ .ajax而不是getJSON用于调试目的。因为getJSON没有报告IE中的错误(6,7或8),我试图弄清楚为什么jQuery插件不会将我返回的图像绘制到IE中的屏幕上,而是在其他浏览器中。

所以我尝试了这个。有趣的是,它击中了IE中的错误事件而不是firefox,safari和其他人,我不知道为什么(这段代码效果很好,并且在FireFox中提供我的数据就好了)。我知道我退回的json是有效的:

$.ajax({
    type: "GET",
    url: "http://localhost:59396/sss/sssHandler.ashx?action=getproducts&ids=" + ids,
    data: "{}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data) {
        alert(data.length);
        carousel.size(allProductIDs.length);

        if (numberOfImagesLeftToShow < numberOfImagesToDisplay) {
            first += (numberOfImagesToDisplay - numberOfImagesLeftToShow);
        }

        var d = 0;
        for (var i = first; i <= last; i++) {

            if (d != undefined) {
                // add data using index of the array returned by JSON (which starts at 0)
                carousel.add(i, decode(data[d].ImageTag));
            }

            // set to last ProductID showing in Carousel
            if (i == last) { lastProductID = parseFloat(data[d].ProductID); }

            d++;
        }
    },

    error: function() {
        alert("An error has occurred. Please try again.");
    }
});

我不知道还有什么办法可以解决为什么IE使用返回的JSON遇到这么多麻烦,或者只是使用getJSON或者执行函数(数据)。我在响应中也设置了标头而不是缓存。那不是问题。 问题无论出于何种原因,IE拒绝在响应中输入我的功能(数据)。

这是返回的JSON,显示有效(甚至用http://www.jsonlint.com/检查):

[
    {
        "ImageTag": "\u003cdiv class=\"CarouselItem
\"\u003e&lt;p&gt;&lt;img src=&quot;http://www.xxx.com/image/
2568.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;\u003cp\u003e\u003ca href=
\"Bear-10.prod\"\u003eTeddy Bear\u003c/a\u003e\u003c/p\u003e\u003cp
\u003e$20.95\u003c/p\u003e\u003cdiv\u003e",
        "ProductID": "540"
    },
    {
        "ImageTag": "\u003cdiv class=\"CarouselItem
\"\u003e&lt;p&gt;&lt;img src=&quot;http://www.xxx.com/image/
50.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;\u003cp\u003e\u003ca href=
\"Pendant362.prod\"\u003eBirthday\u003csup\u003e©\u003c/sup
\u003Necklace\u003c/a\u003e\u003c/p\u003e\u003cp\u003e$36.95\u003c/p
\u003e\u003cdiv\u003e",
        "ProductID": "83"
    }
] 

在我的.ashx中,我只需要以下主代码来生成响应

        context.Response.ContentType = "application/json";
        context.Response.Charset = Encoding.UTF8.ToString();
        context.Response.Cache.SetNoStore();
        context.Response.Cache.SetExpires(DateTime.MinValue);
        context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        context.Response.Cache.SetValidUntilExpires(false);

        context.Response.Expires = -1;
        context.Response.ExpiresAbsolute = DateTime.MinValue;
        context.Response.AddHeader("Cache-Control", "no-cache");
        context.Response.AddHeader("Cache-Control", "post-check=0, pre-check=0");
        context.Response.AddHeader("Pragma", "no-cache");

...

string jsonString = imageList.ToJSON(); <-- uses the .NET 3.5 JavaScriptSerializer
        context.Response.Write(jsonString);

另外,如果您将response.ContentType指定为“application / json”或“text / plain”似乎并不重要,因为至少我在FireFox中获取有效数据并进行了解析。

4 个答案:

答案 0 :(得分:1)

我怀疑这是json数据,让我们首先尝试回家问题。如果你简单地回来,请求是否有效?

[
    {
        "ImageTag": "imagePath",
        "ProductID": "540"
    },
    {
        "ImageTag": "imagePath",
        "ProductID": "83"
    }
]

如果确实如此,即对某些编码有困难。

N.B我也尝试过你在jsonlint上粘贴的json,除非我在第二张图片中删除了imageTag的最后一行,否则无法验证它。

你真的需要在json中返回html。如果是这样,为什么不只是做一个html得到你没有真正受益于轻量级的json结构

答案 1 :(得分:1)

不确定这是否与问题有关,但 contentType 参数指定发送的数据的MIME类型,但未收到。

由于您没有发送任何内容(仅使用已在URL中指定的查询字符串进行GET),您可能不需要选项中的contentTypedata参数。

答案 2 :(得分:0)

我认为jQuery使用eval(“(”+ data +“)”),然后将结果传递给您的success函数,因为您已经指定了您期望的JSON数据。可能值得将此内容类型更改为“text”,然后在成功回调中使用JSON.parse来解析它。只是一个想法!

答案 3 :(得分:0)

修好了,

删除:

context.Response.Charset = Encoding.UTF8.ToString();

改变: context.Response.ContentType =“application / json; charset = utf-8”;