如何让 data-url 链接支持中键点击(新标签页打开)

本文介绍一种基于 Tampermonkey 的轻量级解决方案,通过自动将含 data-url 属性的 标签的 href 属性动态替换为真实 URL,使原本禁用中键点击的链接恢复“Ctrl+点击”或鼠标中键新标签页打开功能。
不知道你有没有遇到过这种烦心事儿:在浏览某些网站时,明明看到一个链接,想用鼠标中键或者按住 Ctrl 键点击,在新标签页里打开它,结果却发现点了没反应,页面只是在当前窗口里跳转了一下,甚至纹丝不动。这背后,很可能就是遇到了我们今天要聊的“伪链接”问题。
这类链接的典型写法是这样的:
课程详情
然而,这么做的直接后果就是,浏览器原生的“鼠标中键点击”和“Ctrl+左键”打开新标签页的功能彻底失效了。因为浏览器只认 `href` 属性里的地址,而那个地址根本不是一个有效的 URL。这对于习惯多标签页操作、追求效率的用户来说,体验无疑是大打折扣。
✅ 推荐方案:Tampermonkey 用户脚本
那么,有没有办法在不改变网站本身代码的情况下,优雅地解决这个问题呢?答案是肯定的。一个轻量且高效的方案,就是借助 Tampermonkey 这款强大的浏览器扩展,写一段小小的用户脚本。
操作起来很简单:首先,确保你的浏览器已经安装了 Tampermonkey。然后,新建一个用户脚本,把下面这段代码完整地粘贴进去保存即可。
// ==UserScript==
// @name Fix K12 data-url Links
// @namespace https://github.com/user/scripts
// @version 1.1
// @description 将 data-url 转换为真实 href,支持中键/右键新标签页打开
// @author You
// @match *://*.k12.com/*
// @match *://learning.k12.com/*
// @grant none
// ==/UserScript==
function updateLinks() {
document.querySelectorAll('a[data-url]').forEach(a => {
const dataUrl = a.dataset.url;
if (dataUrl && dataUrl.startsWith('/k12/redirect?url=')) {
try {
const rawUrl = dataUrl.substring('/k12/redirect?url='.length);
const decodedUrl = decodeURIComponent(rawUrl);
// 可选:确保协议安全(防止 open redirect)
if (decodedUrl.startsWith('https://') || decodedUrl.startsWith('https://')) {
a.href = decodedUrl;
}
} catch (e) {
console.warn('Failed to decode data-url:', dataUrl, e);
}
}
});
}
// 初始执行一次(覆盖已渲染元素)
updateLinks();
// 监听 DOM 变化(更优雅替代 setInterval)
const observer = new MutationObserver(() => {
updateLinks();
});
observer.observe(document.body, {
childList: true,
subtree: true
});
? 关键优化说明
这段脚本虽然不长,但里面有几个设计亮点值得细说,它们共同保证了方案的健壮性和高效性:
- 告别轮询,拥抱观察者:脚本没有使用传统的 `setInterval` 定时器去反复检查页面,而是采用了更现代的 `MutationObserver` API。这意味着只有当页面DOM结构真的发生变化时,脚本才会执行,极大地减少了不必要的性能开销,响应也更及时。
- 解码与校验,一个都不能少:脚本会先对 `data-url` 中的编码内容(比如 `%3A` 对应冒号 `:`)进行 `decodeURIComponent` 解码,确保最终得到的链接是可访问的。同时,它还增加了一层协议校验,只允许 `https://` 或 `https://` 开头的链接被替换,这在一定程度上防范了开放重定向的安全风险。
- 精准打击,避免误伤:通过 `@match` 指令,脚本被严格限定只在特定的域名(如 `*.k12.com`)下运行。这样一来,就不会影响到其他正常网站,保证了脚本作用的精确性。
⚠️ 注意事项
当然,没有任何方案是万能的。在应用这个脚本时,有几点需要你稍加留意:
- 如果目标页面采用了 Shadow DOM 或 Web Components 这类比较前沿的技术来渲染内容,标准的 `MutationObserver` 可能监听不到内部变化。这时,需要在观察器配置中尝试添加 `shadow: true` 参数。
- 对于单页面应用(SPA),链接可能会被动态创建或修改。得益于我们采用的观察者模式,脚本会在每次DOM更新后自动重新执行,因此通常无需手动干预。
- 如果脚本生效后,链接仍然无法用中键打开,那问题可能出在别处。比如,页面上可能有其他的 Ja vaScript 事件监听器(例如 `onclick` 事件里调用了 `e.preventDefault()`)拦截了点击行为。这种情况下,可以尝试在脚本的 `updateLinks` 函数中,谨慎地添加移除相关事件属性的逻辑(如 `a.removeAttribute(‘onclick’)`)。
总的来说,这个基于 Tampermonkey 的解决方案,可以看作是一个针对“伪链接”问题的专业级前端补丁。它零依赖、免配置、即装即用,能让你在不改变网站原有交互逻辑的前提下,无缝恢复浏览器最基础、也最高效的多标签页操作体验。
