withCredentials属性在Firefox浏览器中不受支持。

4

我使用的是HTML5,jQuery 1.6.1和jQuery Mobile 1.0.1。

我使用以下代码进行Ajax请求。在Chrome中运行正常,但在测试Firefox 14.0.1时出现以下错误:

在窗口上下文中同步模式下不再支持XMLHttpRequest的withCredentials属性。

代码:

$.ajax({
   type: "GET",
   dataType: "json",        
   async: false,
   beforeSend: function (xhr){          
        xhr.setRequestHeader('Authorization', make_base_auth(UserId, Password)); 
  },
  xhrFields: {
      withCredentials: true
  },
   success:function(data){                  
   console.log("Success");          
 },
 error:function(xhr,err){
    console.log("Failed" );
 }          
});

请帮我解决这个问题。

2个回答

17

解决方案很简单:不要在$.ajax中使用async:false

这在更新版本中已经被废弃,也没有必要使用它。一直以来使用它都是个坏主意。执行你需要做的事情,使用成功回调的结果(就像你的console.log)。

来自文档(1.8):

请注意,同步请求可能会暂时锁定浏览器,在请求运行期间禁用任何操作。从 jQuery 1.8 开始,与 jqXHR ($.Deferred) 一起使用 async: false 已被弃用;您必须使用 complete/success/error 回调函数。


我希望我能额外点赞这个答案50次。非常感谢 - 你刚刚结束了两个小时的bug修复会话。 - Bob Cavezza
4
我不同意永远不应该使用同步模式的说法。我们有一个企业站点,当用户关闭页面时必须进行一些服务器端处理。唯一可靠的方法是使用unload函数并发出同步ajax请求。但在某些浏览器中,这种方式似乎会在浏览器关闭得太快时失败。此外,如果不使用同步,回调函数将永远不会被执行,因为ajax请求在浏览器关闭之前已经结束了。当然,任何同步调用都需要设计成快速的,否则会对用户造成麻烦。 - George
1
@George 当用户关闭页面时进行一些服务器端处理是一种可怕的做法。不要这样做,由于HTTP的本质,它不能保证可靠性。为Web设计应用程序始于避免这种反模式。 - Denys Séguret

0

我在几个地方看到了这个线程,所以会更新一个答案: 我尝试将async调整为true,使用许多不同的帖子和其他属性,但是表单提交的默认操作导致页面刷新:

                    submitSuggestion: function (e) {
                        e.preventDefault();
                        submitComment(viewModel);
                    },
                });

e.preventDefault()阻止了正常的提交行为,即重新加载页面。该行为生成xml重定向错误,因为默认表单提交使用该函数。

如果您遇到了不必要的刷新,请尝试添加preventDefault!


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