用jQuery触发器处理自定义事件中的错误
如何在使用JQuery触发事件时控制错误处理?用jQuery触发器处理自定义事件中的错误
我们发现,如果在处理函数中引发错误,它会阻止其他处理程序被调用。请参阅fiddle。
问题如下复制:
$(document).on('customEvent', function()
{
thisIsUndefined.yetIDereferencedIt;
});
$(document).on('customEvent', function()
{
// Something useful happens here.
alert('something');
});
$(document).trigger('customEvent');
在上述例子中,我想要显示的警报。因为我不能保证我能完全控制所有的事件处理程序,所以我想要一种方法来钩住触发器并为每个事件侦听器处理错误。
当然,欢迎使用其他设计选项。
如果某个库已经定义了事件,并且根本无法控制该事件,那么在解除该事件后,我会重新触发该事件,如下所示。
http://jsbin.com/uvivat/2/edit
$("a").on("click", function() {
Undefined.badFunc
});
var prevClickEvent = $._data($("a")[0], "events")["click"][0]["handler"];
//console.log(prevClickEvent);
$("a").unbind("click").on("click", function() {
try {
prevClickEvent.apply(this);
} catch(e) {
console.log(e);
}
alert("hi");
return false;
})
-----编辑----
要经过注册的所有功能,
var prevClickEvents = $.extend({},$._data($("a")[0], "events")["click"]);
$("a").unbind("click").on("click", function() {
var keys = Object.keys(prevClickEvents);
for (var i=0; i< keys.length; i++) {
try {
prevClickEvents[keys[i]]["handler"].call(this);
} catch(e) {
console.log(e);
}
}
});
也许我没有正确解释。我无法控制出现错误的代码,因此我无法将try/catch添加到该函数中。 – Bringer128 2013-02-11 03:35:42
也许这个修改后的jsbin会有所帮助。 http://jsbin.com/uvivat/4/edit - 将行为与http://jsbin.com/uvivat/5/edit进行比较。正如你所看到的,我试图避免的问题是影响这里行为的顺序。 – Bringer128 2013-02-11 05:38:44
如果是这样的话,我会通过所有注册的事件处理程序。 http://jsbin.com/uvivat/8/edit,使用Chrome进行测试。我们也可以用纯JavaScript来实现这一点。 – allenhwkim 2013-02-11 22:45:58
可以传递数据参数在事件触发和阅读在处理程序,如果有帮助 – charlietfl 2013-02-11 02:30:10
@charlietfl不,这没有帮助。问题是,如果不控制传递给'on()'的函数,我不能保证一个错误不会阻止所有事件处理程序触发。 – Bringer128 2013-02-11 03:21:52
真的没有任何其他错误,阻止剩余的脚本运行...怀疑你会发现一个修复,而不是固定错误被抛出 – charlietfl 2013-02-11 03:25:23