iframe跨域、通信解决方案

1,266 阅读1分钟

1.简述基本用法

HTML内联框架元素 () 表示嵌套的browsing context。它能够将另一个HTML页面嵌入到 当前页面

<iframe id="iframeId" title="测试" width="300" height="200" src="https://juejin.cn/" />

2.iframe通信那些事

1. 利用nginx服务进行转发,解决iframe跨域 ``

iframe.png

2. iframe和父页面之间的数据传递

Tips:

  1. html页面给iframe发送消息时,如果需要在页面初始化发送消息,即需要在onload事件发送消 息,防止iframe页面未初始化完成导致发送消息失败
  2. iframe给html发送消息,需要拿到父页面的window, 即可以在html发送消息给iframe页面时候,保存event
// 1.父页面代码示例
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>父页面</title>
    </head>
    <body>
    <p onclick="sendIframeMsg()">主页面</p>
    <iframe
        name="iframeId"
        id="iframeId"
        src="iframe.html"
        width="400px"
        height="400px"
    />
    <script type="text/javascript">
        // 父页面监听子页面iframe传递的消息
        window.addEventListener('message', function(event) {
                const { data } = event
                console.log('接收iframe页面发送的消息', data)
        }, false)
        // 主页面发送消息给iframe页面
        function sendIframeMsg () {
            var receiver = document.getElementById('iframeId').contentWindow;
            const origin = '<http://127.0.0.1:8848/apiTest/iframe.html>' // iframe地址
            receiver.postMessage('sendMessage from iframe', origin)
        }
    </script>
    </body>
</html>
// 2.iframe页面代码示例
<!DOCTYPE html>
<html>
	<head>
            <meta charset="utf-8">
            <title>iframe</title>
	</head>
	<body>
        <p onclick="sendMessage()">iframe页面</p>
        <script type="text/javascript">
            var parentEvent  = null  // 当前变量很重要
            // 子页面触发事件给父页面发送消息
            function sendMessage() {
                parentEvent.source.postMessage('iframe发送消息给父页面',parentEvent.origin);
            }
            // iframe页面监听html页面发送的消息
            window.addEventListener('message', function(event){
                    const { origin, data,  } = event
                    parentEvent  = event
            }, false)
        </script>
	</body>
</html>

3.和a标签的联动

和a标签的联动

<a src="./test.html"  taeget="iframeId">业务办理</a> // iframe部分代码 <iframe name="iframeId" id="iframeId" src="./test.html"></iframe>
1.iframe页面的window.name === 父页面(子页面)的window.name 时, 
  a标签的target设置为iframe的name或者是ID时,点击a标签,iframe的内容为a标签设置的src属性的内容。
  
2.iframe页面的window.name !== 父页面(子页面)的window.name 时,
  此时由于不想等,导致当前a标签的target会失效,导致点击a标签时,浏览器会新建标签页面

因为这个问题导致我在客户现场三天

4.结尾:

经过上述的问题,自己对于iframe理解的更加深刻了,希望自己坚持,加油加油

Untitled.png