使用window.open打开多个子窗口,实现父子窗口之间数据通讯
创始人
2025-01-28 07:11:45
0

最终页面效果

 需求描述:用户需要给当前科技树的节点身上绑定其他科技树的支线数据,这就需要在当前页面中能够有新的弹窗支出用户浏览科技树并选择某个节点后将数据传递出来。当科技树实现关联后就会出现一种套娃现象,节点身上还会有第三层、第四层的关联数据,这就需要能一层一层的展示出绑定的数据。

技术:一开始想用iframe实现的,但是iframe存在一个问题,当我打开第二层关联后页子窗口页面不加载了。有更换成了window.open的方式。

window.open用法

window.open常用来在新的window或新的tab页打开一个页面或文件(如图片、PDF等),它支持三个参数:

strUrl:要打开的页面或资源的url地址。
strWindowName:窗口的名字,用于后续对该窗口的引用,不是窗口的标题。
strWindowFeatures:窗口的描述参数,如尺寸、位置、是否启用工具栏等。
该方法的返回值是新打开的窗口的引用,也就是新窗口的window对象。在遵循同源策略的情况下,可以直接通过该对象访问被打开的页面;即使在跨域的情况下,也可以通过window.postMessage向其发消息。

 父窗口

打开窗口1(branchBindEdit)         查看科技树,选中节点进行关联操作

 // 打开某个科技树的详情页 支持查看 选中节点后绑定数据
openBindNode(row) {this.bindMindTree = row;let url = this.IFRAMEHOST + 'branchBindEdit?mindId=' + row.id;let tempwindow = window.open(url, uuid.v1(), 'height=700,width=1000,top=0,left=0,toolbar=no,menubar=no,scrollbars=no, resizable=no,location=no, status=no');tempwindow.location = url;
},

 在父窗口中接收子窗口1传回的数据

 mounted() {let _this = this;window.addEventListener('message', function (data) {//console.log("打印", _this.getBindMindTree(), data.data)let bindMindTreeData = _this.getBindMindTree()let branchNode = data.data;if (bindMindTreeData && branchNode) {_this.technologyTreeList.push({'branchId': branchNode.branchId,'branchText': branchNode.branchText,'mindId': bindMindTreeData.id,'mindName': bindMindTreeData.mindName,});}})},methods: {getBindMindTree() {this.treeBindingDialog = false;//关闭科技树展示列表if (this.bindMindTree)return { 'id': this.bindMindTree.id, 'mindName': this.bindMindTree.mindName }return null},}

补充: 由于我在接收到子窗口数据后还需要this.bindMindTree的数据进入其他操作,但是我在mouted中直接使用this.bindMindTree打印出来的是空数据,因在写了一个返回该数据的方法,在mouted中调用该方法

打开窗口2(branchBindView)     查看已关联的科技树支线数据

 // 查看已绑定的科技树
ViewBindingTree(row) {let url = this.IFRAMEHOST + 'branchBindView?branchNodeId=' + row.branchId + '&bindMindTreeId=' + row.mindIdlet tempwindow = window.open(url, uuid.v1(), 'height=700,width=1000,top=0,left=0,toolbar=no,menubar=no,scrollbars=no, resizable=no,location=no, status=no');tempwindow.location = url;
},

window.open的第二个参数,窗口名称使用的是uuid。 原因是查看数据时需要打开多层嵌套的窗口,如果名称一致的话,使用同一个窗口名称是无法继续打开新窗口的,使用uuid可以打开多层嵌套的窗口。

vue 中使用uuid

下载

npm i -S vue-uuid

局部引入

import { uuid } from 'vue-uuid';

使用

 uuid.v1()

子窗口1 branchBindEdit

用户选中节点后点击按钮,保存选中的节点数据并关闭子窗口

在vue页面中 的mouted函数中 截取url地址上的参数 

  mounted() {let _this = this;//console.log("window.location.href", _this.getParams(window.location.href))const paramsObj = _this.getParams(window.location.href);_this.mindId = paramsObj.mindId;_this.getDetailInfo();},
 methods: {getParams(url) {//我们只要问号后面的字符串var arr = url.split('?')var params = arr[1];//console.log(params);    //branchNodeId=1631188692729548802 & bindMindTreeId=17var arr1 = params.split('&');var params = {}//因为arr1里面有多个元素,都要切割,所以我们需要遍历循环。for (var i = 0; i < arr1.length; i++) {var newArr = arr1[i].split('=');params[newArr[0]] = newArr[1];}return params;},getDetailInfo(){//......获取关联科技树支线的数据},closeWindow() {//取到用户选中的节点数据let nodes = this.$refs.minderEditor.minder.getSelectedNodes();let data = {'branchId': nodes[0].data.id,'branchText': nodes[0].data.text,}//将数据传递给父窗口window.opener.postMessage(data, '*');//window.close()},
},

子窗口2branchBindView

在vue页面中 的mouted函数中 截取url地址上的参数

  mounted() {let _this = this;// console.log("window.location.href", _this.getParams(window.location.href))const paramsObj = _this.getParams(window.location.href);_this.branchNodeId = paramsObj.branchNodeId;_this.bindMindTreeId = paramsObj.bindMindTreeId;_this.getDetailInfo();},
 methods: {getParams(url) {//我们只要问号后面的字符串var arr = url.split('?')var params = arr[1];//console.log(params);    //branchNodeId=1631188692729548802 & bindMindTreeId=17var arr1 = params.split('&');var params = {}//因为arr1里面有多个元素,都要切割,所以我们需要遍历循环。for (var i = 0; i < arr1.length; i++) {var newArr = arr1[i].split('=');params[newArr[0]] = newArr[1];}return params;},getDetailInfo(){//......获取关联科技树支线的数据},
},

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...