Home > Web Front-end > H5 Tutorial > H5 window.postMessage and cross-domain

H5 window.postMessage and cross-domain

php中世界最好的语言
Release: 2018-03-26 16:18:28
Original
2212 people have browsed it

This time I will bring you H5 window.postMessage and cross-domain, window.postMessage and cross-domain NotesWhat are the practical cases below, let’s take a look.

In the previous article, we talked about the browser's same-origin policy, which prevents pages from different domains from accessing each other's methods and attributes, and elaborated on the solutions to solve the cross-domain problem of the same-origin policy. : Subdomain proxy, JSONP, CORS. This article will elaborate on HTML5 window.postMessage. With the postMessage API, cross-domain communication can be achieved between documents in a safe and controllable manner. Third-party JavaScript code can also communicate with external documents loaded in iframes.

HTML5 window.postMessage API

HTML5 window.postMessage is a secure, event-based messaging API.

postMessageSend message

Call the postMessage method in the source window where the message needs to be sent to send the message.

Source window

The source window can be the global window object, or it can be the following type of window:

Document iframe in the window:

var iframe = document.getElementById('my-iframe');
    var win = iframe.documentWindow;
Copy after login

Pop-up window opened by JavaScript:

var win = window.open();
Copy after login

Parent window of the current document window:

var win = window.parent;
Copy after login

Open the window of the current document:

var win = window.opener();
Copy after login

After finding the source window object, you can call the postMessage API to send a message to the target window:

``win.postMessage('Hello', 'ttp://jhssdemo.duapp.com/');"
Copy after login

The postMessage function receives two parameters: the first is the message to be sent, and the second is the source of the source window. .

Note: The message can only be received when the source of the target window matches the source parameter value passed in the postMessage function.

Receive postMessage message

To receive the message previously sent by the source window through postMessage, you only need to register the message event in the target window and bind the event listening function. The message can be obtained in Function parameters.

window.onload = function() {
        var text = document.getElementById('txt');  
        function receiveMsg(e) {
            console.log("Got a message!");
            console.log("nMessage: " + e.data);
            console.log("nOrigin: " + e.origin);
            // console.log("Source: " + e.source);
            text.innerHTML = "Got a message!<br>" +
                "Message: " + e.data +
                "<br>Origin: " + e.origin;
        }
        if (window.addEventListener) {
            //为窗口注册message事件,并绑定监听函数
            window.addEventListener('message', receiveMsg, false);
        }else {
            window.attachEvent('message', receiveMsg);
        }
    };
Copy after login

The message event listening function receives a parameter, an Event object instance, which has three attributes:

  1. data The specific message sent

  2. origin Send message source

  3. source Window object reference of the send message window

Description

  1. You can set the second parameter of the postMessage function to * to skip checking the source of the message when sending a cross-domain message.

  2. postMessage can only send string information.

Example

Source window

<!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Html5 postMessage</title>
        <style>
            #otherWin {
                width: 600px;
                height: 400px;
                background-color: #cccccc;
            }
        </style>
    </head>
    <body>
        <button id="btn">open</button>
        <button id="send">send</button>
         <!-- 通过 iframe 嵌入子页面(接收消息目标窗口) --> 
         <iframe src="http://jhssdemo.duapp.com/demo/h5_postmessage/win.html" 
                     id="otherWin"></iframe> 
         <br/><br/> 
         <input type="text" id="message"><input type="button" 
                 value="Send to child.com" id="sendMessage" /> 
        <script>
            window.onload = function() {
                var btn = document.getElementById('btn');
                var btn_send = document.getElementById('send');
                var sendBtn = document.getElementById('sendMessage');
                var win;
                btn.onclick = function() {
                    //通过window.open打开接收消息目标窗口
                    win = window.open('http://jhssdemo.duapp.com/demo/h5_postmessage/win.html', 'popUp');
                }
                btn_send.onclick = function() { 
                    // 通过 postMessage 向子窗口发送数据      
                    win.postMessage('Hello', 'http://jhssdemo.duapp.com/');
                }
                function sendIt(e){ 
                    // 通过 postMessage 向子窗口发送数据
                    document.getElementById("otherWin").contentWindow 
                    .postMessage( 
                        document.getElementById("message").value, 
                        "http://jhssdemo.duapp.com/"); 
                } 
                sendBtn.onclick = function(e) {
                    sendIt(e);
                };
            };
        </script>
    </body>
    </html>
Copy after login

Target window win.html

<!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Html5 postMessage</title>
        <style>
            #txt {
                width: 500px;
                height: 300px;
                background-color: #cccccc;
            }
        </style>
    </head>
    <body>
        <h1>The New Window</h1>
        <p id="txt"></p>
        <script>        
            window.onload = function() {
                var text = document.getElementById('txt');  
                //监听函数,接收一个参数--Event事件对象
                function receiveMsg(e) {
                    console.log("Got a message!");
                    console.log("nMessage: " + e.data);
                    console.log("nOrigin: " + e.origin);
                    text.innerHTML = "Got a message!<br>" +
                        "Message: " + e.data +
                        "<br>Origin: " + e.origin;
                }
                if (window.addEventListener) {
                    //为window注册message事件并绑定监听函数
                    window.addEventListener('message', receiveMsg, false);
                }else {
                    window.attachEvent('message', receiveMsg);
                }
            };
        </script>
    </body>
    </html>
Copy after login

I believe you have mastered the method after reading the case in this article. For more exciting information, please pay attention to other related articles on the php Chinese website!

Recommended reading:

detailed explanation of phonegap obtaining location information

detailed explanation of phonegap creating contacts

The above is the detailed content of H5 window.postMessage and cross-domain. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template