files/en-us/web/api/messageport/postmessage/index.md
{{APIRef("Channel Messaging API")}} {{AvailableInWorkers}}
The postMessage() method of the
{{domxref("MessagePort")}} interface sends a message from the port, and optionally,
transfers ownership of objects to other browsing contexts.
postMessage(message)
postMessage(message, transfer)
postMessage(message, options)
message
: The message you want to send through the channel. This can be of any basic data type. Multiple data items can be sent as an array.
[!NOTE] Execution contexts that can message each other may not be in the same agent cluster, and therefore cannot share memory. {{jsxref("SharedArrayBuffer")}} objects, or buffer views backed by one, cannot be posted across agent clusters. Trying to do so will generate a {{domxref("BroadcastChannel/messageerror_event", "messageerror")}} event containing a
DataCloneError{{domxref("DOMException")}} on the receiving end.
transfer {{optional_inline}}
options {{optional_inline}}
transfer {{optional_inline}}
transfer parameter.None ({{jsxref("undefined")}}).
In the following code block, you can see a new channel being created using the
{{domxref("MessageChannel.MessageChannel", "MessageChannel()")}} constructor. When the
IFrame has loaded, we pass {{domxref("MessageChannel.port2")}} to the IFrame using
{{domxref("window.postMessage")}} along with a message. The iframe receives the message,
and sends a message back on the MessageChannel using postMessage().
The handleMessage handler then responds to a message being sent back from the iframe using
onmessage, putting it into a paragraph —
{{domxref("MessageChannel.port1")}} is listened to, to check when the message arrives.
const channel = new MessageChannel();
const para = document.querySelector("p");
const ifr = document.querySelector("iframe");
const otherWindow = ifr.contentWindow;
ifr.addEventListener("load", iframeLoaded);
function iframeLoaded() {
otherWindow.postMessage("Transferring message port", "*", [channel.port2]);
}
channel.port1.onmessage = handleMessage;
function handleMessage(e) {
para.innerHTML = e.data;
}
// in the iframe…
window.addEventListener("message", (event) => {
const messagePort = event.ports?.[0];
messagePort.postMessage("Hello from the iframe!");
});
For a full working example, see our channel messaging basic demo on GitHub (run it live too).
{{Specifications}}
{{Compat}}