With jQuery .on()
you can pass an optional parameter to set the event data. Can you do this with trigger as well?
Can trigger() pass data to your event handlers? Yes (as additional parameters)
Can trigger() pass data into the event.data object directly? No (only on() does this)
// 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) {...});
The trigger() method does 5 main things.
Numbers 3 and 5 are most important and relevant to you. Since you implicitly define the api for handling this event, you want to be consistent with how you trigger events so that people who use your code can be consistent with how they use it.
Example 1 Consistency
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();
}
})
Example 2 Here is the typical example showing both trigger() and 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']);
So just remember.
.on(): event is bubbling up the dom. do some stuff, add to or use event data and use the extra params that trigger added or not.
Tangent: If you want to define event handlers for dynamic elements that can be added or removed arbitrarily, this is very easy with jQuery. See this answer: In jQuery, how to attach events to dynamic html elements?
As far as I know, the same dataObject
that you defined with the original :
$('selector').on('eventName', dataObject , functionName)
will be also sent when you use `$('selector').trigger('eventName').
you can also pass parameters (like other mentions in their answers) but those parameters will be additional arguments (you will still have the dataObject
you set in the .on()
function).
Yes. The documentation says:
.trigger( eventType [, extraParameters] )
Note the difference between the extra parameters we're passing here and the
eventData
parameter to the.bind()
method. Both are mechanisms for passing information to an event handler, but theextraParameters
argument to.trigger()
allows information to be determined at the time the event is triggered, while theeventData
argument to.bind()
requires the information to be already computed at the time the handler is bound.
It took me a while to understand the philosophy behind this. An event involves two entities: listener and dispatcher. The event.data
field was intended to be used by the listener only. It's sort of like assigning a name to a phone number:
$("(818)548-2733").on("incomingcall", null, "Mom", pickup);
You could pick up the phone and wait for the other side to tell you that she is your Mom. Or you can use event.data
to attach the extra information relevant to this event.
The $.trigger
and $.triggerHandler
methods are called by the dispatcher side of an event. That's why they don't let you specify the event.data
. Instead, you can use their extraParameters
argument.
You can do this way:-
Example
//Create a new jQuery.Event object without the "new" operator.
var e = jQuery.Event("click");
// trigger an artificial click event
jQuery("body").trigger( e );
You can pass event.data too with the same approach. Refer this Event Object