在readystate 0,status 0和statusText错误上跟踪AJAX错误

tra*_*nte 10 javascript ajax jquery

我读完所有这些类似的问题:1,2,3,4,5和6.但我需要调试更多.

所有这些问题都表明问题是由跨域政策引起的并且e.preventDefault()解决了问题.但我怀疑这可以打破其他一些事情,所以我需要确定.

在我的网站上,我有一个每天被发射15k次的操作.当用户访问网页时,我的javascript文件会检查一个元素.如果元素存在,则进行AJAX调用.

$(document).ready(function() {

    // I do something here

    if ($('#mydiv').length !== 0) {

       var startTime = new Date().getTime();        

       $.ajax({
           type: "POST",
           url: "/mypage",
           success: function (data) {
               // I do something here
           },
           timeout: 20000,
           error: function(r, s, e) {
               var elapsedTime = (new Date().getTime() - startTime );
               var string = "readyState: "+r.readyState+", status: "+r.status+", statusText: "+r.statusText+", responseText: "+r.responseText+", textStatus: "+s+", error: "+e +", elapsedTime: "+elapsedTime;
               // send this string to server for logging
              formData = {string:string};
              $.ajax({
                url : "/mylog",
                type: "POST",
                data : formData
              });
           }
       });
     }

    // I do something here
});
Run Code Online (Sandbox Code Playgroud)

对于15k请求,~70次用户获得AJAX错误.~20是因为超时.~50是由于未知错误.当我检查客户端的日志时,我看到AJAX请求为未知错误提供了这些值:readyState: 0, status: 0 and statusText: error

虽然建议针对此问题使用e.preventDefault().我需要知道用户为此错误做了什么.在我的javascript文件中,我没有提出任何跨域请求.但我不知道用户为此错误做了什么?是否可以了解更多此错误?

注意:我跟踪"AJAX调用开始"和"AJAX错误"之间的时间.平均时间为1500-2000毫秒.

编辑:如果我使用preventDefault(),我可以在哪里放?因为我没有注册点击功能等.

编辑2:这个页面说明了这个:

我们发现,如果ajax请求在完成之前被取消,则可能会发生这种情况.如果我们触发了ajax请求,然后立即点击链接导航离开页面,我们就可以重现问题.当用户通过刷新,单击链接或更改浏览器中的URL导航离开页面时,jQuery会抛出错误事件.

但是我无法通过在加载AJAX时单击某个链接来重现该问题.

小智 4

解决了。

我面临着同样的问题。当 ajax 调用后存在重定向时,会出现此问题。

损坏的代码:

$.ajax({
                url: '',
                dataType: 'jsonp',
                success: function (json) {
                    // do stuff here
                },
                error: function (error) {
                    // do stuff here
                }
            });

 window.location.href = "www.google.com";
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,ajax 之后有重定向,这会给出就绪状态 0 的错误。

解决方案: 收到一些响应后编写重定向。我写完了。

$.ajax({
                url: '',
                dataType: 'jsonp',
                success: function (json) {
                    // do stuff here
                },
                error: function (error) {
                    // do stuff here
                },
                complete: function () {
                    window.location.href = "www.google.com";
                }
            });
Run Code Online (Sandbox Code Playgroud)