我想捕获从传递给jQuery的回调抛出的异常(要么是click
之类的事件处理程序,要么是then
或always
等jqXHR方法。
我发现了两个选项:
window.onerror
处理程序 - 这只是部分解决方案,因为Android不支持我的目标平台之一我能想到的另一件事就是重写jQuery方法,但是每次升级jQuery都会导致问题。对于AJAX处理程序,我可以使用$ .ajaxSetup(根据Exceptions thrown in jQuery AJAX callbacks swallowed?的答案),但我不确定这是否会让我抓住所有内容。
还有其他选择吗?
答案 0 :(得分:15)
你可以像这样包装每个回调:
function cbWrapper(fn) {
return function() {
try {
return(fn.apply(this, arguments));
} catch(e) {
// handle all your exceptions here
}
};
}
因此,当您将回调传递给Ajax调用时,不是传递实际的回调,而是传递cbWrapper(callback)
。
$.get(url, cbWrapper(myRealCallback));
或者内联匿名版本是这样的:
$.get(url, cbWrapper(function() {
// actual callback code here
}));
更高级的方法是使用自己的实现覆盖$.get()
自动包装回调,但这很棘手,因为jQuery对实际传递的参数非常灵活。因此,并且因为必须覆盖一个特定参数才能使其工作,所以必须复制它们的所有参数检测代码,以确定哪些参数存在以及哪些参数对应于哪些实际函数参数。那段代码有点乱。这是可行的,可能不会破坏,因为如果jQuery打破它,那么现有的jQuery代码会破坏,但它不是很干净。
如果这是您自己的所有代码,您可以制作自己的$.get()
版本,其参数位置不够灵活,并切换所有代码以使用它而不是实际的$.get()
:
jQuery.fn.myGet = function(url, fn) {
return(jQuery.get(url, cbWrapper(fn)));
}