跨文档通信

1. 什么是跨文档消息传输?

即网页文档之间互相互相接收和发送消息,该功能由H5提供。
下面通过案例,简单了解一下跨文档通信。
创建两个页面,分别是a.html和b.html, a和b之间的通信(如数据传输),就是跨文档通信。

2. 案例

  • 案例1:

通过window.open打开b页面
a页面打开新窗口,并传输数据

 window.onload=function(){
            // 获取button按钮
            var btn=document.querySelector('button');
            // 获取发送数据按钮
            var sendBtn=document.querySelector('#send');
            // 点击btn 打开一个新窗口
            var win; 
            btn.onclick=function(){
                win=window.open('./B1.html')
            }
            // 点击send按钮 发送消息给B1窗口
            sendBtn.onclick=function(){
                win.postMessage('hello','*')
            }
  }
  //b页面接受传递过来的消息
  window.onmessage=function(event){
            // 接收到的数据
            console.log(e.data);
            // 数据的来源
            console.log(e.origin)
  }

注意:a页面中要先打开b页面再发送数据,b页面才能拿到数据!
b页面控制台数据:
在这里插入图片描述

案例2:
如果a页面使用a标签形式打开b页面,且在src中携带参数,b页面将如何拿到传输过来的数据呢?

//a.html 中发送传输
  <a href="./b页面.html?name=zhangsan&age=12">b页面</a>

如何将?name=zhangsan&age=12 转换成普通字符串呢?
在b页面,将参数转换成普通字符串,再把普通字符串存到数组中,有两种方法:

  1. 使用Qs工具库,直接将查询字符串准换为字符串
//引入Qs工具库
<script src="https://cdn.bootcdn.net/ajax/libs/qs/6.11.0/qs.js"></script>
 <script>
    console.log(location, '关于当前页面的信息');
    var str = location.search //?name=zhangsan&age=12
    //从给定的位置分隔字符串
    str = str.slice(1)//name=zhangsan&age=12
    console.log(Qs.parse(str));//完成转换 输出Object { name: "zhangsan", age: "12" }
 </script>
  1. 使用数组和字符串原生方法,将字符串一步一步分割:
 <script>
    console.log(location, '关于当前页面的信息');
    var str = location.search //?name=zhangsan&age=12
    str = str.slice(1)//name=zhangsan&age=12
    str = str.split('&')//['name=zhansan','age=12'}
    str=str.map(function (item) {
      return item.split('=')
    })
    console.log(str);//['name','zhangsan'],['age','12']
    var obj ={}
    str.forEach(function(item){
      console.log(item);
      
      obj[item[0]]=item[1]
    })
    console.log(obj);
  </script>

案例3:
使用内联框架实现跨文档通信:

  <script>
    window.onload = function () {
      var btn = document.querySelector('button');
      var sendBtn = document.querySelector('#send');
      var iframeBtn = document.querySelector('#iframe');
      var win;
      btn.onclick = function () {
        // 打开新页面
        win = window.open('./B1.html');
        //win.postMessage('hello', '*');
        console.log(win);
      }
      sendBtn.onclick = function () {
        //发送消息
        // win.postMessage('hello', '*');
        var obj = { name: 'zhangsan', age: 12 };
        win.postMessage(obj, 'http://127.0.0.1:5500');
        // win.postMessage('hello', 'http://127.0.0.1:5500');
        // win.postMessage('hello');
      }

      iframeBtn.onclick = function () {
        //获取b1内联窗口,使用窗口发送数据
        win = document.querySelector('iframe').contentWindow;
      }

    }
  </script>
<body>
  <button>打开B1页面(获取B1窗口)</button>
  <button id="send">发送数据</button>
  <button id="iframe">给内联框架发送消息(获取内联B1窗口)</button>
  <!-- 内联窗口  -->
  <iframe src="./B1.html" frameborder="0"></iframe>
</body>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值