Greasy Fork

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

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

目前为 2024-04-09 提交的版本。查看 最新版本

// ==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.30
// @license MIT
// @description  强制所有链接在当前标签打开,本脚本采用白名单机制,需手动点击油猴脚本的菜单生效
// @grant unsafeWindow
// @author       meteora
// @match *://*/*
// @grant        GM_registerMenuCommand
// @grant GM_unregisterMenuCommand
// @grant GM_setValue
// @grant GM_getValue
// ==/UserScript==
// ==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.29
// @license MIT
// @description  强制所有链接在当前标签打开,本脚本采用白名单机制,需手动点击油猴脚本的菜单生效
// @grant unsafeWindow
// @author       meteora
// @match *://*/*
// @grant        GM_registerMenuCommand
// @grant GM_unregisterMenuCommand
// @grant GM_setValue
// @grant GM_getValue
// @downloadURL https://update.greasyfork.org/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.user.js
// @updateURL https://update.greasyfork.org/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.meta.js
// ==/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"

	//替换form标签里面的target属性
	let domList = document.querySelectorAll("form")
	for (let i = 0; i < domList.length; i++) {
		domList[i].target = "_self"
	}
	//替换a标签里面的target属性
	domList = document.querySelectorAll("a")
	for (let i = 0; i < domList.length; i++) {
		domList[i].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,
	})
})()