С помощью jquery.on() вы можете передать необязательный параметр для установки данных события. Можете ли вы сделать это с помощью триггера?
Вы можете установить event.data с помощью jquery trigger
Ответ 1
Краткий ответ:
Может ли trigger() передавать данные вашим обработчикам событий? Да (в качестве дополнительных параметров)
Может ли trigger() передавать данные непосредственно в объект event.data? Нет (только on() делает это)
// 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 основных вещей.
- Он создает объект JQueryEventObject с типом и дополнительным пространством имен, которое вы ему даете.
- Он отправляет или испускает событие определенного типа, которое перемещается по DOM до тех пор, пока оно не достигнет вершины или его распространение не будет остановлено.
- Он определяет подпись обработчиков событий для этого типа события.
- Функция (событие) {...} является значением по умолчанию
- Он передает событие в качестве первого параметра для этих обработчиков
- Он (необязательно) передает дополнительные параметры любым обработчикам события
- функция (событие, дополнительныеParams) {}
Номера 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. делать некоторые вещи, добавлять или использовать данные событий и использовать дополнительные параметры, которые запускают добавление или нет.
Ответ 2
Надеюсь, я не ошибся, но вы имеете в виду передачу дополнительных данных с помощью метода trigger
?
$(app.Model).trigger("foo", additionalData);
И где-то еще...
$(app.Model).on("foo", callback);
var callback = function(event, additionalData) {
console.log(additionalData);
}
Обратите внимание, что если вы передаете дополнительные данные с помощью trigger
, ваш первый параметр в функции обратного вызова всегда является фактическим событием, которое вы запускаете.
app.Model
Я использовал в скобках объект, который должен инициировать событие, а также прослушивает это событие. Думайте об этом как о пространстве имен. Вы всегда можете использовать document
, любой DOM-селектор или даже объект, который вам нравится, просто убедитесь, что оба trigger
и on
должны использовать один и тот же объект (то есть элементы DOM, которые временно удалены из DOM, подверженные ошибки).
Ответ 3
Вы можете сделать так: -
Пример
//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 с тем же подходом. Обратитесь к этому Объекту события
Ответ 4
Это был подход, который я сделал.
$('#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 });
Ответ 5
Я знаю обходное решение, которое мы можем использовать для этого
$("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");
Вот демонстрация
Ответ 6
Да. В документации указано:
.trigger(eventType [, extraParameters])
Обратите внимание на разницу между дополнительными параметрами, которые мы передаем здесь, и параметром
eventData
на метод.bind()
. Оба являются механизмами передачи информации обработчику событий, но аргументextraParameters
в.trigger()
позволяет определять информацию в момент запуска события, в то время как аргументeventData
для.bind()
требует, чтобы информация уже была вычисленный во время привязки обработчика.
Ответ 7
В 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]);
Ответ 8
Насколько мне известно, тот же dataObject
, который вы определили с оригиналом:
$('selector').on('eventName', dataObject , functionName)
также будет отправлен при использовании `$ ('selector'). trigger ('eventName').
вы также можете передавать параметры (например, другие упоминания в своих ответах), но эти параметры будут дополнительными аргументами (у вас все еще будет dataObject
, установленный в функции .on()
).
Ответ 9
Мне потребовалось некоторое время, чтобы понять философию этого. Событие включает в себя два объекта: слушатель и диспетчер. Поле event.data
предназначалось для использования только слушателем. Это похоже на присвоение имени номеру телефона:
$("(818)548-2733").on("incomingcall", null, "Mom", pickup);
Вы можете подобрать телефон и подождать, пока другая сторона скажет вам, что она ваша мама. Или вы можете использовать event.data
для добавления дополнительной информации, относящейся к этому событию.
Методы $.trigger
и $.triggerHandler
вызываются со стороны диспетчера события. Поэтому они не позволяют указать event.data
. Вместо этого вы можете использовать их аргумент extraParameters
.
Ответ 10
$("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");