Dispatch event with data

JavascriptEventsCustom Events

Javascript Problem Overview


I'd like to dispatch an event that will pass some data to any event listeners that listen on that event.

Considering a function that fires an event:

function click() {
  const x = 'foo'
  document.dispatchEvent(new CustomEvent('clicked'))
}

click()

How can I pass custom data to the event listener?

document.addEventListener('clicked', function(e) {
  console.log(x) // logs "foo"
})

Javascript Solutions


Solution 1 - Javascript

Perhaps you are looking for event.detail

new CustomEvent('eventName', {'detail': data})

Instead of data use x and in event listener you can access x using event.detail

function getSelectionBounds() {
  var x = (bounds["x"].toFixed(2));
  var y = "xyz";
  var selectionFired = new CustomEvent("selectionFired", {
    "detail": {"x":x,"y":y }
  });
  
  document.dispatchEvent(selectionFired);
};

document.addEventListener("selectionFired", function (e) {
  alert(e.detail.x+"   "+e.detail.y);
});

Solution 2 - Javascript

Unfortunately CustomEvent not work on IE (before Edge), but you can simply use the normal Event.

Just consider that also Event is an object, and so you can add all custom attributes you need:

 event.X = "foo";

On this way you can check your custom field on the callback function joned to the event.


NB. For old IE version you need this polyfill for new Event missed function:

var event;
if(typeof(Event) === 'function') {
  event = new Event(EVENT_NAME);
}else{
  event = document.createEvent('Event');
  event.initEvent(EVENT_NAME, false, false);
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionnicholaswminView Question on Stackoverflow
Solution 1 - Javascriptadnan kamiliView Answer on Stackoverflow
Solution 2 - JavascriptAndrea SavojardoView Answer on Stackoverflow