O'Reilly

window.postMessage Tip: Child-To-Parent Communication

By on  

I wrote a super epic post a few months back about the window.postMessage API that's sweeping the nation.  window.postMessage allows you to send messages not only across frames (regular frame or iframe) but also across domains.  My post showed interaction from parent to child and back to the parent, but didn't detail passing messages from a child to a parent without the parent initializing the conversation.  Let me show you how you can initialize that conversation from child to parent

window.postmessage

The JavaScript

The parent object provides a reference to the main window from the child.  So if I have an iFrame and console the parent within it, the console will read:

// Every two seconds....
setInterval(function() {
	// Send the message "Hello" to the parent window
	// ...if the domain is still "davidwalsh.name"
	parent.postMessage("Hello","http://davidwalsh.name");
},1000);

Since we now have hold of the window, we can postMessage to it:

// Create IE + others compatible event handler
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";

// Listen to message from child window
eventer(messageEvent,function(e) {
  console.log('parent received message!:  ',e.data);
},false);

The directive above triggers the iFrame to send a message to the parent window every 3 seconds.  No initial message from the main window needed!

Track.js Error Reporting

Recent Features

  • Camera and Video Control with HTML5

    Client-side APIs on mobile and desktop devices are quickly providing the same APIs.  Of course our mobile devices got access to some of these APIs first, but those APIs are slowly making their way to the desktop.  One of those APIs is the getUserMedia API,...

  • Responsive Images: The Ultimate Guide

    Chances are that any Web designers using our Ghostlab browser testing app, which allows seamless testing across all devices simultaneously, will have worked with responsive design in some shape or form. And as today’s websites and devices become ever more varied, a plethora of responsive images...

Incredible Demos

  • Introducing MooTools NextPrev

    One thing I love doing is duplicating OS functionalities. One of the things your OS allows you to do easily is move from one item to another. Most of the time you're simply trying to get to the next or the previous item....

  • jQuery Wookmark

    The first thing that hits you when you visit Pinterest is "Whoa, the columns are the same width and the photos are cut to fit just the way they should."  Basic web users probably think nothing of it but as a developer, I can appreciate the...

Discussion

  1. kevin

    Great article, It worked great on iFrame resizing…WOO HOO! after many failed posts and other methods, this one was so simple.

  2. Stanton W. Jones

    Hey,

    So I’ve scoured the usual forums for a solution to cross-domain iframe communication, and nothing has worked. Not copy/paste, not my own code, not even on the same domain. A lot can change in a year ( haven’t found an article published in 2012 that tells me how to implement this) but I am in deep need of a sanity check.

    –SWJ

  3. Hi,
    My outside of iframe facny box is not working in chrome.so how to solve that problem.

  4. Baker

    Hi David,

    Thanks man. I’ve been looking for a solution for iframe resizing across domains since yesterday. I’ve finally found it.

    Really appreciate it.
    Cheers

  5. karstrasse

    Hi,

    I am getting an error:

    Uncaught TypeError: Object # has no method 'postMessage' even though I am able to get the iframe and its details.

  6. Hey, it looks and works great but on IE, action passed received is undefined.

    parent.postMessage({'action':'RESIZE', 'height':height}, '*');
    

    but here this Action: RESIZE is undefined in postmessage on IE

  7. Abhi

    How do i post the message from iframe which contains https page to a parent page which is http? Even the domains are different? Any idea?

  8. coderone

    It just works :)

  9. Gopinath

    Some browsers supports only ‘string’ message than any other objects(Eg:JSON)

    • Nerudo

      You can simply use

      JSON.stringify(yourJSONObject);
      
  10. john

    Could you do it like this also?

    //the iframe code
    setInterval(function() {
    	parent.postMessage("Hello","http://davidwalsh.name");
    },1000);
    
    //The parent code
    $(window).on('message', function(e){
      console.log('parent received message!:  ',e.data);
    });
    
  11. Pandi

    Hi
    Can postmessage work for HTTPSHTTPS communications?

  12. Mariano

    Thanks, it was very useful and simple.

  13. yatin

    How to pass message to child ifrmae? I want to get cookie form 3rd party website to child iframe. I have access over script at 3rd party throught which i register iframe and some functions at client end. how to access cookie?

    Thanks.

    • Sheena

      Hi did you find a solution for your question. I also have to do the same

  14. var wd_iframeWin = document.getElementById("iframe_id").contentWindow;
    	
    	wd_iframeWin.postMessage(JSON.stringify({"third_party_cookie":wd_getCookie(cookiename)}), "*");

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!

Recently on David Walsh Blog

  • Loading Static Templates for Intern Testing

    I use Intern by SitePen for all of my JavaScript functional testing.  Intern has loads of features other functional test frameworks don't and it's completely Promise-based -- something I got very used to when I used the Dojo Toolkit every day. Async test creation can...

  • Convert Video to mp3

    Let's all be honest for a moment:  we've all ... not paid for ... music.  Whether it was via a file sharing app like Kazaa or Napster, or it was downloading and seeding on bittorrent, or maybe even downloading a music video and ripping its audio,...

  • Sort git Branches by Date

    I'll be first person to admit I don't do as much git repository maintenance as I should.  I rarely delete branches which have been merged, so a git branch execution shows me a mile-long list of branches that likely aren't relevant.  The best way to find branches I've recently...

  • Best Tools and Resources for Web Professionals in 2015

    Looking for the right resources to help you satisfy the needs of your clients? On the lookout for the best tools to help you increase your revenue? Searching for the right software to help you improve your business? Well, then you’ve come to the right place....

  • JavaScript Polling

    Polling with JavaScript is one of those ugly but important functions within advanced front-end user experience and testing practices.  Sometimes there isn't the event you can hook into to signify that a given task is complete, so you need to get your hands dirty and simply poll for...