iframe内嵌页面双向通信

父页面

复制代码
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>父页面</title>
</head>
<body>
  <h1>父页面</h1>
  <iframe id="childIframe" src="http://child.com/child.html" width="400" height="300"></iframe>

  <script>
    // 步骤1:获取iframe的window对象(需等iframe加载完成)
    const iframe = document.getElementById('childIframe');
    let childWindow;

    // 监听iframe加载完成
    iframe.addEventListener('load', () => {
      childWindow = iframe.contentWindow;
      console.log('iframe加载完成,可通信');
    });

    // 步骤2:监听来自iframe的消息,并派发内部自定义事件
    window.addEventListener('message', (e) => {
      // 安全校验:只接收指定域名的消息(防止恶意注入)
      if (e.origin !== 'http://child.com') return;

      console.log('父页面收到iframe消息:', e.data);

      // 派发内部自定义事件,让其他逻辑响应(解耦)
      const childMsgEvent = new CustomEvent('iframe-message', {
        detail: e.data,
        bubbles: true
      });
      document.dispatchEvent(childMsgEvent);
    });

    // 步骤3:监听内部自定义事件(业务逻辑响应)
    document.addEventListener('iframe-message', (e) => {
      console.log('父页面业务逻辑响应:', e.detail);
      // 示例:更新页面内容
      document.body.insertAdjacentHTML('beforeend', `<p>收到iframe消息:${JSON.stringify(e.detail)}</p>`);
    });

    // 步骤4:向iframe发送消息(示例:点击按钮发送)
    const sendBtn = document.createElement('button');
    sendBtn.textContent = '向iframe发送消息';
    sendBtn.addEventListener('click', () => {
      if (!childWindow) return alert('iframe未加载完成');
      // 发送消息:参数1=消息内容,参数2=目标域名(*表示任意,生产环境建议指定)
      childWindow.postMessage({ type: 'parent-msg', content: '父页面的问候' }, 'http://child.com');
    });
    document.body.appendChild(sendBtn);
  </script>
</body>
</html>

子页面

复制代码
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>iframe子页面</title>
</head>
<body>
  <h2>iframe子页面</h2>

  <script>
    // 步骤1:监听来自父页面的消息,并派发内部自定义事件
    window.addEventListener('message', (e) => {
      // 安全校验:只接收父页面域名的消息
      if (e.origin !== 'http://parent.com') return;

      console.log('iframe收到父页面消息:', e.data);

      // 派发内部自定义事件,解耦业务逻辑
      const parentMsgEvent = new CustomEvent('parent-message', {
        detail: e.data,
        bubbles: true
      });
      document.dispatchEvent(parentMsgEvent);
    });

    // 步骤2:监听内部自定义事件(业务逻辑响应)
    document.addEventListener('parent-message', (e) => {
      console.log('iframe业务逻辑响应:', e.detail);
      // 示例:更新页面内容
      document.body.insertAdjacentHTML('beforeend', `<p>收到父页面消息:${JSON.stringify(e.detail)}</p>`);
    });

    // 步骤3:向父页面发送消息(示例:点击按钮发送)
    const sendBtn = document.createElement('button');
    sendBtn.textContent = '向父页面发送消息';
    sendBtn.addEventListener('click', () => {
      // window.parent 指向父页面的window对象
      window.parent.postMessage({ type: 'child-msg', content: 'iframe的回复' }, 'http://parent.com');
    });
    document.body.appendChild(sendBtn);
  </script>
</body>
</html>

nginx配置

复制代码
# Nginx 核心配置
worker_processes  1; # Windows 下建议设为1

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    # 关闭 sendfile(Windows 下兼容性更好)
    sendfile        off;
    # 连接超时配置
    keepalive_timeout  65;

    # 父页面站点配置:parent.com
    server {
        listen       80; # 监听80端口
        server_name  parent.com; # 域名匹配

        # 字符编码(防止中文乱码)
        charset utf-8;

        # 根目录:父页面所在文件夹
        root   C:\Users\user\Desktop\iframe内嵌页面通信;
        # 默认索引页(访问 parent.com 直接打开 parent.html)
        index  parent.html index.html index.htm;

        # 访问日志(可选,便于排查问题)
        access_log  logs/parent.access.log;
        error_log   logs/parent.error.log;

        # 匹配 parent.html 的访问规则
        location = /parent.html {
            try_files $uri =404; # 确保文件存在才返回
        }
    }

    # 子页面站点配置:child.com
    server {
        listen       80;
        server_name  child.com;

        charset utf-8;

        # 根目录和父页面同文件夹(因为两个html在同一目录)
        root   C:\Users\user\Desktop\iframe内嵌页面通信;
        index  child.html index.html index.htm;

        access_log  logs/child.access.log;
        error_log   logs/child.error.log;

        location = /child.html {
            try_files $uri =404;
        }
    }
}

host配置

复制代码
127.0.0.1 parent.com
127.0.0.1 child.com

链接:

https://gitee.com/xing54321/files/blob/master/iframe内嵌页面通信.zip

相关推荐
bearpping2 小时前
Nginx 配置:alias 和 root 的区别
前端·javascript·nginx
@大迁世界2 小时前
07.React 中的 createRoot 方法是什么?它具体如何运作?
前端·javascript·react.js·前端框架·ecmascript
January12072 小时前
VBen Admin Select 选择框选中后仍然显示校验错误提示的解决方案
前端·vben
. . . . .2 小时前
前端测试框架:Vitest
前端
xiaotao1313 小时前
什么是 Tailwind CSS
前端·css·css3
颜酱3 小时前
DFS 岛屿系列题全解析
javascript·后端·算法
战南诚4 小时前
VUE中,keep-alive组件与钩子函数的生命周期
前端·vue.js
发现一只大呆瓜4 小时前
React-彻底搞懂 Redux:从单向数据流到 useReducer 的终极抉择
前端·react.js·面试
霍理迪4 小时前
Vue的响应式和生命周期
前端·javascript·vue.js