2017-10-11 112 views
0

我有客戶端記錄器POST任何客戶端錯誤記錄到服務器。如何停止傳播ajaxerror事件

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,這又會嘗試記錄錯誤並失敗等等。它持續循環。

有什麼方法可以停止傳播ajaxErrorcatchfail事件處理程序?

如果不是,那麼如何在不使用AJAX的情況下進行POST?

或有任何其他更好的方式來處理這個問題(不使用任何其它第三方的lib)

回答

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

入住ajaxError()的URL,如果錯誤是從記錄網址不作日誌請求:

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