我正在使用自定义事件来广播导航消息(在相关插件之间)。
简单的触发器代码目前如下所示:
$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定义文件所说的内容。
答案 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,然后使用第二个选项。