你可以用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件事情。

  1. 它创build一个JQueryEventObjecttypes和可选的命名空间,你给它
  2. 它发送或发出一个特定types的事件,它沿着DOM传播,直到它到达顶端或其传播停止。
  3. 它为该types的事件定义事件处理程序的签名。
    • 函数(事件){…}是默认的
  4. 它将事件作为第一个parameter passing给这些处理程序
  5. 它(可选)将附加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器甚至您喜欢的对象,只要确保triggeron必须使用相同的对象(即,从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");