Iframe跨窗口通信原理详解

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日

相关文章

  • 利用递增的数字返回循环渐变的颜色的js代码

    利用递增的数字返回循环渐变的颜色是一种非常常用的js代码技巧,在很多前端开发场景中,比如渐变背景色、动态颜色等都需要用到这种技巧。 以下是详细的攻略: 步骤一:编写颜色渐变函数 我们需要编写一个函数,接受一个数字参数,根据这个数字参数返回一个渐变的颜色值。下面是一段伪代码,可以帮助我们理解这个函数的基本思路: function gradientColor(i…

    JavaScript 2023年6月11日
    00
  • 获取当前月(季度/年)的最后一天(set相关操作及应用)

    获取当前月(季度/年)的最后一天,是一项非常实用的时间操作,可以用来生成各种类型的报表或实现预测功能。下面是完整的攻略: 获取当前月的最后一天 获取当前月的最后一天比较简单,可以用JS内置的Date对象来实现: const now = new Date(); const year = now.getFullYear(); const month = now.…

    JavaScript 2023年6月10日
    00
  • 浅析script标签中的defer与async属性

    当我们在HTML文档中使用<script>标签引入JavaScript文件时,我们可以为这个标签添加两个重要的属性:defer和async。这两个属性都是为了优化JavaScript的加载和执行,但它们有一些不同之处。下面我们来分别对这两个属性进行详细的解析。 Defer属性 defer属性告诉浏览器,这个脚本将被延迟到页面加载完成后再执行。这意…

    JavaScript 2023年6月10日
    00
  • 常用的JS验证和函数汇总

    下面是有关“常用的JS验证和函数汇总”的详细讲解: 常用的JS验证和函数汇总 一、JS验证错误提示 在进行表单验证时,我们需要考虑到用户的体验感觉,如果用户输入的内容有误,我们需要对用户进行友好的提示,这样可以避免用户产生不必要的焦虑或者反感。 下面是一个JS验证错误提示的示例: function checkForm() { var name = docum…

    JavaScript 2023年5月27日
    00
  • 原生JavaScript来实现对dom元素class的操作方法(推荐)

    为了实现对DOM元素class的操作,原生JavaScript提供了一些方法,以下是完整攻略: 一、查找DOM 首先,我们需要使用document.querySelector()或document.querySelectorAll()方法获取要操作的元素。 document.querySelector()方法返回文档中第一个匹配指定选择器的元素。示例如下: …

    JavaScript 2023年6月10日
    00
  • JavaScrip String对象的方法

    下面是“JavaScript String对象的方法”的详细攻略。 String对象的介绍 在JavaScript中,字符串是一种基本的数据类型,由一个或多个字符组成,用来表示文字和文本数据。String对象是对JavaScript中字符串进行操作、处理和转换的对象。String对象拥有很多实用的方法,可以让我们对字符串进行各种操作和处理。 常用的Strin…

    JavaScript 2023年5月28日
    00
  • js 工具类

    /*是否带有小数*/ function isDecimal(strValue ) { var objRegExp= /^\d+\.\d+$/; return objRegExp.test(strValue); } /*校验是否中文名称组成 */ function ischina(str) { var reg=/^[\u4E00-\u9FA5]{2,4}$/;…

    JavaScript 2023年4月25日
    00
  • 正则表达式优化JSON字符串的技巧

    下面是关于“正则表达式优化JSON字符串的技巧”的完整攻略。 什么是JSON字符串? JSON是JavaScript对象表示法(JavaScript Object Notation)的简称,是一种轻量级的数据交换格式。JSON数据通过”键-值”(key-value)的方式表示,既易于阅读,也易于编写。在Web开发中,常用JSON字符串来传输数据。 为什么要优…

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