web-dev-qa-db-fra.com

Existe-t-il un moyen de transmettre des données supplémentaires via des événements personnalisés?

J'ai besoin de transmettre des données entre deux scripts utilisateur autonomes - idéalement sans toucher à l'objet unsafeWindow - et je pensais que l'utilisation d'événements personnalisés serait la voie à suivre. J'ai pensé à quelque chose comme ça (ignorons le modèle MSIE dans le cadre de l'exemple):

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

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

Cela fonctionne bien dans l'environnement javascript standard et dans un script utilisateur, mais lorsque l'événement est déclenché par le script utilisateur et pris en dehors de celui-ci ou dans un autre script utilisateur, la propriété data est undefined en chrome. Je suppose que je pourrais simplement enregistrer les données transmises dans le sessionStorage, mais c'est loin d'être transparent. D'autres solutions élégantes, messieurs et femmes douces? La perfection a besoin et peut être atteinte, je la sens.

54
Witiko

Oui, vous pouvez utiliser un MessageEvent ou un CustomEvent .

Exemple d'utilisation:

//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);
83
Digital Plane

passez l'objet avec plus de détails comme attributs:

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

8
Amit G