簡體   English   中英

如何停止傳播ajaxerror事件

[英]How to stop propagating ajaxerror event

我有客戶端記錄器,它將任何客戶端錯誤發布到服務器進行記錄。

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 }) } 

問題

logger.log在內部使用ajax POST將日志發送到服務器。 因此,如果日志記錄本身失敗,它將再次觸發$(document).ajaxError ,后者再次嘗試記錄錯誤並失敗,依此類推。 它以連續循環進行。

有什么辦法可以在catchfail事件處理程序中停止傳播ajaxError

如果沒有,那么如何不使用AJAX進行POST?

還是有其他更好的方法來處理此問題(不使用任何其他第三方庫)

大多數時候,當我需要打破一個無限循環時,我會拋出:

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);
}

檢查ajaxError()的網址,如果錯誤來自日志記錄網址,則不要發出日志請求:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM