美文网首页
js-window.postMessage

js-window.postMessage

作者: Jianshu9527 | 来源:发表于2018-07-16 21:05 被阅读62次
    window.postMessage是HTML5中新增的一个API(不能低于IE8),postMessage方法允许来自不同源的脚
    本采用异步方式进行有限的通信 ,使其可以实现跨文本档、多窗口、跨域消息传递,这个API为 window 对象
    新增了一个window.postMessage方法,允许跨窗口通信,无论当前两个窗口否是同源。
    

    一、postMessage( val1, val2 )
    1 val1:传递的信息对象
    2 val2:接受信息的窗口源(origin)协议+域名+端口号,如果设置为” * “表示不限制窗口源,向所有窗口源发送。

    二、CODE

    • 父级页面给子级页面传参
    //a.html
    <body>
        <div class='body'>
            <div class='left'>
                <p>LEFT</p>
                <button id='iframeEvent'>给子级页面传参</button>
            </div>
            <div class='right'>
                <iframe id='ifrA' src="b.html" frameborder="0" 
                width='100%' height='100%'></iframe>
            </div>
        </div>
        <script>
            var ifr = document.getElementById('ifrA');
            var send = document.getElementById('iframeEvent');
            //父级页面发送参数
            send.addEventListener('click', function() {
                var url = 'http://127.0.0.1:5500/b.html';//地址必须为服务器地址(本地文件打开无效)
                var val = '我是父级页面过来的参数';//传递的参数
                ifr.contentWindow.postMessage(val, url)
            }, false)
        </script>
    </body>
    
    //b.html
    <body>
        <p class='title'>我是子级页面</p>
        <script>
            window.addEventListener('message', function(event) {
                var url = 'http://127.0.0.1:5500';//指定的源
                if (event.origin != url) {//判断是否来自指定源
                    return;
                }
                console.log(event.data);//读取传递过来值
            }, false)
        </script>
    </body>
    
    父页面给子级页面传参.png
    • 子级页面给父级页面传参
    //a.html
    <body>
        <div class='body'>
            <div class='right'>
                <iframe id='ifrA' src="b.html" frameborder="0" 
                width='100%' height='100%'></iframe>
            </div>
        </div>
        <script>
            //接送参数
            window.addEventListener('message', function(e) {
                var url = 'http://127.0.0.1:5500';
                if (e.origin != url) {
                    return;
                }
                console.log(e.data);
            }, false)
        </script>
    </body>
    
    //b.html
    <body>
        <button class='childPage'>给父页面传递参数</button>
        <script>
            //发送子级页面的参数给父级页面
            var btnEvent = document.querySelector('.childPage');
            var data = '我是子级页面传递过来的参数';
            btnEvent.addEventListener('click', function(e) {
                window.parent.postMessage(data, 'http://127.0.0.1:5500/a.html')
            }, false)
        </script>
    </body>
    
    子级页面给父级页面传参数.png
    • 完整的两个窗口通信
    //a.html
    <body>
        <div class='body'>
            <div class='left'>
                <p>LEFT</p>
                <button id='iframeEvent'>给子级页面传参</button>
            </div>
            <div class='right'>
                <iframe id='ifrA' src="b.html" frameborder="0" 
                width='100%' height='100%'>
                </iframe>
            </div>
        </div>
        <script>
            var ifr = document.getElementById('ifrA');
            var send = document.getElementById('iframeEvent');
            //给子级页面发送消息
            send.addEventListener('click', function() {
                var val = '我是父级页面过来的参数';
                ifr.contentWindow.postMessage(val, 'http://127.0.0.1:5500/b.html')
            }, false)
    
            //接送参数
            window.addEventListener('message', function(e) {
                var url = 'http://127.0.0.1:5500';
                if (e.origin != url) {
                    return;
                }
                console.log(e.data);
            }, false)
        </script>
    </body>
    
    //b.html
    <body>
        <p class='title'>我是子级页面</p>
        <button class='childPage'>给父页面传递参数</button>
        <script>
            //接受父级页面传递过来的参数
            window.addEventListener('message', function(event) {
                var url = 'http://127.0.0.1:5500';
                if (event.origin != url) {
                    return;
                }
                console.log(event.data);
            }, false)
    
            //发送子级页面的参数给父级页面
            var btnEvent = document.querySelector('.childPage');
            var data = '我是子级页面传递过来的参数';
            btnEvent.addEventListener('click', function(e) {
                window.parent.postMessage(data, 'http://127.0.0.1:5500/a.html')
            }, false)
        </script>
    </body>
    

    相关文章

      网友评论

          本文标题:js-window.postMessage

          本文链接:https://www.haomeiwen.com/subject/gouppftx.html