[英]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);
然后在頁面上,我附加了兩個事件處理程序。
處理任何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
,后者再次嘗試記錄錯誤並失敗,依此類推。 它以連續循環進行。
有什么辦法可以在catch
或fail
事件處理程序中停止傳播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.