Подтвердить что ты не робот

Вы можете установить event.data с помощью jquery trigger

С помощью jquery.on() вы можете передать необязательный параметр для установки данных события. Можете ли вы сделать это с помощью триггера?

4b9b3361

Ответ 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");