首页 > 其他分享 >两个窗口如何实现通信

两个窗口如何实现通信

时间:2024-05-12 12:30:00浏览次数:10  
标签:http 通信 如何 window 新窗口 窗口 open targetWindow

From: https://blog.csdn.net/CRMEB/article/details/134398554

前言介绍
在工作中就出现的这种问题,开发的产品的页面需要嵌入到公司中其他产品中,因为是不同的产品,属于不同的系统,最简单的方式就是iframe和window.open()的方式,我选择的是window.open()的方式,因为实现的效果就是点击某个按钮才显示该页面,使用window.open()的方式对于布局都比较好控制,这时就有个问题了。因为开发产品页面直接需要获取该用户在其他产品时的用户信息和产品信息,就涉及到了如何传递信息的问题了

window.open()的参数介绍
对于window.open()一般可以设置三个参数,这里就简单介绍了,如果需要更深入的了解就请自己查找资料

第一个参数,打开新窗口的url地址

第二个参数,给新窗口的名字(name),并不是新窗口在窗口显示的title,在窗口下,通过window.name的方式拿到

这里也可以设置_self(在旧窗口打开新窗口),_blank(重新打开新窗口,默认就是该模式)
第三个参数,设置打开新窗口的宽高等

一般设置'left=100,top=100,width=400,height=400',四个参数,其他参数可能有浏览器兼容问题
1
返回值——新窗口的window引用

这时就有个疑问了,在设置第二参数时,我又想设置_self又想给新窗口设置name怎么办?

可以使用如下方式:

var targetWindow = window.open('', '_self')
targetWindow.name = 'demo'
targetWindow.location.href = 'http://localhost:8081/'
1
2
3
你会想这样写这么麻烦,下面这么写不就很简单啊

var targetWindow = window.open('http://localhost:8081/', '_self')
targetWindow.name = 'demo'
1
2
URL 的实际获取是延迟进行的,并在当前脚本块执行完毕后开始。窗口创建和引用资源的加载是异步进行的。

在第一种方法中并没有url的加载,所以窗口是已经创建了,再给这个窗口设置的name。第二种方法有url的异步加载,该窗口并没有被创建好,就给这个窗口设置name,自然就无效了。

1.使用url携带参数的形式
可能最容易想到的方式就是使用url上携带参数的形式了,但是这种方式对于传递多种数据是不方便的,而且安全性也是个问题

2.使用postMessage的方式(使用环境:Vue)
通过查找资料发现了这种比较有意思的方式,这种方式竟然对于跨域也是可以解决的,这不正合我意。

postMessage常用参数

第一个参数,就是传递的消息message,可以使用字符串,信息过多可以使用JSON.stringify()的方式
第二个参数,就是发送的url地址,也可以使用*来代替,但是不安全
发送方使用postMessage,接收方绑定message事件

window.addEventListener("message",(e) => {
// 判断是否是旧窗口发过来的,这个if判断是必须的,然后会多接收一些不想接收的消息,就是信息还没有发送过来,绑定message事件会有默认信息
if (e.origin !== "http://localhost:8080") return;
// e.data——接收到的信息
// e.origin——发送发的url地址,如果没有if判断,就会返回接收方的url(默认信息)
// e.source——发送方的window引用,如果没有if判断,就会返回接收方的window(默认信息)
// e.origin和e.source结合可以让接收方向发送方发送信息,从而达到双向通信
console.log(e.data)
})
1
2
3
4
5
6
7
8
9
我就直接介绍跨域的方式如何使用,对于同源的方式也可以使用该方式,也有其他方式。

我想要的,

旧窗口把信息传给新窗口
旧窗口

// http://localhost:8080/


<template>
<div id="app">
<button @click="open">打开新窗口</button>
</div>
</template>

export default {
name: 'App',
data () {
this.targetWindow = null
return {
}
},
methods: {
open() {
this.targetWindow = window.open('http://localhost:8081/', '_blank', 'left=100,top=100,width=400,height=400')
// 为什么加定时器,主要是为了防止window.open()异步加载,页面没有加载出来,就把消息发送出去了,有更好的方式也可以使用其他方式
setTimeout(() => {
this.targetWindow.postMessage('旧窗口向新窗口发送的消息', 'http://localhost:8081/')
}, 1000)
}
}
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
新窗口

// http://localhost:8081/

<template>
<div id="app">
新窗口
</div>
</template>

export default {
name: 'App',
mounted() {
window.addEventListener("message",(e) => {
if (e.origin !== "http://localhost:8080") return;
//发送方发送的信息
console.log(e.data)
})
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
旧窗口可以向新窗口发信息,新窗口也可以发送信息给旧窗口
旧窗口

// http://localhost:8080/

<template>
<div id="app">
<button @click="open">打开新窗口</button>
<button @click="sendNew">向新窗口传消息</button>
旧窗口接收到的信息:{{ text }}
</div>
</template>

export default {
name: 'App',
data () {
this.targetWindow = null
return {
text: ''
}
},
mounted() {
window.addEventListener('message',(e) => {
if (e.origin !== "http://localhost:8081/") return;
console.log(e.data)
this.text += e.data
})
},
methods: {
open() {
this.targetWindow = window.open('http://192.168.3.76:8081/', '_blank', 'left=100,top=100,width=400,height=400')
setTimeout(() => {
this.targetWindow.postMessage('旧窗口向新窗口发送的消息', 'http://192.168.3.76:8081/')
}, 1000)
},
sendNew() {
this.targetWindow.postMessage('旧窗口通过按钮发送给新窗口的消息', 'http://localhost:8081/')
}
}
}
</script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
新窗口

//http://localhost:8081/

<template>
<div id="app">
新窗口
<button @click="sendOld">向旧窗口发送消息</button>
<!-- 接收旧窗口发送的消息 -->
接收旧窗口发送的消息:{{ text }}
</div>
</template>

export default {
name: 'App',
components: {

},
data() {
this.oldWindow = null
this.oldOrigin = null
return {
text: ''
}
},
mounted() {
window.addEventListener("message",(e) => {
if (e.origin !== "http://localhost:8080") return;
this.text += e.data
this.oldWindow = e.source
this.oldOrigin = e.origin
})
console.log(window.name)
},
methods: {
sendOld() {
this.oldWindow.postMessage('新窗口通过按钮给旧窗口发送的消息', this.oldOrigin)
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
看到这里你可能发现有段代码很怪,为什么有些数据声明在return上面的,这么做是因为让这个数据失去响应式,如果声明在return内是有响应式的,这时this.targetWindow = window.open()在控制台会出现跨域的报错。原因是因为给它赋值是打开子窗口的window,赋值会就会监听targetWindow,就相当于在父窗口去对子窗口做操作,就造成了跨域的问题。

3.使用window.name的方式传递信息
利用window.open()的第二个参数,把信息传给新窗口

旧窗口

window.open('http://localhost:8081/','要传递的信息')
1
新窗口

console.log(window.name)
1
总结
如果就是旧窗口传递信息给新窗口,不需要新窗口给旧窗口传递信息,且只传一次,三种方式都可以,推荐使用第三种方式

如果想实现两个窗口通信的话,就使用第二种方式

完整项目附件:点此下载
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/CRMEB/article/details/134398554

标签:http,通信,如何,window,新窗口,窗口,open,targetWindow
From: https://www.cnblogs.com/joeblackzqq/p/18187676

相关文章

  • 高山是如何形成的
    高山的形成主要是由于地壳的运动和变化所导致的。具体来说,高山形成的主要过程包括以下几个方面:12地壳板块的碰撞和挤压:地球的地壳由多个板块构成,这些板块在不断的运动中发生相互撞击和挤压。当板块相互碰撞时,可能会造成一方俯冲入地幔,而另一方则隆起形成高山......
  • 如何编译Godot(Godot & Godot with C#)
    要在Windows下编译Godot,需要以下环境:VisualStudioCommunity:使用最新版本。MinGW-w64:可以替代VisualStudio。请务必将其安装/配置为使用posix线程模型。使用MinGW编译主分支时,需要GCC9或更高版本。Python3.6+:确保在安装程序中启用将Python添加到环境变量......
  • 如何同时或者按顺序间隔启动多个程序
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z1、打开工具,切换到定时器模块,快捷键:Ctrl+3 2、新建一个定时器,我这里演示同时打开多个程序(比如同时启动多个QQ,或者多个微信等),那就把单次数量提高,如果想每次执行这个定时器里面的3个事件,那单次数量就是写3,我......
  • 如何快速的追加文章的内容(在不知道内容的情况下)
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z1、打开工具,切换到文章模块下,快捷键:Ctrl+12、新建一个文章做演示,001  3、添加一个内容,就随便写一个  4、保存、关闭  5、在新建的文章上右键,选择追加内容  6、弹出一个窗口,有三种选择,我这里......
  • 如何定时打开网站
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z1、打开工具按下Ctrl+3,切换到定时器模块,左侧右键,选择新建 2、标题叫百度,等下就让它打开百度,间隔1分钟,每次重复执行1个 3、在建好的右侧,右键,添加  4、选择链接,输入百度网址,点击确定  5、这样做好......
  • 如何制作四宫格心理漫画?四宫格心理漫画制作教程以及例子
    如何制作四宫格心理漫画四宫格漫画是一种简洁而富有表现力的漫画形式,它通过四个连续的面板来讲述一个故事或表达一个观点。在心理漫画中,这种形式可以用来探讨人物的内心世界、情感变化或心理状态。以下是制作四宫格心理漫画的一些基本步骤和思路。一、确定主题在开始之前,你需要......
  • Hiddex -窗口管理工具简介
    Hiddex是一款功能强大的窗口管理工具,专注于帮助用户有效管理和隐藏应用程序窗口,提升工作效率和桌面整洁度。通过简单的快捷键操作,用户可以快速隐藏不需要的窗口,轻松切换焦点,专注于当前任务。Hiddex提供多种隐藏模式和定制化隐藏规则,满足用户个性化需求。不仅支持单击隐藏和应用......
  • seo如何优化
    哈喽,大家好,我是木头左,物联网搬砖工一名,致力于为大家淘出更多好用的AI工具!SEO如何优化一、了解SEO的基本概念SEO(SearchEngineOptimization),即搜索引擎优化,是指通过一系列技术手段,提高网站在搜索引擎中的自然排名,从而获得更多的免费流量。SEO的核心目标是提高网站的用户体验,让......
  • ETLCloud中如何执行Java Bean脚本
    ETLCloud中如何执行Java Bean脚本在ETLCloud这一强大的数据集成和转换平台中,执行Java Bean脚本的能力为其增添了更多的灵活性和扩展性。Java Bean脚本不仅仅是一段简单的代码,而是一种强大的工具,可以帮助用户定制和优化数据处理的每一个环节。为了充分利用这一功能,您需要编写......
  • 制造业如何选择合适的项目管理软件?(内含软件推荐)
    近期,收到很多小伙伴的提问:“想了解制造行业如何选择到合适的项目管理软件?”在竞争激烈的市场环境中,有效的项目管理对于制造业的发展至关重要,而项目管理软件则是重要支撑,能帮助企业更好地规划和跟踪项目、提高生产效率和产品质量、增强团队协作。但制造业的项目管理在实施过程中,由......