当前位置: 首页 > news >正文

监听新打开窗口的关闭情况和iframe内系统的url改变情况

大致描述

今天上班突然有两个需求,都是关于集成其他系统的需求。

1、跳转至外链的系统

要求点击菜单跳转到别的系统,但是浏览器的标签页只能打开一次,需要监听当前的标签页是否被打开

2、系统中嵌套另一个系统

要求在系统中嵌套另一个系统,但是我们要监听另一个系统的url跳转情况

需求不算难,可能是我经验不多,有些知识点没有想到,现在做完发现挺简单的,但是还得记录下,万一下次还有这样的需求但忘记具体的做法就手麻了。

具体实现
第一个需求

这个需求很简单,就是通过window.open返回的对象来完成功能

// 用来保存新窗口的对象
let _WindowOpenObj = null;

window.addEventListener("click",()=>{
    if(_WindowOpenObj || !_WindowOpenObj.closed()){
        try{
            _WindowOpenObj.focus()
        }catch(e){
            _WindowOpenObj = window.open("./test.html","_brank")
        }
    }else{
        _WindowOpenObj = window.open("./test.html","_brank")
    }
})
第二个需求

这里我们主要利用MutationObserver函数完成功能

// 找到iframe标签
        const iframe = document.getElementById('myIframe');

        // 使用 MutationObserver 监听 iframe 的 src 属性变化
        const observer = new MutationObserver((mutations) => {
            mutations.forEach((mutation) => {
                if (mutation.type === 'attributes' && mutation.attributeName === 'src') {
                    updateUrlDisplay();
                }
            });
        });

        observer.observe(iframe, {
            attributes: true,
            attributeFilter: ['src']
        });

        // 监听 iframe 的 load 事件
        iframe.addEventListener('load', () => {
            try {
                const iframeUrl = iframe.contentWindow.location.href;
                console.log(iframeUrl,"这是监听到的iframe内的url内容");
                
                // 监听 iframe 内部的 history 变化
                iframe.contentWindow.addEventListener('popstate', updateUrlDisplay);
            } catch (e) {
                console.error('无法访问 iframe 内容:', e);
            }
        });

        function updateUrlDisplay() {
            try {
                const iframeUrl = iframe.contentWindow.location.href;
                console.log(iframeUrl,"这是监听到的iframe内的url内容");
            } catch (e) {
                console.error('无法获取 iframe URL:', e);
            }
        }
感想

以上属于是我个人的小笔记,如果有不对的系统各位大佬和同行们帮忙指出,感谢感谢感谢

同时也希望可以通过这些小笔记帮助同行们解决一时的燃眉之急

相关文章:

  • 如何用“几何产品规范”让齿轮测量更精准?
  • 如何选择适合您智能家居解决方案的通信协议?
  • Spring Boot 项目部署启动异常问题分析与解决​:主类缺失与依赖冲突的分析
  • Java 集合框架:数据管理的强大工具
  • vue知识点(4)
  • STM32F407 定时器
  • 第九课:异步爬虫进阶:aiohttp与多线程的技术博客
  • 【Java 和 Scala】-- Java 与 Scala 的 Assert 断言对比
  • AI Agent系列(四) -Agent架构认知
  • 【ODHead】BEVDet的 CenterHead的推理和拓展到蒸馏损失的算法细节
  • java后端开发day31--集合进阶(一)-----Collection集合List集合数据结构1
  • Hive SQL 精进系列:字符串拼接的三种常用方式
  • 【WRF-Chem】预处理工具(Preprocessors)总结
  • es-索引详解
  • 论文笔记 - ULTRA-SPARSE MEMORY NETWORK
  • 解决:外部调用存储过程时突然变慢,但是在sql server运行很快
  • ios打包需要的证书及步骤
  • flutter dio库 源码赏析
  • Java继承机制深度解析:子类如何继承父类及内存原理解析
  • 《A Gentle Introduction to Graph Neural Networks》-GNN的综述性论文
  • 宁夏自治区住房城乡建设厅网站/百度投放广告怎么收费
  • 手机网站怎么打开/直接进网站的浏览器
  • 信誉好的徐州网站建设/百度品牌
  • 衡水建站公司/卡点视频免费制作软件
  • 站酷官网/百度平台电话多少
  • 专业外贸公司网站/宁波优化网页基本流程