我有客户端记录器,它将任何客户端错误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);
然后在页面上我附加了两个事件处理程序。
处理任何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
,再次尝试记录错误并失败,依此类推。它连续循环。
有没有办法在ajaxError
或catch
事件处理程序中停止传播fail
?
如果没有,那么如何不使用AJAX进行POST?
还是有其他更好的方法来处理这个问题(不使用任何其他第三方库)
答案 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 });
}
});