如何将点击EventListener设置的链接目标从_blank改为_self?
解决方法:将动态处理的链接改为当前标签页打开
针对你遇到的场景(网站通过点击事件监听、利用<a>元素的id属性跳转新标签,且无href/target属性),可以通过以下方式实现需求:
方法一:拦截点击事件并自定义跳转(推荐)
通过在捕获阶段绑定全局点击事件,优先于原网站的事件监听器执行,阻止默认行为后自行在当前标签页跳转。
// ==UserScript== // @name 强制链接在当前标签页打开 // @namespace your-namespace // @version 0.1 // @description 改写网站动态链接的跳转方式为当前标签页 // @match https://目标网站域名/* // @grant none // ==/UserScript== (function() { 'use strict'; document.addEventListener('click', function(e) { // 找到被点击的<a>元素(包括嵌套元素触发的点击) const linkElement = e.target.closest('a'); if (linkElement && linkElement.id) { // 核心:替换成原网站通过id获取URL的逻辑 const targetUrl = getTargetUrlById(linkElement.id); if (targetUrl) { e.preventDefault(); // 阻止原事件的默认行为 e.stopPropagation(); // 阻止事件传递给原监听器 window.location.href = targetUrl; // 当前标签页跳转 } } }, true); // 捕获阶段触发,确保先于原网站的冒泡监听器执行 // 需根据网站实际逻辑修改此函数 function getTargetUrlById(elementId) { // 示例1:id直接拼接URL // return `https://目标网站.com/detail/${elementId}`; // 示例2:从网站全局映射对象获取 // return window.siteLinkMap[elementId]; // 你需要通过浏览器开发者工具分析原网站的JS代码,找到它生成URL的规则 return null; } })();
关键说明:
- 必须先通过浏览器开发者工具(F12)分析原网站的点击事件处理逻辑,找到它如何利用
<a>的id生成跳转URL,然后替换getTargetUrlById函数里的实现。 - 捕获阶段绑定事件(第三个参数
true)是核心,能确保我们的代码先于原网站的事件监听器执行,从而拦截原跳转行为。
方法二:覆盖原事件监听器(不推荐)
如果原网站的事件监听器是可访问的(比如绑定在全局对象上),可以尝试覆盖它,但这种方式兼容性差且不稳定:
- 可以通过
getEventListeners(浏览器调试API)查看元素上的绑定事件,但该API未标准化,userscript中可能无法正常使用。 - 若原监听器是匿名函数,几乎无法直接移除或覆盖,因此不推荐此方法。
内容的提问来源于stack exchange,提问作者jm92
相关产品推荐
相关产品推荐

