为什么这个jQuery Ajax调用仅在IE9中失败(即使在IE8和IE7中工作正常)

时间:2011-08-02 00:06:59

标签: jquery ajax internet-explorer-9

我有一个网站,我可以像这样进行ajax调用:

            // perform an ajax request to generate a new subscriber account
            jQuery.ajax({
                type: 'POST',
                url: '/index.php?option=com_content&view=article&id=45&tmpl=component',
                data: postVars,
                success: handleResponse,
                error: function(jqXHR, textStatus, errorThrown) {
                    alert ('response: ' + jqXHR.responseText);
                    alert ('code: ' + jqXHR.getResponseHeader('X-Subscriber-Status'));
                }
            });

被请求的页面没有做任何事情,只返回一位数的状态代码,除IE9外,它适用于所有浏览器。该脚本与其请求的页面托管在同一个域中,因此跨域脚本编写不会出现任何问题。

我终于找到了正在发生的事情,但我不知道如何修复它。事实证明,Ajax请求成功完成,没有任何问题。我通过使用Fiddler来查看网络流量来验证这一点。服务器使用HTTP状态代码200响应请求,并且正文除了单个数字响应代码之外不包含任何内容。此时,jQuery执行错误处理程序,而不是预期的成功处理程序(在IE9中)。为什么这样做,我该如何防止它?这只发生在IE9中。即使IE8和IE7使用完全相同的代码也能正常工作!正如你所看到的,我最终使用了检测IE9并使用XmlHttpRequest对象来执行此操作(顺便说一句,它工作正常)。

这对我来说似乎是一个jQuery错误,但我在搜索中找不到它。我真的是唯一一个经历过这种奇怪行为的人吗?

2 个答案:

答案 0 :(得分:7)

好吧,我终于找到了问题所在。事实证明,由于某种原因,jQuery / IE没有正确地urlencode双引号。请求的URL是:

/search.json?callback=jQuery16105234487927080267_1313510362362&q=stocks或“股市”-blueprint -empireavenue.com -learn& _ = 1313510362469

在jQuery执行ajax请求时,在每个其他浏览器中,它看起来像:

/search.json?callback=jQuery16105234487927080267_1313510362362&q=stocks%20OR%20%22stock%20market%22%20-blueprint%20-empireavenue.com%20-learn& _ = 1313510362469

但是无论出于什么原因,所有版本的IE都出现了这样的结果:

/search.json?callback=jQuery16105234487927080267_1313510362362&q=stocks%20OR%20 “股票%20market” %20-蓝图%20-empireavenue.com%20-学习&安培; _ = 1313510362469

导致服务器不返回任何数据。

答案 1 :(得分:1)

您确定要调用的网址(/index.php?option=com_content&view=article&id=45&tmpl=component)在IE9中有效吗?如果你在IE9中加载那个PHP页面,它是否会返回预期的结果?它应该这样做,但值得检查错误是在jQuery调用中,而不是PHP。

此外,POST调用通常是指向'index.php'这样的页面,查询字符串(option=com_contentview=article等)作为变量postVars发送。

尝试使用以下内容:

$.ajax({
    type: "POST",
    url: "index.php",
    data: {
        option : com_content,
        view : article,
        id : 45,
        tmpl : component
    },
    success: function(msg){
        console.log(msg);
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.log(textStatus)
    }
});

将函数删除到其基本部分,您应该能够看到错误的来源。