Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to retrieve data posted using postMessage of HTML5?

I have two HTML files. In one HTML file I'm posting a message using postMessage in HTML5. How can I get the posted message in another HTML files on load?

One.html

<html>
    <head>
        <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>

        <script language="javascript">
            $(document).ready(function() {
                //post message
                var iframeWin = document.getElementById("iframe_id").contentWindow;
                iframeWin.postMessage("helloooo");
            });
        </script>

        <title>IFrame Example</title>
    </head>
    <body>
        <input id="myInput" type="hidden" value="IDDUSER">

        <iframe name="iframe" id="iframe_id" src="Two.html" height="150"></iframe>
    </body>
</html>

Two.html

<html>
    <head>
        <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>

        <script language="javascript">
            $(document).ready(function() {
                //Get posted message here
            });
        </script>

        <title>IFrame Child Example</title>
    </head>

    <body>
        <p id="received-message">I've heard nothing yet</p>
        <h1>Iframe</h1>
    </body>
</html>
like image 471
user1016403 Avatar asked Oct 04 '22 08:10

user1016403


2 Answers

HTML5 postMessage() API method has syntax as below:

userWindow.postmessage(myMessage, targetOrigin);

this will post myMessage to the window pointed by userWindow, which has targetOrigin as it's URI. If the userWindow reference matches but targetOrigin does not match with it's URI then the message will not get posted.

In the target window i.e. userWindow you can listen to the message event.

window.addEventListener('message', handlerFunction, captureBubble);

For example if you have a window reference in myWindow variable, then on source...

Call

myWindow.postMessage('this is a message', 'http://www.otherdomain.com/');

Callback handling

window.addEventListener("message", receiveMessage, false);

function receiveMessage(event){
  if (event.origin !== 'http://www.otherdomain.com/')
    return;
  // this check is neccessary 
  // because the `message` handler accepts messages from any URI

  console.log('received response:  ',event.data);
}

and on target...

Message handler

window.addEventListener("message", receiveMessage, false);

function receiveMessage(event){
  if (event.origin !== 'http://www.callingdomain.com/')
    return;

  console.log('received message:  ',event.data);
  event.source.postMessage('this is response.',event.origin);
}

postMessage API Reference - MDN

A nice tutorial

like image 119
Faisal Sayed Avatar answered Oct 12 '22 12:10

Faisal Sayed


You have to listen for the message event on the window object in the child iframe. Also, postMessage takes 2 parameters, message & domain.

One.html

<html>
  <head>
    <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>

    <script language="javascript">
      $(document).ready(function() {
        $('#clickMe').click(function() {
          //post message
          var iframeWin = document.getElementById("iframe_id").contentWindow;
          iframeWin.postMessage("helloooo","*");
        });
      });
    </script>

    <title>IFrame Example</title>
  </head>
  <body>
    <input id="myInput" type="hidden" value="IDDUSER">
    <button id="clickMe">Click Me</button>

    <iframe name="iframe" id="iframe_id" src="Two.html" height="150"></iframe>
  </body>
</html>

Two.html

<html>
  <head>
    <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>

    <script language="javascript">
      $(document).ready(function() {
        $(window).on('message', function(evt) {
          $('#received-message').html(evt.originalEvent.data);
        });
      });
    </script>

    <title>IFrame Child Example</title>
  </head>

  <body>
    <p id="received-message">I've heard nothing yet</p>
    <h1>Iframe</h1>
  </body>
</html>
like image 29
shyam Avatar answered Oct 12 '22 10:10

shyam