您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Filter anchors in nav elements by keyword inputted by user in real time.
当前为
// ==UserScript== // @name chatGPT nav menu filter // @name:zh chatGPT左方列表遮罩 // @namespace openai // @version 0.1 // @author https://github.com/jctneko/ // @description Filter anchors in nav elements by keyword inputted by user in real time. // @match https://chat.openai.com/* // @run-at document-idle // @license You can modify as long as you credit me // ==/UserScript== /* Note: The OpenAI interface frequent updates, which can sometimes cause issues with this userscript. Please report any issues you encounter, and I will make the necessary corrections. */ (() => { 'use strict'; const observers = {}; const createInput = () => { const inputNode = document.createElement('input'); inputNode.type = 'text'; inputNode.id = 'filterKeyword'; inputNode.style.cssText = 'position: fixed; top:5px; left: 270px; color: white; background-color:#444654; padding:0 5px;'; inputNode.placeholder = 'filter_'; document.body.appendChild(inputNode); return inputNode; } const observeFetch = (urlToObserve, onStart, onFinish) => { observers[urlToObserve] = { onStart, onFinish }; } const moveLinks = (filterText) => { const navLinks = document.querySelectorAll('nav a'); navLinks.forEach((link) => { link.style.cssText = link.innerText.includes(filterText) ? '' : 'position: absolute; left: -300px;'; }); console.log('[gptFilter] items hided.'); } const updateNavLinks = () => { const inputNode = document.getElementById('filterKeyword'); if (inputNode) { setTimeout(() => { moveLinks(inputNode.value) }, 500); } } const handleInputChange = (event) => { moveLinks(event.target.value); } const bindEvents = (inputNode) => { let interval = setInterval(() => { if (unsafeWindow.next) { inputNode.addEventListener('input', handleInputChange); unsafeWindow.next.router.events.on('routeChangeComplete', updateNavLinks); console.log('[gptFilter] event binded'); clearInterval(interval); } }, 1000); unsafeWindow.fetch = new Proxy(unsafeWindow.fetch, { apply: function(target, thisArg, argumentsList) { const [url, options, ...args] = argumentsList; const observer = Object.keys(observers).find(key => url.includes(key)); if (observer) { const { onStart, onFinish } = observers[observer]; onStart && onStart(url, options, ...args); return target(url, options, ...args).then(response => { onFinish && onFinish(response); return response; }); } return target.apply(thisArg, argumentsList); } }); } const init = () => { const inputNode = createInput(); bindEvents(inputNode); } observeFetch( "https://chat.openai.com/backend-api/conversations", (url, options, ...args) => { // console.log("Fetch started: ", url); }, (response) => { console.log('[gptFilter] Nav element updated'); // console.log("Fetch finished: ", response.url); updateNavLinks(); } ); init(); })();