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

相关推荐
崔庆才丨静觅6 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60617 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了7 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅7 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅8 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅8 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment8 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅8 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊8 小时前
jwt介绍
前端
爱敲代码的小鱼9 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax