用jQuery触发器处理自定义事件中的错误

用jQuery触发器处理自定义事件中的错误

问题描述:

如何在使用JQuery触发事件时控制错误处理?用jQuery触发器处理自定义事件中的错误

我们发现,如果在处理函数中引发错误,它会阻止其他处理程序被调用。请参阅fiddle

问题如下复制:

$(document).on('customEvent', function() 
{ 
    thisIsUndefined.yetIDereferencedIt; 
}); 

$(document).on('customEvent', function() 
{ 
    // Something useful happens here. 
    alert('something'); 
}); 

$(document).trigger('customEvent'); 

在上述例子中,我想要显示的警报。因为我不能保证我能完全控制所有的事件处理程序,所以我想要一种方法来钩住触发器并为每个事件侦听器处理错误。

当然,欢迎使用其他设计选项。

+0

可以传递数据参数在事件触发和阅读在处理程序,如果有帮助 – charlietfl 2013-02-11 02:30:10

+0

@charlietfl不,这没有帮助。问题是,如果不控制传递给'on()'的函数,我不能保证一个错误不会阻止所有事件处理程序触发。 – Bringer128 2013-02-11 03:21:52

+0

真的没有任何其他错误,阻止剩余的脚本运行...怀疑你会发现一个修复,而不是固定错误被抛出 – charlietfl 2013-02-11 03:25:23

如果某个库已经定义了事件,并且根本无法控制该事件,那么在解除该事件后,我会重新触发该事件,如下所示。

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); 
    } 
    } 
}); 
+0

也许我没有正确解释。我无法控制出现错误的代码,因此我无法将try/catch添加到该函数中。 – Bringer128 2013-02-11 03:35:42

+0

也许这个修改后的jsbin会有所帮助。 http://jsbin.com/uvivat/4/edit - 将行为与http://jsbin.com/uvivat/5/edit进行比较。正如你所看到的,我试图避免的问题是影响这里行为的顺序。 – Bringer128 2013-02-11 05:38:44

+0

如果是这样的话,我会通过所有注册的事件处理程序。 http://jsbin.com/uvivat/8/edit,使用Chrome进行测试。我们也可以用纯JavaScript来实现这一点。 – allenhwkim 2013-02-11 22:45:58