2

我正在使用自定义事件来广播导航消息(在相关插件之间)。

简单的触发代码目前如下所示:

$button.trigger('navigate', { url: link, target: target });

接收代码如下所示:

$element.on('navigate', function (e, params)
{
    e.preventDefault();
    e.stopPropagation();
    // Do something custom here with params.url and params.target
});

问题是我还需要测试isDefaultPrevented()发送到的事件对象trigger

我可以创建一个自定义事件对象并使用以下方法对其进行测试:

 var eo = $.Event('navigate');
 $button.trigger(eo);
 if (!eo.isDefaultPrevented())
 {
      // Do the default actions
 }

但是 jQuerytrigger()没有同时接受 aJQueryEventObject 参数的版本,我不知道如何通过触发器传递参数。

注意:我不想使用该e.data属性,因为现有代码的负载期望将 params 对象作为第二个参数提供给任何事件处理程序。我更喜欢像这样工作的东西:

 var eo = $.Event('navigate');
 $button.trigger(eo, { url: link, target: target });

问:您如何使用自定义JQueryEventObject 并将参数传递给trigger

注意:我使用的是 TypeScript,所以我按照 jQuery 定义文件所说的可用。

4

1 回答 1

2

这没有记录,但jQuery trigger()实际上确实支持我试图做的事情(传递事件对象参数)。

相关的 jQuery 代码如下所示(只有一个方法,因此第二个参数被视为可选,第一个参数可以是 astring an JQueryEventObject):

trigger: function( type, data ) {
    return this.each(function() {
        jQuery.event.trigger( type, data, this );
    });

我的问题在于信任只有这些条目的 Jquery 的文档和 TypeScript 定义文件(即 jQuery.d.ts):

trigger(eventType: string, ...extraParameters: any[]): JQuery;
trigger(event: JQueryEventObject): JQuery;

在幕后,但我发现你实际上可以通过:

trigger(event: JQueryEventObject, extraParameters: any[]): JQuery;

选项1:

TypeScript解决方案是将元素转换为任何这很糟糕),例如:

(<any>element).trigger(eo, {url: link, target: target});

或为 JQuery 添加新TypeScript定义以允许额外参数:

选项2:(最佳答案)

// Declare our additions to JQuery object
interface JQuery
{
    trigger(event: JQueryEventObject, ...extraParameters: any[]): JQuery;
}

我使用第一个选项跟踪到 Jquery,然后使用第二个选项。

于 2014-08-20T15:26:35.307 回答