Javascript 为什么Jquery事件循环因异常而中断

Javascript 为什么Jquery事件循环因异常而中断,javascript,jquery,javascript-events,Javascript,Jquery,Javascript Events,在应用程序出现奇怪的行为(使用strophexmpp和jquery)之后,我们发现jquery事件循环是同步的,不会捕获异常 这意味着,如果第一个事件处理程序引发异常,则永远不会调用第二个异常 $(文档).ready(函数(){ $(document.bind('foo',onFoo); $(文档).bind('bar',onBar); $(document.trigger('foo'); $(document.trigger('bar'); }); 函数onFoo(e){ log('liste

在应用程序出现奇怪的行为(使用strophexmpp和jquery)之后,我们发现jquery事件循环是同步的,不会捕获异常

这意味着,如果第一个事件处理程序引发异常,则永远不会调用第二个异常

$(文档).ready(函数(){
$(document.bind('foo',onFoo);
$(文档).bind('bar',onBar);
$(document.trigger('foo');
$(document.trigger('bar');
});
函数onFoo(e){
log('listener onFoo');
抛出“失败的onFoo”;
}
函数onBar(e){
console.log('listener onBar');//未调用
}
我们希望看到两个输出,但第二个输出:“listener onBar”从未显示

请参阅JQuery代码,在“trigger”函数中,处理程序循环期间没有try/catch模式

while((cur=eventPath[i++])&&!event.isPropagationStopped()){
event.type=i>1?
气泡类型:
特殊.bindType | |类型;
//jQuery处理程序
handle=(jQuery._数据(cur,“事件”)|{}[event.type]&&jQuery._数据(cur,“handle”);
if(句柄){
处理。应用(当前、数据);
}
…(jQuery1.10.2中的第4998行)
我们对这一实施感到惊讶

在纯javascript中,即使其中一个处理程序崩溃,也会调用所有处理程序:

有人知道为什么JQuery团队即使前一个处理程序崩溃也不允许执行下一个处理程序吗?为什么不捕获异常?

他们为什么不使用javascript事件处理程序?

这是因为:

如您所见,
中没有try/catch。apply

这就是过去和现在的情况


即使他们愿意,现在更改它也会破坏太多的现有代码


当然,您可以在自己的代码中“修复”这个问题(将其包装在带有错误消息的try/catch中),但您会让其他人大吃一惊。

“为什么jQuery不能捕获异常?”-很可能是因为没有人认为这可能是一个问题。欢迎您向他们的github repo发送拉请求。如果您的事件处理程序可以抛出,那么捕获异常是您的责任。您为什么期望(甚至想要)
trigger
可以做到这一点吗?尽管jQuery没有捕获异常的发现可能很有用,但我认为这个问题无法客观地回答……避免绑定,它已被弃用(使用
.on
)。也永远不要抛出字符串。“现在更改它会破坏太多现有代码。”-你能提供一个例子吗?@JanDvorak是的。那里有很多代码都是用著名的“抛出jQuery直到它工作”。据我们所知,有些人可能有类似于OP的代码,他们用抛出作为阻止其他侦听器运行的一种方式。Ew。这是实现这一目标的可怕方式。然而-g好的,谢谢。
while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) {

    // Triggered event must either 1) have no namespace, or
    // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
    if (!event.namespace_re || event.namespace_re.test(handleObj.namespace)) {

        event.handleObj = handleObj;
        event.data = handleObj.data;

        ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler)
        .apply(matched.elem, args);

        if (ret !== undefined) {
            if ((event.result = ret) === false) {
                event.preventDefault();
                event.stopPropagation();
            }
        }
}