前端html中iframe的基本使用

以下是一个比较复杂的 <iframe> 示例,展示了如何加载外部页面、控制样式和与 <iframe> 中加载的文档进行通信:

html 复制代码
<!DOCTYPE html>
<html>
<head>
  <style>
    .iframe-container {
      position: relative;
      width: 100%;
      height: 500px;
    }

    .overlay {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-color: rgba(0, 0, 0, 0.5);
      display: flex;
      justify-content: center;
      align-items: center;
      color: #fff;
      font-size: 24px;
    }
  </style>
</head>
<body>
  <div class="iframe-container">
    <iframe src="https://www.example.com" frameborder="0" width="100%" height="100%"></iframe>
    <div class="overlay">Loading...</div>
  </div>

  <script>
    const iframeRef = document.querySelector('iframe');
    const overlay = document.querySelector('.overlay');
    // 监听iframe加载完成的load事件
    iframeRef.addEventListener('load', function() {
      overlay.style.display = 'none'; // 移除loading
    });
    
    function sendMessageToIframe() {
      const message = 'Hello from parent window!';
      // 通过通过父窗口找到子窗口的window, 再向子窗口发送消息。
      iframeRef.contentWindow.postMessage(message, '*');
    }
    // 父窗口 监听子窗口发出的消息(如果有;不是上面那行)
    window.addEventListener('message', function(event) {
      if (event.source === iframeRef.contentWindow) {
        const receivedMessage = event.data;
        console.log('Received message from iframeRef:', receivedMessage);
      }
    });
  </script>
</body>
</html>

在上述示例中,我们创建了一个包含 <iframe> 的容器,通过 CSS 控制容器的样式和尺寸。同时,我们添加了一个覆盖层(overlay),用于在 <iframe> 加载期间显示加载信息。

在上面的代码片段中,iframeRef 是父窗口(当前窗口)中的一个引用,通过 iframeRef.contentWindow 可以访问到子窗口的 window 对象。

因此,postMessage的作用是 父窗口向子窗口发送了一条消息。

在这种情况下,父窗口是通过 <iframe> 元素嵌入子窗口的,可以通过 iframeRef 元素的 contentWindow 属性来访问子窗口的 window 对象,并与子窗口进行通信。

在 JavaScript 部分,我们使用事件监听器和 postMessage() 方法实现了与 <iframe> 中加载的文档的通信。具体来说:

  1. 通过监听 <iframe>load 事件,当页面加载完成时,隐藏覆盖层,显示 <iframe> 中加载的内容。

  2. 在父窗口中定义了一个名为 sendMessageToIframe() 的函数,用于向 <iframe> 发送消息。

  3. 在父窗口中监听 message 事件,当接收到来自 <iframe> 的消息时,打印消息内容。

需要注意的是,由于跨域安全策略的限制,父窗口只能与同源的 <iframe> 进行通信。此示例中的通信是在同一个域名下进行的,因此没有出现跨域问题。

相关推荐
程序员黑豆36 分钟前
Java包装类:基本类型与对象的桥梁
java·前端·ai编程
bugcome_com3 小时前
JWT 知识小课堂:从入门到精通,一文吃透 JSON Web Token
前端·json
To_OC3 小时前
写了三天 Next.js,我的 React 世界观被拆了又装回去
前端·全栈·next.js
独泪了无痕4 小时前
viewer.js 安装与配置指南:实现图片预览功能
前端·vue.js
Fluxart.ai6 小时前
电商商品图审核怎么自动化?规则引擎、人工复核与发布门禁
java·前端·自动化
why技术6 小时前
AI 写的文章,可能都带着手敲一遍都去不掉的“隐形水印”。
前端·人工智能·后端
愚公搬代码6 小时前
【愚公系列】《Android应用案例开发大全》016-LBS类应用掌上杭州(辅助工具类的开发)
android·前端
CodeSheep6 小时前
又一个华为天才少年,离职了!
前端·后端·程序员
kyriewen7 小时前
面试官说"打开你的AI工具"——我才发现,他考的根本不是写代码
前端·人工智能·面试
IT_陈寒8 小时前
Vue的双向绑定把我坑惨了,原来这个场景不能用
前端·人工智能·后端