如何发送触发事件并知道它是否被任何收件人取消/消费?

我正在构建一个自定义导航系统,其中锚链接存储在父项中作为data-url = attributes。 这样整个项目都是可点击的(以及其他function)。

我需要这些子项的默认行为来正常处理链接(即更改window.location)。

问:如何从trigger收件人发回消息消息已被消耗,因此不进行“正常处理” 或者可能只是你如何得到触发器传递的事件对象?

示例JSFiddle: http : //jsfiddle.net/TrueBlueAussie/dXkbW/6/

 // Construct the test structure var $panel = $('.panel'); var $items = $panel.find('li:has(a)'); $items.each(function () { var $item = $(this); $item.addClass('item'); var $a = $item.find('a[href]'); $item.attr('data-url', $a.attr('href')).attr('data-target', $a.attr('target')); $a.contents().unwrap(); }); // Test click handler $panel.on('click', '.item', function(e){ var $this = $(this); //alert($this.attr('data-url')); $this.trigger('navigate', [$this.attr('data-url'), $this.attr('data-target')]); // Q: How to know if a receiving item consumed the click??? if ("some test goes here"){ // Navigate like normal link window.location = $this.attr('data-url'); } }); // Test parent control click handler // eg only wants events targetted at ".content" $(document).on('navigate', function(e, url, target){ alert(" url='" + url + "' target= \'" + target + "'"); // Process .content targetted links here and not at source if (target == '.content'){ e.preventDefault(); // or something else? } }); 

示例HTML

   

我想使用像e.preventdefault()这样的标准,但是如何从你调用trigger地方访问事件对象?

文档……唉!

它实际上变得相当简单,但仅在此页面上提到http://api.jquery.com/category/events/event-object/而不是在trigger参考页面上:

“自己创建一个事件对象并将其传递给触发器!” 🙂

 var e = jQuery.Event( "navigate" ); $this.trigger(e, [$this.attr('data-url'), $this.attr('data-target')]); if (e.isDefaultPrevented()) { // Someone prevented the default event! alert('Prevented!'); } else { alert('Navigated!'); // Navigate like normal link //window.location = $this.attr('data-url'); } 

改良版:

您还可以简单地扩展jQuery事件对象(而不是传递参数)。

 var e = jQuery.Event( "navigate", {url: $this.attr('data-url'), navtarget: $this.attr('data-target')} ); $this.trigger(e); 

而是引用自定义事件参数:

 $(document).on('navigate', function (e) { alert(" url='" + e.url + "' target= \'" + e.navtarget + "'"); // Process .content targetted links here and not at source if (e.navtarget == '.content') { e.preventDefault(); // or something else? } }); 

更好,现在看起来像是内置的 。 你只需要避免任何现有的属性名称(在我意识到它是一个现有的, 相当重要的属性之前我使用target作为自定义):)