Greasy Fork

强制所有链接在当前标签打开

强制所有链接在当前标签打开,本脚本采用白名单机制,需手动点击油猴脚本的菜单生效

目前为 2024-01-12 提交的版本。查看 最新版本

// ==UserScript==
// @name         强制所有链接在当前标签打开
// @namespace    https://greasyfork.org/zh-CN/scripts/446917-%E5%BC%BA%E5%88%B6%E6%89%80%E6%9C%89%E9%93%BE%E6%8E%A5%E5%9C%A8%E5%BD%93%E5%89%8D%E6%A0%87%E7%AD%BE%E6%89%93%E5%BC%80
// @version      0.26
// @license MIT
// @description  强制所有链接在当前标签打开,本脚本采用白名单机制,需手动点击油猴脚本的菜单生效
// @grant unsafeWindow
// @author       meteora
// @include *://*
// @grant        GM_registerMenuCommand
// @grant GM_unregisterMenuCommand
// @grant GM_setValue
// @grant GM_getValue
// ==/UserScript==
(function () {
  "use strict";
  //排除iframe
  if (window.self !== window.top) {
    return;
  }
  // 白名单管理
  function whiteList() {
    let domainEnable;
    let subDomainEnable;
    //一级域名,例如:baidu.com
    let currentDomain = location.hostname.split(".").slice(-2).join(".");
    //二级域名,例如 www.baidu.com
    let currentSubDomain = location.hostname;
    let domainList = GM_getValue("n2GndfLDBAh_domainList");
    let subDomainList = GM_getValue("n2GndfLDBAh_subDomainList");
    if (domainList) {
      domainList = JSON.parse(domainList);
      for (let i = 0; i < domainList.length; i++) {
        const item = domainList[i];
        if (item === currentDomain) {
          domainEnable = true;
          GM_registerMenuCommand("排除 " + currentDomain, () => {
            domainList.splice(i, 1);
            GM_setValue(
              "n2GndfLDBAh_domainList",
              JSON.stringify(domainList),
            );
            unsafeWindow.location.reload();
          });
          break;
        }
      }
    }
    if (!domainEnable) {
      GM_registerMenuCommand("添加 " + currentDomain, () => {
        if (!domainList) {
          domainList = [];
        }
        domainList.push(currentDomain);
        GM_setValue(
          "n2GndfLDBAh_domainList",
          JSON.stringify(domainList),
        );
        unsafeWindow.location.reload();
      });
    }
    if (subDomainList) {
      subDomainList = JSON.parse(subDomainList);
      for (let i = 0; i < subDomainList.length; i++) {
        const item = subDomainList[i];
        if (item === currentSubDomain) {
          subDomainEnable = true;
          GM_registerMenuCommand("排除 " + currentSubDomain, () => {
            subDomainList.splice(i, 1);
            GM_setValue(
              "n2GndfLDBAh_subDomainList",
              JSON.stringify(subDomainList),
            );
            unsafeWindow.location.reload();
          });
          break;
        }
      }
    }
    if (!subDomainEnable && currentSubDomain !== currentDomain) {
      GM_registerMenuCommand("添加 " + currentSubDomain, () => {
        if (!subDomainList) {
          subDomainList = [];
        }
        subDomainList.push(currentSubDomain);
        GM_setValue(
          "n2GndfLDBAh_subDomainList",
          JSON.stringify(subDomainList),
        );
        unsafeWindow.location.reload();
      });
    }
    return domainEnable || subDomainEnable;
  }
  if (!whiteList()) return false;

  document.head.appendChild(document.createElement("base")).target = "_self";

  const listener = function (e) {
    let dom = e.target;
    if (dom.nodeName === "A") {
      dom.target = "_self";
      return;
    }
    //循环迭代获取父节点
    for (let i = 0; i < 5; i++) {
      dom = dom.parentNode;
      //如果是a标签
      if (dom.nodeName === "A") {
        dom.target = "_self";
        return;
      }
    }
  };
  document.body.addEventListener("click", listener, true);
  //对于调用window.open跳转的
  const open = unsafeWindow.open;
  const newOpen = function (
    url = false,
    target = "_self",
    windowFeatures = false,
  ) {
    if (url && windowFeatures) {
      open(url, "_self", windowFeatures);
    } else if (url) {
      open(url, "_self");
    } else {
      open();
    }
  };
  Object.defineProperty(unsafeWindow, "open", {
    value: newOpen,
  });
})();