// ==UserScript== // @name 编辑网页 // @namespace http://tampermonkey.net/ // @version 1.1.0 // @description 这是一个能编辑任何网页文本的扩展 // @author yhu // @license GPL-3.0 // @match *://*/* // @grant none // ==/UserScript== (function() { 'use strict'; let currentElement = null; function makeEditable(el) { if (el.isContentEditable || el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.closest('button, a, [role="button"]')) return; if (currentElement) { currentElement.contentEditable = 'false'; currentElement.style.outline = ''; currentElement.style.backgroundColor = ''; currentElement = null; } el.contentEditable = 'true'; el.style.outline = '2px dashed #4a9eff'; el.style.backgroundColor = 'rgba(74, 158, 255, 0.1)'; el.focus(); const observer = new MutationObserver(() => { el.style.color = 'yellow'; observer.disconnect(); }); observer.observe(el, { childList: true, subtree: true, characterData: true }); el.addEventListener('blur', () => { observer.disconnect(); el.contentEditable = 'false'; el.style.outline = ''; el.style.backgroundColor = ''; currentElement = null; }, { once: true }); currentElement = el; } document.body.addEventListener('click', (e) => { if (e.detail === 2 || e.target.isContentEditable) return; if (currentElement && !currentElement.contains(e.target)) { currentElement.contentEditable = 'false'; currentElement.style.outline = ''; currentElement.style.backgroundColor = ''; currentElement = null; } let node = e.target; while (node && node.nodeType === Node.TEXT_NODE) node = node.parentElement; if (!node) return; const editEl = node.closest('p, h1, h2, h3, h4, h5, h6, li, span, div, label, td, th, figcaption, legend'); if (editEl) { e.preventDefault(); e.stopPropagation(); makeEditable(editEl); } }, true); })();