news 2026/4/3 4:40:27

脱裤子放屁 - 你们讨厌这样的页面吗?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
脱裤子放屁 - 你们讨厌这样的页面吗?

前言

平时在逛掘金和少数派等网站的时候,经常有跳转外链的场景,此时基本都会被中转到一个官方提供的提示页面。

掘金:

知乎:

少数派:

这种官方脱裤子放屁的行为实在令人恼火。是、是、是、我当然知道这么做有很多冠冕堂皇的理由,比如:

  • 防止钓鱼攻击
  • 增强用户意识
  • 品牌保护
  • 遵守法律法规
  • 控制流量去向

(以上5点是 AI 告诉我的理由)

但是作为混迹多年的互联网用户,什么链接可以点,什么最好不要点(悄悄的点) 我还是具备判断能力的。

互联网的本质就是自由穿梭,一个 A 标签就可以让你在整个互联网翱翔,现在你每次起飞的时候都被摁住强迫你阅读一次免责声明,多少是有点恼火的。

解决方案

这些中转站的实现逻辑基本都是将目标地址挂在中转地址的target参数后面,在中转站做免责声明,然后点击继续跳转才跳到目标网站。

掘金:

https://link.juejin.cn/?target=https%3A%2F%2Fdeveloper.apple.com%2Fcn%2Fdesign%2Fhuman-interface-guidelines%2Fapp-icons%23macOS/

少数派:https://sspai.com/link?target=https%3A%2F%2Fgeoguess.games%2F

知乎:https://link.zhihu.com/?target=https%3A//asciidoctor.org/

所以我们就可以写一个浏览器插件,在这些网站中,找出命中外链的 A 标签,替换掉它的href属性(只保留 target 后面的真实目标地址)。

核心函数:

js

体验AI代码助手

代码解读

复制代码

function findByTarget() { if (!hostnames.includes(location.hostname)) return; const linkKeyword = "?target="; const aLinks = document.querySelectorAll( `a[href*="${linkKeyword}"]:not([data-redirect-skipper])` ); if (!aLinks) return; aLinks.forEach((a) => { const href = a.href; const targetIndex = href.indexOf(linkKeyword); if (targetIndex !== -1) { const newHref = href.substring(targetIndex + linkKeyword.length); a.href = decodeURIComponent(newHref); a.setAttribute("data-redirect-skipper", "true"); } }); }

为此我创建了一个项目仓库 redirect-skipper ,并且将该浏览器插件发布在谷歌商店了 安装地址 。

安装并启用这个浏览器插件之后,在这些网站中点击外链就不会看到中转页面了,而是直接跳转到目标网站。

因为我目前明确需要修改的就是这几个网站,如果大家愿意使用这个插件,且有其他网站需要添加到替换列表的,可以给 redirect-skipper 仓库 提PR。

如果需要添加的网站的转换规则是和findByTarget一致的,那么仅需更新sites.json文件即可。

如果需要添加的网站的转换规则是独立的,那么需要更新插件代码,合并之后,由我向谷歌商店发起更新。

为了后期可以灵活更新配置(谷歌商店审核太慢了),我默认将插件应用于所有网站,然后在代码里通过 hostname 来判断是否真的需要执行。

json

体验AI代码助手

代码解读

复制代码

{ "$schema": "https://json.schemastore.org/chrome-manifest.json", "name": "redirect-skipper", "manifest_version": 3, "content_scripts": [ { "matches": ["<all_urls>"], "js": ["./scripts/redirect-skipper.js"], "run_at": "document_end" } ], }

在当前仓库里维护一份sites.json的配置表,格式如下:

json

体验AI代码助手

代码解读

复制代码

{ "description": "远程配置可以开启 Redirect-Skipper 插件的网站 (因为谷歌商店审核太慢了,否则无需通过远程配置,增加复杂性)", "sites": [ { "hostname": "juejin.cn", "title": "掘金" }, { "hostname": "sspai.com", "title": "少数派" }, { "hostname": "www.zhihu.com", "title": "知乎" } ] }

这样插件在拉取到这份数据的时候,就可以根据这边描述的网站配置,决定是否执行具体代码。

插件完整代码:

js

体验AI代码助手

代码解读

复制代码

function replaceALinks() { findByTarget(); } function observerDocument() { const mb = new MutationObserver((mutationsList) => { for (const mutation of mutationsList) { if (mutation.type === "childList") { if (mutation.addedNodes.length) { replaceALinks(); } } } }); mb.observe(document, { childList: true, subtree: true }); } // 监听路由等事件 ["hashchange", "popstate", "load"].forEach((event) => { window.addEventListener(event, async () => { replaceALinks(); if (event === "load") { observerDocument(); await updateHostnames(); replaceALinks(); // 更新完数据后再执行一次 } }); }); let hostnames = ["juejin.cn", "sspai.com", "www.zhihu.com"]; function updateHostnames() { return fetch( "https://raw.githubusercontent.com/dogodo-cc/redirect-skipper/master/sites.json" ) .then((response) => { if (response.ok) { return response.json(); } throw new Error("Network response was not ok"); }) .then((data) => { // 如果拉到了远程数据,就用远程的 hostnames = data.sites.map((site) => { return site.hostname; }); }) .catch((error) => { console.error(error); }); } // 符合 '?target=' 格式的链接 // https://link.juejin.cn/?target=https%3A%2F%2Fdeveloper.apple.com%2Fcn%2Fdesign%2Fhuman-interface-guidelines%2Fapp-icons%23macOS/ // https://sspai.com/link?target=https%3A%2F%2Fgeoguess.games%2F // https://link.zhihu.com/?target=https%3A//asciidoctor.org/ function findByTarget() { if (!hostnames.includes(location.hostname)) return; const linkKeyword = "?target="; const aLinks = document.querySelectorAll( `a[href*="${linkKeyword}"]:not([data-redirect-skipper])` ); if (!aLinks) return; aLinks.forEach((a) => { const href = a.href; const targetIndex = href.indexOf(linkKeyword); if (targetIndex !== -1) { const newHref = href.substring(targetIndex + linkKeyword.length); a.href = decodeURIComponent(newHref); a.setAttribute("data-redirect-skipper", "true"); } }); }

作者:甜甜的泥土
链接:https://juejin.cn/post/7495977411273490447
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/2 10:26:32

专精特新企业为何必须进行系统性重构?谁最迫切需要?

专精特新企业为何必须进行系统性重构&#xff1f;谁最迫切需要&#xff1f; 在产业升级与数字转型的双重浪潮下&#xff0c;专精特新企业正面临一个历史性的抉择&#xff1a;是继续沿着传统路径前行&#xff0c;还是勇敢开启系统性重构之路&#xff1f;成都专知利乎数字科技有…

作者头像 李华
网站建设 2026/4/3 0:08:35

毕业两年了,25岁转行网络安全来得及吗?

毕业两年了&#xff0c;25岁转行网络安全来得及吗&#xff1f; 先说结论&#xff1a;一点不晚&#xff01; 首先说一下这个行业的现状&#xff0c;真正科班出身网络安全专业的很少&#xff0c;因为只有个别院校有这个专业&#xff0c;根据了解也是教的很浅&#xff0c;对接不…

作者头像 李华
网站建设 2026/3/23 0:50:19

都说网安人才缺口大,为什么大家还是找不到工作?

都说网安人才缺口大&#xff0c;为什么大家还是找不到工作&#xff1f; 为什么都说了网络安全的人才缺口巨大&#xff0c;但还是有很多人找不到工作&#xff0c;难道又被专家忽悠了&#xff1f; 壹 高校人才与企业需求不必匹配 首先学校教的专业知识太过基础&#xff0c;企…

作者头像 李华
网站建设 2026/4/3 3:02:30

ubuntu22安装cuda11.8和cudnn8

简单直接没废话在ubuntu22上安装cuda11.8和cudnn8 OK&#xff0c;装 CUDA 11.8 是个非常稳的选择 &#x1f44d; &#xff08;尤其对 YOLO / TensorRT / PyTorch / 多路视频推理 来说&#xff09; 我直接给你一套 Ubuntu 22.04 上“不翻车”的标准安装流程&#xff0c;一步一…

作者头像 李华
网站建设 2026/3/26 13:15:55

【译】Visual Studio 2026 来了:更快、更智能,深受老用户的喜爱

我们非常激动地宣布&#xff0c;Visual Studio 2026 现已正式发布&#xff01;这一刻是我们与您携手共创的成果。您的反馈对本次版本的塑造作用超过了以往任何一次。自 2025 年 9 月推出 Insiders 通道以来&#xff0c;下载并测试该预览版的开发者数量创下了 Visual Studio 历史…

作者头像 李华
网站建设 2026/3/31 5:40:40

互联网大厂Java求职面试实战:核心技术栈与AI场景深度解析

互联网大厂Java求职面试实战&#xff1a;核心技术栈与AI场景深度解析 面试背景及场景介绍 本次面试发生在一家顶尖互联网大厂&#xff0c;场景聚焦于AI增强内容社区&#xff08;AIGC&#xff09;项目的Java开发岗位。面试官严肃专业&#xff0c;针对Java核心技术栈及AI相关技…

作者头像 李华