如何用用户脚本点击特定链接时打开修改后URL且不触发原请求
需求可行性与实现方案
这个需求完全可行,核心思路是拦截链接的点击事件,在浏览器触发默认跳转行为之前终止它,然后手动打开修改后的URL,完全不需要修改DOM或依赖@run-at document-start的加载时机。
关键实现步骤
- 监听点击事件:给目标页面的document或特定父容器绑定
click事件,设置事件捕获阶段触发(用addEventListener的第三个参数true),这样能比默认的冒泡更早拿到事件,确保拦截优先级。 - 识别目标链接:在事件回调里判断点击的元素是不是目标链接——可以通过元素的
tagName(必须是A)、文本内容、原href特征等条件筛选,注意要通过event.target向上遍历找到真正的<a>标签(比如点击了链接里的子元素)。 - 阻止默认行为与冒泡:确认是目标链接后,调用
event.preventDefault()阻止浏览器跳转原URL,再调用event.stopPropagation()避免其他脚本干扰。 - 打开修改后的URL:根据原URL生成修改后的地址,用
window.open()(新窗口)或window.location.href = 新地址(当前窗口)实现跳转,完全不会触发原URL的请求。
示例代码
// ==UserScript== // @name 链接重定向拦截 // @namespace http://tampermonkey.net/ // @version 0.1 // @description 拦截特定链接点击,跳转修改后的URL // @match https://example.com/* // 替换成你的目标页面 // @grant none // ==/UserScript== (function() { 'use strict'; // 监听document的点击事件,捕获阶段触发 document.addEventListener('click', function(event) { // 找到点击路径中的<a>标签 let targetLink = event.target.closest('a'); if (!targetLink) return; // 判断是否是目标链接:这里示例用href包含特定关键词,可替换成其他条件 const originalHref = targetLink.href; if (!originalHref.includes('target-path')) return; // 阻止默认跳转行为 event.preventDefault(); event.stopPropagation(); // 生成修改后的URL const modifiedHref = originalHref.replace('old-part', 'new-part'); // 跳转:当前窗口打开用下面一行,新窗口用window.open(modifiedHref) window.location.href = modifiedHref; }, true); // 第三个参数true表示捕获阶段监听 })();
为什么不需要@run-at document-start
因为事件监听是绑定在document上的,只要脚本在页面加载完成前(比如默认的@run-at document-end)执行,就能完成监听绑定,后续所有点击事件都会被捕获。哪怕页面动态加载新的链接,这种监听方式也能生效(因为是委托在document上,不需要给每个链接单独绑定)。
隐秘性保障
- 全程没有修改任何DOM元素的
href属性,页面源码和元素检查里看到的还是原链接; - 调用
preventDefault()直接阻止了浏览器的默认跳转,不会向原URL发送任何请求,完全符合需求。
内容的提问来源于stack exchange,提问作者user3315073
相关产品推荐
相关产品推荐

