JavaScript Worker message Event

Beginner
⏱️ 10 min read
📚 Updated: Jul 2026
🎯 5 Examples
🚀 5 Try-it labs
Baseline Widely available
Instance event

What You’ll Learn

The message event of the Worker interface fires when the parent receives a message from its worker (the worker called self.postMessage(...)). Learn onmessage vs addEventListener("message"), MessageEvent.data, and how it differs from error—with five examples and try-it labs.

01

Kind

Instance event

02

Name

message

03

Type

MessageEvent

04

Handler

onmessage

05

Payload

event.data

06

Status

Baseline widely

Introduction

A dedicated worker cannot update the DOM directly. It talks to the main page by posting messages. When the worker sends data with self.postMessage(...), the main thread’s Worker object fires a message event.

That is the happy path for background work: you send a job with postMessage() on the Worker, and you receive the answer on message via event.data.

💡
Beginner tip

Success uses the message event (event.data). Failures use the error event. Listen for both when you depend on a worker.

Understanding the Worker message Event

An instance event on Worker that fires when the worker’s parent receives a message from that worker.

  • Event name"message".
  • Handler propertyworker.onmessage.
  • Listenerworker.addEventListener("message", handler).
  • Event type — a MessageEvent (inherits from Event).
  • Not cancellable and does not bubble (per MDN).
  • Baseline Widely available on MDN (since July 2015); available in Web Workers except Service Workers.

📝 Syntax

Use the event name in methods like addEventListener(), or set an event handler property.

JavaScript
addEventListener("message", (event) => { })

onmessage = (event) => { }

Event type

A MessageEvent. The property you use most often is event.data.

Event properties (MessageEvent)

PropertyMeaning
dataValue sent by the worker (read-only)
originOrigin of the message emitter
lastEventIdUnique ID string for the event
sourceEmitter (WindowProxy, MessagePort, or ServiceWorker)
portsRelated MessagePort objects (channel messaging / shared workers)

Typical pattern

JavaScript
const worker = new Worker("worker.js");

worker.onmessage = (event) => {
  console.log(`Received message from worker: ${event.data}`);
};

// Inside worker.js:
// self.postMessage("I'm alive!");

⚡ Quick Reference

GoalCode / note
Handler propertyworker.onmessage = (e) => { … }
addEventListenerworker.addEventListener("message", handler)
Read payloadevent.data
Worker sendsself.postMessage(value)
Bubbles / cancelableNo / No
MDN statusBaseline Widely available (since July 2015)

🔍 At a Glance

Four facts to remember about the Worker message event.

Fires
on reply

From the worker

Listen
onmessage

Or addEventListener

Payload
event.data

MessageEvent

Baseline
widely

Since Jul 2015

Examples Gallery

Examples follow MDN Worker: message event. Labs use blob workers so you can try everything in one HTML file.

📚 Getting Started

Attach handlers the two standard ways (MDN patterns).

Example 1 — addEventListener("message") (MDN Idea)

Create a worker and listen for replies with addEventListener.

JavaScript
const worker = new Worker(url);

worker.addEventListener("message", (event) => {
  console.log(`Received message from worker: ${event.data}`);
});
Try It Yourself

How It Works

When the worker runs self.postMessage("I'm alive!"), your listener receives a MessageEvent.

Example 2 — onmessage Handler Property

Same event using the handler property (also shown on MDN).

JavaScript
const worker = new Worker(url);

worker.onmessage = (event) => {
  console.log(`Received message from worker: ${event.data}`);
};
Try It Yourself

How It Works

Prefer addEventListener when several modules must listen; onmessage is fine for a single owner.

📈 Payloads & Round-Trips

Read structured data, ping-pong with the worker, and contrast with errors.

Example 3 — Read event.data Objects

Workers can post strings, numbers, arrays, and plain objects (structured clone).

JavaScript
worker.onmessage = (event) => {
  const { type, value } = event.data;
  console.log(type, value);
};

// Worker: self.postMessage({ type: "result", value: 42 });
Try It Yourself

How It Works

A small { type, … } envelope keeps protocols clear as your worker grows.

Example 4 — Round-Trip (Main ↔ Worker)

Main posts a job; the worker replies; message delivers the answer.

JavaScript
worker.onmessage = (e) => console.log("reply:", e.data);
worker.postMessage(3);

// Worker:
// self.onmessage = (e) => self.postMessage(e.data * 2);
Try It Yourself

How It Works

This is the usual worker pattern: send work out, update the UI when message fires.

Example 5 — message vs error

A healthy worker replies on message; a throwing worker fires error.

JavaScript
worker.onmessage = (e) => console.log("ok:", e.data);
worker.onerror = (e) => {
  console.log("fail:", e.message || "error");
  e.preventDefault();
};
Try It Yourself

How It Works

Wire both handlers so success and failure each have a clear path. See also the error tutorial.

🚀 Common Use Cases

  • Show progress or results from a heavy calculation.
  • Receive parsed JSON / image processing results off the main thread.
  • Keep a chatty protocol with typed envelopes ({ type, payload }).
  • Update charts after a worker finishes aggregating data.
  • Confirm a worker started with a simple “I'm alive!” ping.

🔧 How It Works

1

Worker posts

Inside the worker, self.postMessage(value) sends structured-clone data.

Send
2

message event fires

The Worker object on the main thread receives a MessageEvent.

Event
3

Your handler runs

onmessage / addEventListener callbacks execute on the main thread.

Handle
4

Use event.data

Update the UI with the cloned value the worker sent.

📝 Notes

  • MDN: Baseline Widely available (since July 2015) — no Deprecated / Experimental / Non-standard banner.
  • Available in Web Workers except Service Workers.
  • Event type is MessageEvent; primary field is event.data.
  • Not cancellable and does not bubble.
  • Related learning: postMessage(), messageerror, error, Worker(), addEventListener().

Universal Browser Support

The Worker message event is marked Baseline Widely available on MDN (since July 2015). Logos use the shared browser-image-sprite.png sprite from this project. It is available in Web Workers except Service Workers.

Baseline · Widely available

Worker message event

Fires when the parent receives a message from its worker. Listen with onmessage or addEventListener("message").

Universal Widely available
Google Chrome Full support · Desktop & Mobile
Full support
Mozilla Firefox Full support · Desktop & Mobile
Full support
Apple Safari Full support · macOS & iOS
Full support
Microsoft Edge Full support · Chromium
Full support
Opera Full support · Modern versions
Full support
Internet Explorer Supported with workers in IE10+ (prefer modern browsers)
Legacy
Worker message Excellent

Bottom line: Always attach a message handler when you expect replies—and pair it with an error handler for failures.

Conclusion

The Worker message event is how the main thread receives successful replies from a dedicated worker. Read event.data, update the UI, and pair it with the error event for failures.

Continue with messageerror, error, postMessage(), or the JavaScript hub.

💡 Best Practices

✅ Do

  • Attach onmessage / listeners before expecting replies
  • Read results from event.data
  • Use a typed envelope for multi-step protocols
  • Also listen for error in production
  • Clean up with terminate() when the feature is done

❌ Don’t

  • Confuse event.data with error’s event.message
  • Assume the worker can touch the DOM
  • Overwrite onmessage accidentally in shared helpers
  • Ignore structured-clone limits (functions, DOM nodes, etc.)
  • Leave the UI waiting with no timeout or error handler

Key Takeaways

Knowledge Unlocked

Five things to remember about Worker message

Main-thread signal that the worker replied.

5
Core concepts
📌02

onmessage

or listener

Listen
📄03

event.data

MessageEvent

Payload
⚠️04

≠ error

separate channel

Compare
🎯05

Baseline

since Jul 2015

Status

❓ Frequently Asked Questions

It fires on the Worker object when the main thread receives a message from the worker—typically after the worker calls self.postMessage(...). Listen with worker.onmessage or worker.addEventListener("message", handler).
No. MDN marks the Worker message event as Baseline Widely available (since July 2015). It is not Deprecated, Experimental, or Non-standard. It is available in Web Workers except Service Workers.
A MessageEvent (inherits from Event). The payload you care about most is event.data—the value the worker posted.
message delivers successful postMessage data as event.data. error reports that the worker script failed. Listen for both when you depend on a worker.
No. Per MDN, this event is not cancellable and does not bubble.
On the Worker object created with new Worker(...), before or as soon as you expect replies. Inside the worker, send with self.postMessage(...).
Did you know?

Data crosses the boundary with the structured clone algorithm—not JSON.stringify. Most plain objects clone fine; functions, DOM nodes, and some exotic types do not.

Next: messageerror event

Learn what happens when a worker reply cannot be deserialized.

messageerror event →

About the author

Mari Selvan M P
Mari Selvan M P 🔗

Developer, cloud engineer, and technical writer

  • Experience 12 years building web and cloud systems
  • Focus Full Stack Development, AWS, and Developer Education

I write practical tutorials so students and working developers can learn by doing—from databases and APIs to deployment on AWS.

5 people found this page helpful