Есть ли способ передачи дополнительных данных через пользовательские события? - PullRequest
51 голосов
/ 23 февраля 2012

Мне нужно передать данные между двумя автономными пользовательскими сценариями - в идеале, без прикосновения к объекту unsafeWindow - и я подумал, что использование пользовательских событий - это путь.Я думал о чем-то вроде этого (давайте не будем учитывать модель MSIE для целей примера):

addEventListener("customEvent", function(e) {
  alert(e.data);
});

var custom = document.createEvent("HTMLEvents");
custom.initEvent("customEvent", true, true);
custom.data = "Some data...";
dispatchEvent(custom);

Это прекрасно работает в стандартной среде javascript и в одном пользовательском сценарии, но когда событие вызываетсяПользовательский скрипт и перехваченный вне его или внутри другого пользовательского скрипта, свойство data имеет значение undefined в хроме.Полагаю, я мог бы просто сохранить переданные данные в sessionStorage, но это далеко не без проблем.Какие-нибудь другие элегантные решения, господа и господа?Совершенство нужно и можно достичь, я это чувствую.

Ответы [ 2 ]

77 голосов
/ 23 февраля 2012

Да, вы можете использовать MessageEvent или CustomEvent.

Пример использования:

//Listen for the event
window.addEventListener("MyEventType", function(evt) {
    alert(evt.detail);
}, false);

//Dispatch an event
var evt = new CustomEvent("MyEventType", {detail: "Any Object Here"});
window.dispatchEvent(evt);
7 голосов
/ 23 сентября 2014

передать объект с более подробной информацией в качестве атрибутов:

var event = new CustomEvent('build', { 'detail1': "something", detail2: "something else" });

function eventHandler(e) {
  log('detail1: ' + e.detail.detail1);
  log('detail2: ' + e.detail.detail2);
}

https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events

...