需要传递特定的JQueryEventObject AND参数来触发

时间:2014-08-20 15:10:32

标签: jquery typescript jquery-trigger

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

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

$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
 }

但是jQuery的trigger()没有同时带有JQueryEventObject 参数的版本,我无法弄清楚如何通过触发器传递参数。

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

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

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

注意:我正在使用TypeScript,所以我将使用jQuery定义文件所说的内容。

1 个答案:

答案 0 :(得分:2)

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

相关的jQuery代码看起来像这样(只有一个方法,所以第二个参数只被视为可选,第一个参数可以是string 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,然后使用第二个选项。