【问题标题】:jQuery AJAX not working using IEjQuery AJAX 无法使用 IE
【发布时间】:2013-03-27 16:11:26
【问题描述】:

我在 SO 和其他地方看到很多其他人遇到这个问题,但给定的解决方案似乎都不适合我。

我有一个对 ASHX 处理程序的 jQuery AJAX 调用。该代码适用于 Firefox 和 Chrome,但不适用于 IE(版本 8、9 或 10)。

看起来像这样(简化):

var val = $(this).val();

$.ajax({
    url: '/Source/Handlers/Search.ashx?q=' + val,
    type: "GET",
    cache: false,
    dataType: 'json',
    error: function(w,t,f) {
         alert(w + "\n" + t + "\n" + f);
    },
    success: function (data) {
         ...
    }
 });

当我在 IE 中运行代码时,错误处理程序会启动并显示

[object Object]
error
error

有用吗?

ASHX 处理程序是这样的(再次简化):

public class Search : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        context.Response.ContentType = "application/json";
        context.Response.Buffer = false;

        JavaScriptSerializer serializer = new JavaScriptSerializer();
        List<Suggestions> jsonResponse = new List<Suggestions>();

        // do some stuff

        context.Response.Write(serializer.Serialize(jsonResponse));
    }
}

我尝试过将“GET”替换为“POST”,我尝试过启用和禁用“缓存”属性,我尝试过不同的数据类型设置,例如“json”、“xml”和“text”。

使用 HTTP Fiddler 我可以看到 json 响应确实回来了,但 IE 似乎无法处理它。

有什么想法吗?

编辑

这是来自 HTTP Fiddler 的 TextView 中的 JSON 响应:

543
[{"title":"GAMES","results":[{"title":"abcdefg™","link":"http://www.abcdefg.com/en_gb/abcdefg/","image":"/uploadedImages/abcdefg/games/1-Game_Folder_Master(1)/Config/abcdefg(1).jpg","total":""},{"title":"abcdefg","link":"http://www.abcdefg.com/en_gb/abcdefg","image":"/uploadedImages/abcdefg/games/1-Game_Folder_Master(1)/Config/abcdefg.jpg","total":""},{"title":"abcdefgg","link":"/Retailers/?game=1432&amp;platform=0","image":"/uploadedImages/abcdefg/games/1-Game_Folder_Master(1)/Config/abcdefg.jpg?n=9736","total":""},{"title":"abcdefg","link":"http://www.abcdefg.com","image":"/uploadedImages/abcdefg/games/1-Game_Folder_Master(1)/Config/abcdefg.jpg","total":""},{"title":"abcdefg","link":"/Retailers/?game=1763&amp;platform=0","image":"/uploadedImages/abcdefg/games/1-Game_Folder_Master(1)/Config/abcdefg_promo.jpg","total":""}],"total":"24","link":"/Search/?q=total"},{"title":"MEDIA","results":[{"title":"Videos","link":"/Search/?q=total","image":"","total":"1"},{"title":"Screenshots","link":"/Search/?q=total","image":"","total":"35"}],"total":null,"link":null}]
0

编辑 2

嗯,我更新了 $.ajax 调用以提醒 w.status,它返回“404”。困惑——Fiddler 显示响应为 200 时,它的状态如何返回 404?

【问题讨论】:

  • 你能发布 JSON 响应吗?
  • 你为什么要使用警报?使用控制台!
  • 是的,如果您能告诉我们,如果您直接在浏览器中点击该网址,您会从该网址获得什么?它是否产生了有效的 json 响应?
  • 真的!我应该这样做,反正这个错误是没用的……
  • +1 到@epascarello。使用console.dir() 而不是alert(),您将从wft 中获得更多有用的信息。

标签: jquery ajax json internet-explorer


【解决方案1】:

我依稀记得这样一个问题。 你可以试试添加

contentType: "application/json; charset=utf-8"

到 ajax 请求属性。我认为这解决了当时的问题。

【讨论】:

  • +1。如果你没有打败我,我会给出类似的答案。
  • 不幸的是,它对我不起作用。不过感谢您的回答。
【解决方案2】:

尝试添加data : {q : val} 看看是否能解决问题:

 var val = $(this).val();

 $.ajax({
    url: '/Source/Handlers/Search.ashx',
    type: "GET",
    data : {q : val},  //<--------send it this way
    cache: false,
    dataType: 'json',
    error: function(w,t,f) {
       alert(w + "\n" + t + "\n" + f);
    },
    success: function (data) {
       ...
    }
 });

【讨论】:

  • 这只是一个猜测,还是有理由认为 IE 对此没有问题,但查询字符串是 URL 的一部分?
  • 坦率地说,以前从未遇到过这样的问题,但我会说这是一个猜测。
  • @rf_wilson 如果您能告诉我们,如果您直接在浏览器中点击该网址,您会从该网址获得什么?它是否产生了有效的 json 响应?
  • 参见上面的原始帖子,添加了 JSON 响应
【解决方案3】:

经过反复试验,我发现了问题所在。使用 IE 时,我需要对从我的 ASHX 处理程序返回的数据对象调用 JSON.parse(data)。为此,请使用调用 Ajax 的非 jQuery 方法。这意味着我有两种不同的 Javascript 块——一种用于 IE,另一种用于其他浏览器。

if ($.browser.msie) {
    var xhReq = new XMLHttpRequest();
    xhReq.open("GET", "/Source/Handlers/Search.ashx?q=" + val + "&d=" + dateObj.getTime(), false);
    xhReq.send(null);
    AjaxSuccess(xhReq.responseText);
} else {
    $.ajax({
        url: '/Source/Handlers/Search.ashx',
        type: "GET",
        cache: false,
        dataType: 'json',
        data: { q: val },
        contentType: "application/json;",
        error: function (xhr, ajaxOptions, thrownError) {
            alert(xhr.responseText);
        },
        success: function (data) {
            ...
        }
    });
 }

 function AjaxSuccess(data) {
     data = JSON.parse(data);
     ...
 }

奇怪的是,JSON.parse() 方法会在 Firebug 中引发“意外字符”错误。

【讨论】:

    【解决方案4】:

    也许编码有问题。试试这个

    $.ajax({
            type: 'GET',
            url: encodeURI(url ),
            dataType: 'text',
            success: function (data) {
                                result = JSON.parse(JSON.parse(data))
                                                    }
           });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多