// ==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.27 // @license MIT // @description 强制所有链接在当前标签打开,本脚本采用白名单机制,需手动点击油猴脚本的菜单生效 // @grant unsafeWindow // @author meteora // @match *://* // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_setValue // @grant GM_getValue // @downloadURL none // ==/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, }); })();