简体   繁体   English

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

[英]Handing errors in custom event with jquery trigger

How can I control the error handling when triggering an event with JQuery? 使用JQuery触发事件时如何控制错误处理?

We've found that if an error is thrown in a handler function it prevents other handlers from being invoked. 我们发现,如果在处理程序函数中引发错误,则会阻止其他处理程序被调用。

Please see this fiddle . 请看这个小提琴

The problem is copied below: 问题复制如下:

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

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

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

In the above example, I want the alert to be shown. 在上面的示例中,我希望显示警报。 As I cannot guarantee that I have full control over all of the event handlers I'd like a way to hook into trigger and handle errors per event listener. 由于我不能保证可以完全控制所有事件处理程序,因此我想采用一种挂接到触发器并处理每个事件侦听器错误的方法。

Of course, alternative design options are welcome. 当然,可以选择其他设计方案。

If event is already defined by some library, and you cannot control that event at all, I would re-trigger that event after unbind that event like the following. 如果某个库已经定义了事件,并且您根本无法控制该事件,则在取消绑定该事件之后,我将重新触发该事件,如下所示。

http://jsbin.com/uvivat/2/edit 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;
})

----- edit ---- -----编辑----

To go through all functions registered, 要完成所有注册的功能,

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM