🎉 欢迎访问GreasyFork.Org 镜像站!本镜像站由公众号【爱吃馍】搭建,用于分享脚本。联系邮箱📮

Greasy fork 爱吃馍镜像

强制页面在新标签页打开

强制链接在新标签页打开,脚本采用白名单的模式,在油猴自带的菜单里面控制开关

คุณจะต้องติดตั้งส่วนขยาย เช่น Tampermonkey, Greasemonkey หรือ Violentmonkey เพื่อติดตั้งสคริปต์นี้

You will need to install an extension such as Tampermonkey to install this script.

คุณจะต้องติดตั้งส่วนขยาย เช่น Tampermonkey หรือ Violentmonkey เพื่อติดตั้งสคริปต์นี้

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

🚀 安装遇到问题?关注公众号获取帮助

公众号二维码

扫码关注【爱吃馍】

回复【脚本】获取最新教程和防失联地址

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

🚀 安装遇到问题?关注公众号获取帮助

公众号二维码

扫码关注【爱吃馍】

回复【脚本】获取最新教程和防失联地址

// ==UserScript==
// @name         强制页面在新标签页打开
// @namespace    http://tampermonkey.net/
// @version      0.1.5
// @description  强制链接在新标签页打开,脚本采用白名单的模式,在油猴自带的菜单里面控制开关
// @author       You
// @match        http://*/*
// @match        https://*/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=openai.com
// @grant GM_registerMenuCommand
// @grant GM_unregisterMenuCommand
// @grant unsafeWindow
// @license MIT
// ==/UserScript==

;(function () {
  "use strict"

  //网页白名单管理
  function whiteListManage() {
    let menuId
    //开启
    function open() {
      GM_unregisterMenuCommand(menuId)
      hookPageWhenDomChange()
      hookPage()
      localStorage.setItem("whiteList_a5c9f2b1", "true")
      GM_registerMenuCommand("关闭", function () {
        close()
      })
    }
    //关闭
    function close() {
      GM_unregisterMenuCommand(menuId)
      localStorage.setItem("whiteList_a5c9f2b1", "false")
      location.reload()
    }

    let whiteList = localStorage.getItem("whiteList_a5c9f2b1")
    if (!whiteList || whiteList === "false") {
      menuId = GM_registerMenuCommand("开启", open)
    } else if (whiteList === "true") {
      hookPageWhenDomChange()
      hookPage()
      menuId = GM_registerMenuCommand("关闭", close)
    }
  }

  //修改页面以实现链接在新标签页打开
  function hookPage() {
    hookWindowOpen()
    hookATag()
  }

  function hookATag() {
    // 获取页面上的所有链接元素
    let links = document.getElementsByTagName("a")
    for (let i = 0; i < links.length; i++) {
      //如果标签的href属性为空或者是javascript:开头的则跳过
      if (
        !links[i].href ||
        links[i].href.startsWith("javascript:") ||
        links[i].href.endsWith("#") ||
        links[i].href.endsWith("#;")
      ) {
        continue
      }
      // 遍历每个链接元素并添加目标属性
      links[i].setAttribute("target", "_blank")
      //给标签添加点击事件,点击后标红
      links[i].addEventListener("click", function () {
        this.style.color = "darkred"
      })
    }
  }

  function hookWindowOpen() {
    // 保存原始的 window.open 方法的引用
    let originalOpen = unsafeWindow.open
    // 重写 window.open 方法
    unsafeWindow.open = function (url, target, features) {
      // 在新标签页中打开链接
      originalOpen.call(this, url, "_blank", features)
    }
  }

  //监听dom节点变化以应对异步刷新的场景,一旦dom节点发生变化则重新执行hookPage
  function hookPageWhenDomChange() {
    let MutationObserver =
      window.MutationObserver || window.WebKitMutationObserver
    let observer = new MutationObserver(function (mutations) {
      mutations.forEach(function (mutation) {
        hookATag()
      })
    })
    observer.observe(document.body, {
      childList: true, // 观察目标子节点的变化,是否有添加或者删除
      subtree: true, // 观察后代节点,默认为 false
      attributes: false, // 观察属性变动
    })
  }

  function init() {
    whiteListManage()
  }
  init()
})()