你可以用jQuery触发器设置event.data
使用jQuery .on(),您可以传递一个可选参数来设置事件数据。 你可以用触发器来做这个吗?
简答:
可以触发()传递数据到你的事件处理程序? 是 (作为附加参数)
可以触发()直接传递数据到event.data对象? 没有 (只有()()这样做)
// Using this will pass myData to every event handler as the second parameter. trigger('myEvent', [myData]) // Instead of this on('myEvent', function(evt) {...}); // You would do this on('myEvent', function(evt, myData) {...});
长答案
trigger()方法做了5件事情。
- 它创build一个JQueryEventObjecttypes和可选的命名空间,你给它
- 它发送或发出一个特定types的事件,它沿着DOM传播,直到它到达顶端或其传播停止。
- 它为该types的事件定义事件处理程序的签名。
- 函数(事件){…}是默认的
- 它将事件作为第一个parameter passing给这些处理程序
- 它(可选)将附加parameter passing给事件的任何处理程序
- 函数(event,additionalParams){}
数字3和5是最重要的,与你有关。 由于您隐式定义了处理此事件的api,因此您希望与触发事件的方式保持一致,以便使用您的代码的人员可以与其使用方式保持一致。
示例1一致性
function Car(speed, tires, brakes) { this.speed = speed; this.tires = tires; this.brakes = brakes; } Car.prototype.brake = function(amount) { // You can do this (Event handler will have access to these parameters) car.trigger('brake.car', [this.speed, this.brakes, this.tires, amount]) // Or this (Event handler will have access to these parameters) car.trigger('brake.car', [this, amount]) // but try not to mix and match with the same event type } ... //This is the first way from above (choose one or the other, but don't mix and match). passenger.on('brake.car', {person: passenger}, function(evt, carSpeed, carBrakes, carTires, brakeAmount){ if(brakeAmount > 50) passenger.hangOnTight(); } }) ... // This is the second way from above (choose one or the other, but don't mix and match). passenger.on('brake.car', function(evt, car, brakeAmount){ if(brakeAmount > 50) passenger.hangOnTight(); } })
示例2下面是显示trigger()和on()的典型示例:
jQuery(document).on('eventName' {eventData1: 'foo', eventData2: 'bar'}, function (evt, extraParam1, extraParam2) { //This code runs when the event is triggered console.log(evt.data.eventData1) // foo console.log(evt.data.eventData2) // bar console.log(extraParam1) // 'extra param 1' console.log(extraParam2) // 'extra param 2' }); jQuery(document).trigger('eventName', ['extra param 1', 'extra param 2']);
所以只要记住。
- .trigger():如果需要,发出事件并定义参数2,3等
- .on():事件冒泡了dom。 做一些东西,添加或使用事件数据,并使用触发器添加或不添加的额外参数。
我希望我没有弄错你的意思,但是你的意思是用trigger
方法传递额外的数据?
$(app.Model).trigger("foo", additionalData);
还有别的地方
$(app.Model).on("foo", callback); var callback = function(event, additionalData) { console.log(additionalData); }
请注意,如果您通过trigger
传递其他数据,callback函数中的第一个参数始终是您触发的实际事件。
我在括号中使用的app.Model
是应该触发一个事件的对象,它也监听这个事件。 把它看作是一种名字空间。 您始终可以使用document
,任何DOMselect器甚至您喜欢的对象,只要确保trigger
和on
必须使用相同的对象(即,从DOM中删除的DOM元素临时出错)。
你可以这样做:
例
//Create a new jQuery.Event object without the "new" operator. var e = jQuery.Event("click"); // trigger an artificial click event jQuery("body").trigger( e );
你也可以用同样的方法传递event.data。 参考这个事件对象
这是我采取的方法。
$('#foo').on('click', { init: false }, function(e, data) { data = data || e.data; console.log(data.init); // will be true in the trigger, and false in the click. }) .trigger('click', { init: true });
我知道一个解决方法,我们可以使用这个
$("button").on("click", function(event) { event.data = $(this).data('events'); // get the data value alert(event.data); //use your data as you want }); //Now set the data value and trigger $("button").data('events','youreventsvalue').trigger("click");
这里是一个演示
是。 该文件说:
.trigger(eventType [,extraParameters])
注意我们在这里传递的额外参数和
eventData
参数到.bind()
方法之间的差异。 两者都是将信息传递给事件处理程序的机制,但.trigger()
的extraParameters
参数允许在事件触发时确定信息,而.bind()
的eventData
参数要求信息已经在处理程序绑定的时间。
在jQuery网站中,您可以看到trigger
函数的声明: .trigger( eventType [, extraParameters] )
extraParameters
必须是一个数组或单个对象,您将被允许使用参数[1 +](参数[0]等于事件对象)获取这些对象。
所以,这是一个例子:
$('#foo').bind('custom', function(event) { if ( arguments.length > 1 ) { $.each(arguments, function(i,arg){ alert("element " + i + " is " + arg); }) } }); $('#foo').trigger('custom', ['Custom', 'Event', { 'test' : 'attr from object' }, 123]);
据我所知,与原始定义的数据对象相同:
$('selector').on('eventName', dataObject , functionName)
在使用`$('selector')。trigger('eventName')时也会被发送。
你也可以传递参数(就像在他们的答案中提到的其他参数一样),但这些参数是额外的参数(你仍然会在.on()
函数中设置dataObject
)。
我花了一段时间来理解这背后的哲学。 事件涉及两个实体:侦听器和调度器。 event.data
字段仅供侦听器使用。 这就像给一个电话号码分配一个名字:
$("(818)548-2733").on("incomingcall", null, "Mom", pickup);
你可以拿起电话,等待对方告诉你,她是你的妈妈。 或者您可以使用event.data
来附加与此事件相关的额外信息。
$.trigger
和$.triggerHandler
方法由事件的调度程序端调用。 这就是为什么他们不让你指定event.data
。 相反,你可以使用他们的extraParameters
参数。
$("pressedButton").on("click", function(event) { var buttonID = $(this).data('buttonID'); alert(buttonID); // alerts 'save' string passed as an argument }); $("pressedButton").data('buttonID','save').trigger("click");