【JS】浏览器不同窗口、标签页或 iframe之间的通讯 - 技术的尽头是魔术

效果

  • 左上↖地址: http://127.0.0.1:5500/index.html
  • 左下↙地址: http://127.0.0.1:5500/index.html?hidden
  • 右上↗地址: http://127.0.0.1:5500/index.html?hidden
  • 右下↘地址: http://127.0.0.1:5500/index.html?hidden
    在这里插入图片描述

index.html

<!DOCTYPE html>
<html><head><title>card</title><link type="text/css" rel="styleSheet" href="index.css" /></head><body><div id="card" class="card"><img src="A.png"/></div><script src="index.js"></script></body>
</html>

index.css

* {margin: 0;padding: 0;box-sizing: border-box;
}
body{width: 100vw;height: 100vh;margin: 0;/* backgroud: #191c29 */background: #fff;
}
.card{width: 100px;height: 200px;/* 设置定位类型为相对定位 */position: relative;
}img{width: 200px;height: 300px;
}

index.js

//获取card元素
const card = document.querySelector('.card');
const BAR = 79;
/*** @function 将"屏幕上的点"转换为"浏览器页面客户区域的点"* @param screenX number * @param screenY number* @returns object* @returns object.clientX number* @returns object.clientY number*/
function getClientPoint(screenX, screenY) {const clientX = screenX - window.screenX;const clientY = screenY - window.screenY-BAR;return [clientX, clientY];
}
/*** @function 将"浏览器页面客户区域的点"转换为"屏幕上的点"* @param screenX number * @param screenY number* @returns object* @returns object.clientX number* @returns object.clientY number*/
function getScreenPoint(clientX, clientY) {const screenX = clientX + window.screenX;const screenY = clientY + window.screenY + BAR;return [screenX, screenY];
}//添加鼠标按下事件
card.onmousedown = (e) => {let x = e.pageX - card.offsetLeft;let y = e.pageY - card.offsetTop;//添加鼠标移动事件window.onmousemove = (e) => {const cx = e.pageX - x;const cy = e.pageY - y;card.style.left = cx + 'px';card.style.top = cy + 'px';//通知其他窗口console.log(e);console.log(channel);//使用 postMessage() 来发送消息给其他页面channel.postMessage(getScreenPoint(cx, cy));};//处理鼠标抬起事件window.onmouseup = (e) => {//移出鼠标移动处理事件window.onmousemove = null; //移出鼠标抬起处理事件window.onmouseup = null;};
};function init(){/*查询地址栏是否包含hidden参数*/if(location.search.includes('hidden')){/*将浏览器客户区包含hidden参数移出客户区*/card.style.left = '-1000px';}
}init();//BroadcastChannel 是 JavaScript 中的一个接口,用于在不同的浏览上下文之间进行通信。它允许在相同域名下的不同窗口、标签页或 iframe 之间发送消息。
const channel = new BroadcastChannel('card');//onmessage 事件处理程序来接收其他页面发送的消息。
channel.onmessage = (e) => {const [cx,cy] = getClientPoint(...e.data);card.style.left = cx +'px';card.style.top = cy + 'px';
}

A.png

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/52347.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Docker实现测试部署CI/CD----相关服务器的安装配置(1)]

目录 0、CI/CD系统最终架构图规划IP地址 1、git配置Git下载pycharm配置gitidea配置git 2、GitLab安装与配置主机要求拉取镜像定义 compose.yml启动gitlab浏览器访问并修改密码查看登录密码修改密码 3、SonarQube 安装与配置拉取镜像修改虚拟内存的大小启动SonarQube登录 SonarQ…

IO进程线程第七天(8.4)信号量,条件变量

在第一题的基础上加上一个需求&#xff1a;要求打印&#xff0c;倒置线程&#xff0c;顺序执行。出现的现象为先打印1234567&#xff0c;后打印7654321&#xff08;不使用flag&#xff09; 创建两个线程&#xff0c;其中一个线程读取文件中的数据&#xff0c;另外一个线程将读…

3分钟白话RocketMQ系列—— 核心概念

白话3分钟&#xff0c;快速了解RocketMQ基础&#xff0c;包括适用场景&#xff0c;以及基本概念。 看完如果不了解&#xff0c;欢迎来打我。 关键字摘要 低延迟、高可用、高可靠、高并发 的消息中间件适合在线业务分为producer、consumer、nameserver、broker等角色另外还有主…

【C++】STL——stack和queue的模拟实现、空间适配器、deque的介绍、增删查改函数的简单实现

文章目录 1.deque的简单介绍2.模拟实现stack3.模拟实现queue 1.deque的简单介绍 deque的介绍文档 deque(双端队列)&#xff1a;是一种双开口的"连续"空间的数据结构&#xff0c;双开口的含义是&#xff1a;可以在头尾两端进行插入和删除操作&#xff0c;且时间复杂度…

15 springboot项目——thymeleaf语法与关闭模板引擎

15.1 thymeleaf语法 在html文件中&#xff0c;有些是需要使用本地的css样式&#xff0c;使用thymeleaf语法加载&#xff1a; 首先对head标签上面的html标签进行更改&#xff1a; <html lang"en" xmlns:th"http://www.thymeleaf.org"> 其次&#xff…

Ajax快速入门

文章目录 Ajax原生ajaxaxios案例 Ajax Ajax就是前端访问服务器端数据的一个技术 还有主要就是异步交互 就是在不刷新整页面的情况下&#xff0c;和服务器交换部分我也数据 比如搜索的联想技术 同步和异步的概念 一个是客户端需要等待服务器完成处理&#xff0c;才能进行别的事…

从0到1框架搭建,Python+Pytest+Allure+Git+Jenkins接口自动化框架(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口测试是对系统…

解决 idea maven依赖引入失效,无法正常导入依赖问题

解决 idea maven依赖引入失效&#xff0c;无法正常导入依赖问题_idea无法导入本地maven依赖_普通网友的博客-CSDN博客 解决 idea maven依赖引入失效&#xff0c;无法正常导入依赖问题 idea是真的好用&#xff0c;不过里面的maven依赖问题有时候还真挺让人头疼&#xff0c;不少小…

Jenkins通过OpenSSH发布WinServer2016

上一篇文章> Jenkins集成SonarQube代码质量检测 一、实验环境 jenkins环境 jenkins入门与安装 容器为docker 主机IP系统版本jenkins10.10.10.10rhel7.5 二、OpenSSH安装 1、下载 官网地址&#xff1a;https://learn.microsoft.com/zh-cn/windows-server/administration/op…

数学建模-元胞自动机

clc clear n 300; % 定义表示森林的矩阵大小 Plight 5e-6; Pgrowth 1e-2; % 定义闪电和生长的概率 UL [n,1:n-1]; DR [2:n,1]; % 定义上左&#xff0c;下右邻居 vegzeros(n,n); % 初始化表示森林的矩阵 imh ima…

Python实现(条形码,二维码)生成识别

Python实现&#xff08;二维码&#xff0c;条形码&#xff09;生成识别 生成条形码生成二维码识别条形码二维码 生成条形码 安装barcode模块: $ pip install python-barcode barcode文档 import barcode from barcode.writer import ImageWriter # 更多了解&#xff1a;https…

多模块Springboot项目maven单独打包子模块

背景介绍 最近接手一个项目代号XXL&#xff0c;是一个多模块的Springboot项目&#xff0c;在解决了线上的bug之后&#xff0c;想单独给子模块打包上线部署&#xff0c;问题来了。如果整个工程一起mvn -X -DskipTests clean package&#xff0c;打包出来的XXL-web.jar是可以正常…