首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js与子对话框通信

在JavaScript中,与子对话框(通常是通过window.open打开的新窗口或通过<iframe>嵌入的页面)进行通信可以通过多种方式实现。以下是一些基础概念和方法:

基础概念

  1. 同源策略
    • 浏览器的安全策略,限制不同源(域名、协议、端口)之间的脚本交互。
    • 只有同源的窗口或<iframe>才能无障碍地进行通信。
  • window.postMessage方法
    • 允许不同源的窗口之间安全地传递消息。
    • 是实现跨域通信的标准方法。

相关优势

  • 安全性:通过postMessage可以避免直接访问其他窗口的对象,从而减少安全风险。
  • 灵活性:支持跨域通信,适用于多种场景。

类型与应用场景

  1. 同源通信
    • 可以直接通过window.frameswindow.opener访问对方窗口的对象。
    • 应用场景:同一网站内的不同页面之间的交互。
  • 跨域通信
    • 使用window.postMessage方法。
    • 应用场景:不同网站之间的数据交换,例如第三方登录、广告嵌入等。

示例代码

同源通信示例

父窗口代码

代码语言:txt
复制
// 打开子窗口
const childWindow = window.open('child.html', 'ChildWindow');

// 发送消息到子窗口
childWindow.document.getElementById('message').innerText = 'Hello from parent!';

// 接收子窗口的消息
window.addEventListener('message', (event) => {
  if (event.source === childWindow) {
    console.log('Message from child:', event.data);
  }
});

子窗口代码(child.html)

代码语言:txt
复制
<!DOCTYPE html>
<html>
<head>
  <title>Child Window</title>
</head>
<body>
  <div id="message"></div>
  <script>
    // 发送消息到父窗口
    window.opener.postMessage('Hello from child!', '*');

    // 接收父窗口的消息
    window.addEventListener('message', (event) => {
      if (event.source === window.opener) {
        console.log('Message from parent:', event.data);
      }
    });
  </script>
</body>
</html>

跨域通信示例

父窗口代码

代码语言:txt
复制
// 打开跨域子窗口
const childWindow = window.open('https://example.com/child.html', 'ChildWindow');

// 发送消息到子窗口
childWindow.postMessage('Hello from parent!', 'https://example.com');

// 接收子窗口的消息
window.addEventListener('message', (event) => {
  if (event.origin === 'https://example.com') {
    console.log('Message from child:', event.data);
  }
});

子窗口代码(https://example.com/child.html)

代码语言:txt
复制
<!DOCTYPE html>
<html>
<head>
  <title>Child Window</title>
</head>
<body>
  <script>
    // 发送消息到父窗口
    window.opener.postMessage('Hello from child!', 'https://parent-origin.com');

    // 接收父窗口的消息
    window.addEventListener('message', (event) => {
      if (event.origin === 'https://parent-origin.com') {
        console.log('Message from parent:', event.data);
      }
    });
  </script>
</body>
</html>

常见问题及解决方法

  1. 消息接收不到
    • 确保event.originevent.source的检查正确。
    • 确保消息发送的目标源正确。
  • 安全问题
    • 始终验证event.origin以防止恶意网站发送消息。
    • 不要在postMessage中使用通配符'*',而是指定具体的源。

通过以上方法和注意事项,可以实现JavaScript与子对话框之间的安全、有效的通信。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

objC与js通信实现--WebViewJavascriptBridge

框架(针对iOS)的通信机制。...webview下的上下文中执行函数数组,最终完成objC->js的通信(调用)。   ...js调用objC则有些特殊,不过依然利用stringByEvaluatingJavaScriptFromString方法实现基本通信,并在objC层针对webviewDelegate接口提供的webView...因此综上来看,不管objC和js如何通信,最为关键的就是stringByEvaluatingJavaScriptFromString方法,它构建起了objC和js通信的基石,“objC可以直接通过该方法调用...总结   上文提到的仅仅是大体的通信机制,具体的实现细节仍有很多需要注意,比如如何在js端侦听通信组件的初始化事件、应该在何时在objC层调用js定义的函数、objC发送消息中序列化特殊字符等等,但是通信的机制可以通过本文略知一二

1.5K100
  • 八,知识子域:物理与网络通信安全

    8.1知识子域:物理与环境安全 8.1.1环境安全 了解物理安全的重要性 了解场地和环境安全应关注的因素;包括场地选择,抗震及承重,防火,防水,防水,供电,空气调节,电磁防护,雷击及静电等防护技术...理解无线安全传输技术及安全特点 8.2知识子域:OSI通信模型 8.2.1OSI模型 理解OSI七层模型构成及每一层的作用。 理解协议分层的作用。...8.4知识子域:无线通信安全 8.4.1无线局域网安全 了解无线局域网安全协议WEB,WPA,WAPI等工作机制及优缺点。 理解无线局域网安全防护策略。...8.6知识子域:网络安全防护技术 8.6.1边界安全防护 了解防火墙产品的实现技术,部署方式,作用及局限性。 了解安全隔离与信息交换系统的实现技术,部署方式和作用。...8.6.2检测与审计 了解入侵系统的作用,分类,实现技术,部署方式及应用上的局限性。 了解安全审计系统的作用。

    25520

    实现iframe父窗体与子窗体的通信

    本文主要会介绍如何基于MessengerJS,实现iframe父窗体与子窗体间的通信,传递数据信息。同时本文会提供一个可运行的实例代码,实现在父窗体中,获取到来自子窗体的数据的效果。...1.采用方案 1.1 MessengerJS方案 可以采用MessengerJS方案,该方案可以实现父窗体与iframe之间的通信、多个iframe之间的通信。...1.2 使用方法 (1) 在需要通信的父窗体、和子窗体的文档中,都需要引入MessengerJS。...这里分别是父窗体和子窗体的代码实现,可直接在浏览器中打开查看效果,其中messenger.js可以在这里下载,放到项目目录下。 父窗体: <!...3.小结 本文主要是介绍了一个MessengerJS方案及其使用方法,来解决父窗体与子窗体的通信问题。

    9.8K771

    mfc 创建模态对话框与非模态对话框

    所谓模态对话框就是该对话框被创建后,其父窗口不能响应任何消息,无法操作,只有在关闭了新创建出来的窗口后才能继续操作其后面的父窗口。...而非模态对话框则不会有这种情况,非模态对话框创建完成后不影响父窗口的操作,两个窗口可以同时响应消息。 ---- 创建模态对话框 想创建一个模态对话框一共分三步。...1、在资源视图中创建一个对话框资源 2、给该对话框资源创建一个类,继承于 CDialog 类,命名为 CMyDialog 图片 3、在想创建该对话框的地方添加如下代码   // 模态对话框...创建非模态对话框 创建非模态对话框相对简单,我们可以不需要自己派生一个 CDialog 的子类再调用子类的 DoModal(这个函数是模态对话框使用的),如果我们已经在资源视图创建好了对话框资源,那么直接使用如下代码就可以创建一个非模态的对话框...// 非模态 CDialog* dialog = new CDialog;// new 一个对话框对象 dialog->Create(IDD_MYDIALOG, this);// 初始化对话框和我们的对话框资源绑定

    38010

    Vue2.0子父组件通信

    来源:http://www.jianshu.com/p/2670ca096cf8 Vue是一个轻量级的渐进式框架,对于它的一些特性和优点在此就不做赘述,本篇文章主要来探讨一下Vue子父组件通信的问题...父组件向子组件传值成功 总结一下: 子组件在props中创建一个属性,用以接收父组件传过来的值 父组件中注册子组件 在子组件标签中添加子组件props中创建的属性 把需要传给子组件的值赋给该属性 --...-- 二.子组件向父组件传值 1.在子组件中创建一个按钮,给按钮绑定一个点击事件 ?...在通信中,无论是子组件向父组件传值还是父组件向子组件传值,他们都有一个共同点就是有中间介质,子向父的介质是自定义事件,父向子的介质是props中的属性。...抓准这两点对于父子通信就好理解了 ---- 快扫描二维码,与志佳老师来聊聊吧~~

    51220

    深入理解Node.js的进程与子进程

    本文从以下几个方面介绍 child_process 模块的使用:创建子进程父子进程通信独立子进程进程管道创建子进程nodejs 的 child_process 模块创建子进程的方法:spawn, fork...return; } console.log(`stdout: ${stdout}`); console.error(`stderr: ${stderr}`);});父子进程通信.../sub.js");cp.on("message", msg => { console.log("父进程收到消息:", msg);});cp.send("我是父进程");sub.js 代码如下:process.on...: 我是父进程独立子进程在正常情况下,父进程一定会等待子进程退出后,才退出。...如果想让父进程先退出,不受到子进程的影响,那么应该:调用 ChildProcess 对象上的unref()options.detached 设置为 true子进程的 stdio 不能是连接到父进程main.js

    2K21

    react子父组件相互通信传值系列之——父组件传值与函数给子组

    本系列你将能学到: 父组件传值与函数给子组件,在子组件可使用父组件的值与函数; 子组件传值与函数给父组件,在父组件里面可使用子组件里面的值与函数; 子组件传值与函数给子组件,在子组件里面可使用另一个子组件的值与函数...; 父组件传值与函数给子组件,在子组件可使用父组件的值与函数 主要是通过react三大属性之一props来进行,下面开始上代码: 父组件关键代码 import React, { useState } from...auto', padding: '30px 5px', textAlign: 'center', border: '3px solid yellowgreen' }} > 我是子组件...1 子组件使用父组件的值:{props.parentValue} { props.setParentValue('我触发父组件函数了,子组件触发的哟~' + props.parentValue); }}>子组件使用父组件的函数</button

    90710

    js判断是否是子元素

    文本俺将跟大家介绍,如何判断一个当前点击的元素,是否是指定元素的子元素。 解决思路: 俺给父元素指定了一个id,并使用这个循环检查当前元素是否属于它的子元素。...parentObj){ return true; } obj = obj.parentNode; } return false; } 方法二:jquery代码 //判断:当前元素是否是被筛选元素的子元素...jQuery.fn.isChildOf = function(b){ return (this.parents(b).length > 0); }; //判断:当前元素是否是被筛选元素的子元素或者本身...event => { const parentId = 'mycontainer' if (isDescendant(event.target, parentId)) { //处理是子元素的情况...} else { //处理不是子元素的情况 } }) 在while循环中,俺使用赋值运算符=进行迭代,直到不再有父节点,在本例中为el.parentNode返回null时, while

    10.8K00

    【基于 JS 的函数式编程 - 4】函子 | MayBe函子 | Monad函子

    概念 函子 定义: 函子是一个普通对象,它实现了map函数,在遍历每个对象值的时候生成一个新对象。即,函子是一个实现了 map 契约的对象! 简单理解:函子是一个持有值的容器。...Container = function(val) {this.value=val;} let testVal = new Container(3); 这样一来,Container持有了内部的值,我们传入的任何js...Monad是一个含有chain方法的函子 你可以通过添加一个chain方法(或者说是join方法)扩展MayBe函子,使其成为一个Monad函子。...那么,我们就可以知道 Monad 函子的一大特点就是能够避免深层嵌套,只要提供下一运算所需要的的函数,就能将函数拆解成互相连接的多个步骤,自动进行下去,并且每次都是只返回一个单层的函子。...这个函子有一个 flatMap 方法,即降维的能力。

    21920

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券