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

前端操作document的小方法,主要功能-获取当前页面全部的a标签页,并根据链接中必要的字段进行判断,然后把这些链接放入iframe去打开

首先是一些小方法,有一个问题就是在不同源的页面中无法获取iframe中的dom

const isInIframe = window.parent !== window.self;
console.log('是否在 iframe 中:', isInIframe);
console.log('来源页面:', document.referrer);
const isSame =
	new URL(document.referrer).origin === window.location.origin;
console.log(isSame, '是否同源');

js原生版本-获取当前页面中所有符合要求的a标签

   window.addEventListener('load', function ()
    {
      console.log(window.localStorage.getItem('username'));
      // 存储已处理的<a>标签,避免重复检查
      const processedLinks = new WeakSet();
      // 存储符合条件的链接
      const matchedLinks = new Set();

      // 解析URL并检查参数
      function checkLink (link)
      {
        try {
          const url = new URL(link.href);
          const params = url.searchParams;
          const keys = new Set(Array.from(params.keys(), key => key.toLowerCase()));
          if (keys.has('需要匹配的参数字段') && keys.has('需要匹配的参数字段')) {
            matchedLinks.add(url.href);
          }
        } catch (e) {
          console.error('解析URL失败:', link.href, e);
        }
      }

      // 收集并检查所有<a>标签
      function collectLinks ()
      {
        const links = document.getElementsByTagName('a');
        for (const link of links) {
          if (!processedLinks.has(link)) {
            processedLinks.add(link);
            checkLink(link);
          }
        }
        // 输出结果(可根据需要调整)
        if (matchedLinks.size > 0) {
          console.log('匹配的链接:', Array.from(matchedLinks));
        }
      }

      // 初始收集
      collectLinks();

      // 监听DOM变化以处理动态加载的内容
      const observer = new MutationObserver(function (mutations)
      {
        collectLinks();
      });

      observer.observe(document.body, {
        childList: true,   // 监听子元素变化
        subtree: true      // 监听所有后代元素
      });
    });

vue2版本-获取当前页面中所有符合要求的a标签

export default {
data() {
	return {
		processedLinks: new WeakSet(), // 非响应式,仅用于逻辑判断
		matchedLinks: [], // 响应式数组,用于存储结果
		observer: null, // 存储 MutationObserver 实例
	};
},
beforeDestroy() {
		// 组件销毁时断开观察
		if (this.observer) {
			this.observer.disconnect();
		}
	},
	mounted() {
		const isInIframe = window.parent !== window.self;
		console.log('是否在 iframe 中:', isInIframe);
		console.log('来源页面:', document.referrer);
		const isSame =
			new URL(document.referrer).origin === window.location.origin;
		console.log(isSame, '是否同源');
		if (isInIframe) return; //不能再iframe里面再打开iframe了,会死循环
		let _this = this;
		window.addEventListener('load', function () {
			_this.initLinkCollector();
		});
	},
	methods: {
	initLinkCollector() {
			this.collectLinks();
			this.setupMutationObserver();
			console.log(this.matchedLinks);
		},
		checkLink(link) {
			try {
				const url = new URL(link.href);
				const params = url.searchParams;
				const keys = new Set(
					Array.from(params.keys(), (key) => key.toLowerCase())
				);
				if (keys.has('需要匹配的参数字段') && keys.has('需要匹配的参数字段')) {
					// 使用 Set 结构去重后转为数组更新
					const newSet = new Set([...this.matchedLinks,url.href]);
					this.matchedLinks = Array.from(newSet);
				}
			} catch (e) {
				console.error('解析URL失败:', link.href, e);
			}
		},
		collectLinks() {
			const links = document.getElementsByTagName('a');
			Array.from(links).forEach((link) => {
				if (!this.processedLinks.has(link)) {
					this.processedLinks.add(link);
					this.checkLink(link);
				}
			});
		},
		setupMutationObserver() {
			this.observer = new MutationObserver((mutations) => {
				this.collectLinks();
			});
			this.observer.observe(document.body, {
				childList: true,
				subtree: true,
			});
		},
	}
}

在当前页用iframe循环打开获取的a标签

在这里插入代码片

相关文章:

  • 【Windows】系统安全移除移动存储设备指南:告别「设备被占用」弹窗
  • UE5蓝图实现打开和关闭界面、退出
  • 使用人工智能大模型腾讯元宝,如何快速些成果申报书?
  • C/C++基础
  • 基于 DB、EAST、SAST 的文本检测算法详解及应用综述
  • VSCode写java时常用的快捷键
  • 【KWDB 创作者计划】_产品技术解读_2
  • 如何分析 JVM OOM 内存溢出 Dump 快照日志
  • ​印太贸易新轴心成型:澳新领衔的“关税破壁行动“​
  • VUE项目中的package.json中的启动脚本
  • 深入浅出:Seata 分布式事务管理器的部署与安装实战指南
  • CAP应用
  • 大模型之Transformers , PyTorch和Keras
  • 【Python爬虫】简单案例介绍2
  • iOS 设备配置和描述文件管理
  • Framework Binder架构分解
  • 双按键控制LED(中断优先级)
  • ‌DeepSeek模型在非图形智能体的应用中是否需要GPU
  • 印度zj游戏出海代投本土网盟广告核心优势
  • 程序化广告行业(84/89):4A广告代理公司与行业资质解读
  • 神舟十九号航天员乘组平安抵京
  • 陕西省通报6起违反八项规定典型问题,省卫健委原主任刘宝琴违规收受礼品礼金
  • 郭向阳任广东省公安厅分管日常工作副厅长(正厅级)
  • 百年传承,再启新程,参天中国迎来2.0时代
  • 排除燃气爆炸、人为放火可能,辽宁辽阳火灾事故起火原因正在调查
  • 青海西宁市城西区副区长于媛媛主动投案,接受审查调查