Iframe跨窗口通信原理详解

yizhihongxing

Iframe跨窗口通信原理详解

什么是Iframe?

Iframe又被称为内嵌框架,是一种可以将另一个HTML文档嵌入到当前HTML文档的标记。它可以将不同的网页嵌到同一个网页上,使得网页具有嵌套性。

Iframe的跨窗口通信原理

Iframe内部的网页区域和外部的网页区域是完全隔离的,就算是运行在同一个主域名下,它们之间也无法直接通讯。对此,Iframe提供了两种通讯方式:postMessage和window.name

postMessage

// 在父级网页中给Iframe子网页发送一个小序列
var targetOrigin = "http://www.child.com";
var data = {title:"postMessage", message:"Hello, world!"};
window.frames[0].postMessage(data, targetOrigin);

// 在子级网页中接收来自父亲网页的消息
window.onmessage = function(e){
    if (e.origin === "http://www.father.com"){
        console.log(e);
        var data = e.data;
        console.log(data.title);
        console.log(data.message);
    }
}

window.name

// 在父级网页中获取子级网页的数据
var win = window.open("http://www.child.com");
console.log(win); // 输出 Window /_<random-number>

setTimeout(function(){
    console.log(win.name); // 输出子级窗口数据
    win.name = "I'm father!";
}, 2000);

// 在子级网页中获取数据
console.log(window.name); // 输出空字符串
setTimeout(function(){
    window.name = "Hello, child!";
}, 2000);

// 在父级网页中获取子级网页的数据
setTimeout(function(){
    console.log(win.name); // 输出子级网页数据
    win.close(); //关闭子级窗口
}, 4000);

以上是通过window.post方法和window.name属性在Iframe子级网页和父亲网页间的通信。

示例

下面是一个用Iframe实现的简单的购物车示例。我们在主网页中嵌入Iframe,Iframe中的内容是一个商品详情页和加入购物车功能。当用户点击商品详情页中的“加入购物车”按钮时,Iframe中的加入购物车功能会将商品信息传递给主网页,主网页再将商品信息展示在购物车中。

<!-- 父级网页 -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>购物车示例</title>
</head>
<body>
    <h1>商品列表</h1>
    <ul>
        <li>
            <h3>商品1</h3>
            <p>价格:10元</p>
            <iframe src="product.html"></iframe>
        </li>
        <li>
            <h3>商品2</h3>
            <p>价格:20元</p>
            <iframe src="product.html"></iframe>
        </li>
        <li>
            <h3>商品3</h3>
            <p>价格:30元</p>
            <iframe src="product.html"></iframe>
        </li>
    </ul>
    <div id="cart">
        <h2>购物车</h2>
        <ul id="cart-list"></ul>
    </div>
    <script>
        window.addEventListener('message', function(e){
            if(e.origin === 'http://localhost:3000'){
                var data = e.data;
                var li = document.createElement('li');
                li.textContent = data.title + ":价格 " + data.price + " 元";
                document.getElementById('cart-list').appendChild(li);
            }
        });
    </script>
</body>
</html>
<!-- 子级网页 -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>商品详情页</title>
</head>
<body>
    <h2>商品详情</h2>
    <p>商品的详细信息</p>
    <button onclick="addToCart()">加入购物车</button>
    <script>
        function addToCart(){
            var data = {
                title: "商品1",
                price: 10
            };
            window.parent.postMessage(data, 'http://localhost:3000');
        }
    </script>
</body>
</html>

在这个示例中,主网页通过Iframe加载商品详情网页,当用户点击商品详情页的“加入购物车”按钮时,子级网页通过postMessage方法将商品信息传递给主网页,主网页接收到消息后将商品信息展示在购物车中。

总结

使用Iframe可以实现网页嵌套,并且可以通过postMessage或window.name实现Iframe内部网页和外部网页的通讯,实现跨窗口通信。在实际应用中,可以使用Iframe实现网站的模块化开发,将不同的业务模块拆分为不同的嵌套网页,从而提高网站的可维护性和扩展性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Iframe跨窗口通信原理详解 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • Discuz .net版本中的短消息系统

    Discuz .net是一款知名的论坛程序,其短消息系统是其重要的功能之一。本文将详细讲解Discuz .net版本中的短消息系统,包括如何创建、管理和使用短消息系统。 创建和启用短消息系统 在Discuz .net中,默认情况下是已经启用了短消息系统的,而且用户可以在论坛的任何页面中通过左上角的“短消息”链接进入短消息系统。如果管理员需要修改短消息系统的设…

    JavaScript 2023年6月11日
    00
  • JS 两个字符串时间的天数差计算

    当我们需要计算两个字符串表示的时间之间相差的天数时,我们需要先将字符串转换为日期对象,比较两个日期对象之间的天数差。 以下是详细的步骤: 步骤一:将字符串转换为日期对象 使用Date()方法将字符串转换为日期对象,语法如下: var date1 = new Date(‘2019-01-01’); var date2 = new Date(‘2019-01-0…

    JavaScript 2023年5月27日
    00
  • HTML实现双11抢劵(设定时间打开抢券的页面)

    实现双11抢劵的功能,需要用到HTML语言和JavaScript脚本。 具体步骤如下: 在HTML文件中添加一个按钮,设置其id为”open-btn”,用于点击后打开抢券页面: <button id="open-btn">打开抢券页面</button> 在JavaScript文件中,为按钮绑定click事件,用于判…

    JavaScript 2023年6月10日
    00
  • javascript利用正则快速找出两个字符串的不同字符

    JavaScript利用正则表达式可以快速找出两个字符串的不同字符,具体的步骤如下: 首先将两个字符串的长度进行比较,以较短的字符串长度为基准。 对两个字符串进行遍历,比较对应字符是否相等,如果不相等,就将差异字符记录下来。 利用正则表达式去重,即将记录下来的差异字符进行去重操作。 下面是两个示例说明: 示例1: function findDifferent…

    JavaScript 2023年5月28日
    00
  • Javascript 汉字字节判断

    下面是关于“Javascript 汉字字节判断”的完整攻略。 1. 了解字符编码 在介绍如何判断汉字字节之前,我们需要明确什么是字符编码。字符编码是将字符映射到二进制数字的方式,是计算机存储和处理文本的基础。在Javascript中,字符串的底层编码格式是utf-16。 2. 判断汉字字节 在JS中,汉字的编码范围是 0x4e00 ~ 0x9fa5,如果是一…

    JavaScript 2023年5月19日
    00
  • JavaScript原生数组函数实例汇总

    JavaScript原生数组函数是JavaScript编程中非常重要的一部分。这些函数非常高效,可以帮助我们轻松地对数组进行操作,而无需手动编写重复的循环代码。下面是JavaScript原生数组函数实例汇总的完整攻略。 什么是JavaScript原生数组函数? JavaScript原生数组函数是指JavaScript中定义好的、可以直接使用的针对数组进行操作…

    JavaScript 2023年5月27日
    00
  • 常见JS前端接口校验方式总结

    接下来我将为您详细讲解“常见JS前端接口校验方式总结”的完整攻略。 常见JS前端接口校验方式总结 1. 基于正则表达式的校验 基于正则表达式的校验是一种常见的前端接口校验方式。 正则表达式提供了一种快速方便的方式,可以用来匹配和验证字符串格式。 比如,如果我们需要验证一个用户名是否符合规则(只包含字母和数字,长度为6~16),可以使用下面的代码: funct…

    JavaScript 2023年5月28日
    00
  • 获取input标签的所有属性的方法

    获取input标签的所有属性的方法可以基于JavaScript实现。主要流程包括获取input标签、获取input标签的所有属性以及遍历输出所有属性。具体步骤如下: 步骤 第一步:获取input标签 首先,我们需要获取input标签元素。可以通过document.querySelector(selector)获取: const inputElement = …

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部