如何停止传播ajaxerror事件

时间:2017-10-11 23:07:10

标签: javascript jquery

我有客户端记录器,它将任何客户端错误POST到服务器进行记录。

var logger = (function ($) {
     var module = {};
    module.log = function (obj) {
        try {           
            $.ajax({
                type: "POST",
                data: JSON.stringify(obj),
                url: '/jslog'
            })
            .fail(function (jqXHR, textStatus, errorThrown) {
                console.error('JS error report submission failed.');
                // how to stop progating ajaxError here?
            })
        }
        catch (ex) {
            console.error('JS error report submission failed.');
            // how to stop progating ajaxError here?
        }
    }
    return module;

})(jQuery);

然后在页面上我附加了两个事件处理程序。

  1. 处理任何ajax错误
  2. 处理任何java脚本错误

    $(document).ajaxError(function (event, jqxhr, settings, thrownError) {
            logger.log({ jqxhr: jqxhr })
        });
    
     window.onerror = function (msg, url, line) {
        logger.log({ message: msg, url: url, line: line })
     }
    
  3. 问题

    logger.log在内部使用ajax POST将日志发送到服务器。因此,如果日志记录本身失败,它会再次触发$(document).ajaxError,再次尝试记录错误并失败,依此类推。它连续循环。

    有没有办法在ajaxErrorcatch事件处理程序中停止传播fail

    如果没有,那么如何不使用AJAX进行POST?

    还是有其他更好的方法来处理这个问题(不使用任何其他第三方库)

2 个答案:

答案 0 :(得分:0)

大多数情况下,当我需要打破无限循环时,我会抛出:

return;

就发布AJAX而言,您可以使用这种具有noCache帮助程序的解决方案来避免可怕的IE ajax缓存。 jQuery倾向于处理ajax缓存本身,因此在我看来,noCache选项几乎是必需的。

function postAjax(url, data, success) {
    var params = typeof data == 'string' ? data : Object.keys(data).map(
        function(k){ return encodeURIComponent(k) + '=' + encodeURIComponent(data[k]) }
    ).join('&');

    var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

    noCacheRequest('POST',url,xhr);

    xhr.onreadystatechange = function() {
    if (xhr.readyState>3 && xhr.status==200) { 
        success(xhr.responseText); }
    };
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.send(params);
    return xhr;
}

function noCacheRequest(http_method,url,request_object) {
    var no_cache = '?' + new Date().getTime();
    return request_object.open(http_method.toUpperCase(), url + no_cache, true);
}

答案 1 :(得分:-1)

检查ajaxError()中的网址,如果错误来自日志记录网址,请不要发出日志请求:

$(document).ajaxError(function (event, jqxhr, settings, thrownError) {
  if ( settings.url !== '/jslog' ) {
    logger.log({ jqxhr: jqxhr });
  }
});