2012-03-20 56 views
1

我想从本地事件的处理程序中触发一个自定义事件,在这些条件下:如何触发jQuery的自定义事件,传递原始事件和数据

  • 我希望处理程序是形式:function(event, arg) {},其中
  • event是原始,原生事件(这样我就可以调用event.preventDefault()
  • arg是一些数据由trigger ER传递(原事件的处理程序)
  • 个这两个事件(本地&定制的)都在相同的元素解雇(所以自定义事件的名称必须与原来的不同)

我能够远远得到这一点,它的工作原理:

// the native event handler 
function(event) { 
    var e = jQuery.Event("some_custom_event"); 
    e.foo = 'bar'; 
    $(this).trigger(e); 
    if (e.isDefaultPrevented()) 
     event.preventDefault(); 
} 

// an example handler for the custom event: 
function (event) { 
    alert(event.foo); 
    event.preventDefault(); 
} 

我想我也可以将原始事件和foo作为自变量传递给自定义事件处理程序,但我想要一个看起来很标准的处理程序(没有function(event1,event2)。

可以在jQuery中轻松地完成任务吗?

回答

4

trigger函数有两种口味,我认为你应该看看第一句是.trigger(eventType [, extraParameters])

如果我理解正确,那么你需要做的就是你传递foo额外PARAM像下面,

$(this).trigger(e, [foo]); 

从jQuery的文档下面是一个例子,

$("p").click(function (event, a, b) { 
// when a normal click fires, a and b are undefined 
// for a trigger like below a refers to "foo" and b refers to "bar" 

}).trigger("click", ["foo", "bar"]); 

从技术文档.. read more..

.trigger(eventType [ ,extraParameters])

eventType包含JavaScript事件类型的字符串,例如click或 提交。

extraParameters传递给事件 处理程序的其他参数。

+0

您的解决方案不允许我在自定义事件处理程序中的原始事件上设置“preventDefault”。 – ori 2012-03-20 18:37:24

+0

@ori您能否详细说明'preventDefault'应该发生什么?它在第一个地方工作吗?我确定添加添加参数不会影响以前工作的任何内容。 – 2012-03-20 18:41:45

+0

首先,我在上面的代码中犯了一个错误,看看。我正在构建一个我希望能够与之交互的jQuery插件。也许某种回调更适合。基本上我想要一个可以引用原始事件的自定义事件处理函数(可以调用'preventDefault'),但是如果我执行'.trigger('custom',[event,foo])',那么处理函数变成'function c_event,n_event,foo){}'看起来很丑。 – ori 2012-03-20 19:07:00

2

您可以创建一个jQuery事件($.Event),这将允许event.preventDefault()并兑现或者拿起该事件被触发后。

所以,先在你的插件/功能的事件,触发它:

var event = $.Event('myCustomEvent'); 
$element.triggerHandler(event, [extraData1, extraData2]); 
在你的处理器

然后,您可以访问你的和而额外的preventDefault;

$('#someElement').on('myCustomEvent', function (event, extraData1, extraData2) { 
    event.preventDefault(); 
}; 

现在你可以检查原始触发器后看到的默认是被阻止的;

var event = $.Event('myCustomEvent'); 
$element.triggerHandler(event, [extraData1, extraData2]); 

if (event.isDefaultPrevented()) { 
    /* Do something as user prevented default */ 
} else { 
    /* Proceed as normal */ 
}; 
+0

这是一个合理的解决方案,谢谢 – Rob 2015-03-20 12:20:24

相关问题