iframe的用法

84 阅读1分钟

iframe在同源和不同源的情况下如何进行通讯?

同源

a页面(父页面)

<body>
    <div>
      <h1>我是父页面</h1>
      <iframe id="bFrame" src="./b.html" frameborder="no"></iframe>
      <button id="btn">获取子页面数据</button>
    </div>
  </body>
  <script>
    window.onload = function () {
      document.getElementById("btn").onclick = function () {
        //获取iframe标签
        let bFrame = document.getElementById("bFrame");
        //通过contentWindow获取子页面的数据
        console.log(
          bFrame.contentWindow.document.querySelector("h1").innerHTML
        );
      };
    };
  </script>

b页面(子页面)

<body>
    <div>
        <h1>我是子页面</h1>
        <button id="btn">获取父页面数据</button>
    </div>
</body>
<script>
    window.onload = function () {
        document.getElementById('btn').onclick = function() {
            //通过window.parent获取到父页面
            console.log(window.parent.document.querySelector('h1').innerHTML)
        }
    }
</script>

不同源

a页面(父页面)

<body>
    <h1>我是父页面</h1>
    <iframe id="bFrame" src="http://127.0.0.1:5501/b.html" frameborder="no"></iframe>
    <button id="btn">给子页面发消息</button>
</body>
<script>
    window.onload = function() {
        // 给子组件传递数据
        document.getElementById('btn').onclick = function() {
            // 先拿到iframe标签 获取contentWindow
            let bFrame = document.getElementById('bFrame')
            bFrame.contentWindow.postMessage('父组件----->子组件','http://127.0.0.1:5501')
        }

        // 接收子组件的数据
        window.onmessage = function(e) {
            console.log(e.data);
        }
    }
</script>

b页面(子页面)

<body>
    <h1>我是子页面</h1>
    <button id="btn">点击给父页面发消息</button>
</body>
<script>
    window.onload = function() {
        document.getElementById('btn').onclick = function() {
            //拿到a页面的window  通过postMessage发送数据
            window.parent.postMessage('子组件---->父组件','http://127.0.0.1:5500')
        }

        // 接收父页面的数据
        window.onmessage = function(e) {
            console.log(e.data);
        }
    }
</script>
父页面给子页面传输时

先拿到iframe标签,然后通过contentWindow.postMessage给子页面传输数据,第一个参数是要传输的数据,第二个参数是子页面的域名地址

子页面给父页面传输时

先通过window.parent拿到父页面的window,再通过window.parent.postMessage给父页面传输数据,第一个参数是要传输的数据,第二个参数是父页面的域名地址