您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
remove redirects in zhihu.com
// ==UserScript== // @name remove_redirect // @namespace https://github.com/mikelxk/remove_redirect // @version 0.1.0 // @author mikelxk // @description remove redirects in zhihu.com // @license MIT // @icon https://vitejs.dev/logo.svg // @match *://*.zhihu.com/* // @grant none // ==/UserScript== (function () { 'use strict'; const updatedLinks = /* @__PURE__ */ new WeakSet(); const ZHIHU_PATTERNS = [ "https://link.zhihu.com/?target=", "http://link.zhihu.com/?target=" ]; function debounce(fn, delay) { let timeoutId; return (...args) => { clearTimeout(timeoutId); timeoutId = setTimeout(() => fn(...args), delay); }; } function updateLinkHref(link) { try { const href = link.href; if (!ZHIHU_PATTERNS.some((pattern) => href.includes(pattern))) { return null; } const urlParams = new URLSearchParams(href.split("?")[1]); const newLink = urlParams.get("target"); if (!newLink) return null; const decodedLink = decodeURIComponent(newLink); link.href = decodedLink; return decodedLink; } catch (error) { console.error("Error updating link:", error); return null; } } function updateAllLinks() { const links = document.getElementsByTagName("a"); Array.from(links).forEach((link) => updateLinkHref(link)); } const debouncedObserverCallback = debounce((mutations) => { mutations.forEach((mutation) => { if (mutation.type === "childList") { mutation.addedNodes.forEach((node) => { if (node instanceof HTMLElement) { if (node instanceof HTMLAnchorElement) { updateLinkHref(node); } else { const links = node.getElementsByTagName("a"); Array.from(links).forEach((link) => updateLinkHref(link)); } } }); } }); }, 100); document.addEventListener("DOMContentLoaded", updateAllLinks); const observer = new MutationObserver(debouncedObserverCallback); observer.observe(document.body, { childList: true, subtree: true }); window.addEventListener("unload", () => { observer.disconnect(); }); const listenedEvents = ["click", "mouseover"]; listenedEvents.forEach((eventName) => { document.addEventListener(eventName, (event) => { const target = event.target; if (target.tagName === "A") { const link = target; if (!updatedLinks.has(link)) { const newHref = updateLinkHref(link); if (newHref) { updatedLinks.add(link); if (eventName === "click") { event.preventDefault(); window.location.href = newHref; } } } } }); }); })();