Greasy Fork

来自缓存

Greasy Fork is available in English.

链接点击打开(丐版)

将页面中所有链接修改成可单击跳转(蓝色字体,无下划线)。存在很多问题如:1. GitHub 页面只能转换第一个链接,点击raw查看无链接(必须刷新); 2. 其它脚本的弹窗链接也转换了。PS:应该没有性能问题,但不再更新,保留此丐版,移步另一个脚本。

当前为 2025-04-07 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         链接点击打开(丐版)
// @version      1.1
// @namespace   http://greasyfork.icu/users/1171320
// @description  将页面中所有链接修改成可单击跳转(蓝色字体,无下划线)。存在很多问题如:1. GitHub 页面只能转换第一个链接,点击raw查看无链接(必须刷新); 2. 其它脚本的弹窗链接也转换了。PS:应该没有性能问题,但不再更新,保留此丐版,移步另一个脚本。
// @match        *://*/*
// @exclude      *://*.cloudflare.com/*
// @exclude      *://*.recaptcha.net/*
// @run-at       document-end
// @grant        none
// @author         yzcjd
// @author2       ChatGPT4 辅助
// @license MIT
// @icon data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDE2IDE2Ij4gPHBhdGggZmlsbD0iIzRjNGM0ZCIgZD0iTTMuNSAxYS41LjUgMCAxIDAgMCAxSDR2OWgtLjVhLjUuNSAwIDAgMCAwIDFoNy44NTVhLjUuNSAwIDAgMCAuNDc1LS4xODQuNS41IDAgMCAwIC4xMDYtLjM5OFYxMC41YS41LjUgMCAxIDAtMSAwdi41SDZWMmguNWEuNS41IDAgMSAwIDAtMWgtM3oiLz4gPHBhdGggZmlsbD0iIzQ1YTFmZiIgZD0iTTIuNSAxNGExIDEgMCAxIDAgMCAyaDExYTEgMSAwIDEgMCAwLTJoLTExeiIvPiA8L3N2Zz4=
// ==/UserScript==

(function () {
  'use strict';

  // 精确匹配常见网址和路径,排除结尾异常字符
  const urlRegex = /\b(?:https?:\/\/)?(?:[\w-]+\.)+[a-z]{2,}(?:\/[\w\-./?%&=#]*)?/gi;

  const cleanUrl = (raw) => {
    return raw.replace(/[`"',。,!?!))))、))\]\[]+$/, ''); // 清除结尾非链接字符
  };

  const convertText = (node) => {
    if (node.nodeType !== 3 || !node.textContent.trim()) return;
    const text = node.textContent;
    const parent = node.parentNode;
    if (!parent || ['a', 'script', 'style', 'textarea'].includes(parent.tagName?.toLowerCase())) return;
    if (!urlRegex.test(text)) return;

    const span = document.createElement('span');
    span.innerHTML = text.replace(urlRegex, (match) => {
      const clean = cleanUrl(match);
      const href = /^https?:\/\//i.test(clean) ? clean : 'https://' + clean;
      return `<a href="${href}" target="_blank" style="color:blue;text-decoration:none">${clean}</a>`;
    });

    parent.replaceChild(span, node);
  };

  const walk = (root) => {
    const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null, false);
    let node;
    while ((node = walker.nextNode())) convertText(node);
  };

  const observer = new MutationObserver((muts) => {
    muts.forEach(m => m.addedNodes.forEach(n => walk(n)));
  });

  walk(document.body);
  observer.observe(document.body, { childList: true, subtree: true });
})();