Greasy Fork 支持简体中文。

网页文本修改器

允许通过右键菜单修改网页上选中的文本

// ==UserScript==
// @name         网页文本修改器
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  允许通过右键菜单修改网页上选中的文本
// @author       BIG-huang44
// @match        *://*/*
// @grant        GM_registerMenuCommand
// @grant        GM_addStyle
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_notification
// ==/UserScript==

(function() {
    'use strict';

    // 添加自定义样式
    GM_addStyle(`
        .text-edit-popup {
            position: fixed;
            background: white;
            border: 1px solid #ccc;
            padding: 10px;
            box-shadow: 2px 2px 5px rgba(0,0,0,0.2);
            z-index: 9999;
        }
        .text-edit-textarea {
            min-width: 200px;
            min-height: 100px;
            margin-bottom: 10px;
        }
        .text-edit-buttons {
            display: flex;
            gap: 10px;
            justify-content: flex-end;
        }
        .mobile-edit-button {
            position: fixed;
            background: #4CAF50;
            color: white;
            padding: 8px 12px;
            border-radius: 4px;
            box-shadow: 0 2px 5px rgba(0,0,0,0.2);
            z-index: 10000;
            font-size: 14px;
            touch-action: none;
        }
    `);

    // 检测是否为移动设备
    const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);

    // 创建编辑弹窗
    function createEditPopup(x, y, originalText, targetElement) {
        const popup = document.createElement('div');
        popup.className = 'text-edit-popup';
        
        // 移动端适配:确保弹窗在可视区域内
        if (isMobile) {
            popup.style.left = '50%';
            popup.style.top = '50%';
            popup.style.transform = 'translate(-50%, -50%)';
            popup.style.width = '90%';
            popup.style.maxWidth = '400px';
        } else {
            popup.style.left = x + 'px';
            popup.style.top = y + 'px';
        }

        const textarea = document.createElement('textarea');
        textarea.className = 'text-edit-textarea';
        textarea.value = originalText;
        if (isMobile) {
            textarea.style.width = '100%';
        }
        
        const buttonsDiv = document.createElement('div');
        buttonsDiv.className = 'text-edit-buttons';

        const saveButton = document.createElement('button');
        saveButton.textContent = '保存';
        saveButton.onclick = () => {
            targetElement.textContent = textarea.value;
            document.body.removeChild(popup);
        };

        const cancelButton = document.createElement('button');
        cancelButton.textContent = '取消';
        cancelButton.onclick = () => {
            document.body.removeChild(popup);
        };

        buttonsDiv.appendChild(saveButton);
        buttonsDiv.appendChild(cancelButton);
        popup.appendChild(textarea);
        popup.appendChild(buttonsDiv);

        return popup;
    }

    // 处理选中文本的函数
    function handleSelectedText() {
        const selection = window.getSelection();
        if (selection.toString().trim()) {
            const range = selection.getRangeAt(0);
            const container = range.commonAncestorContainer;
            const targetElement = container.nodeType === 3 ? container.parentNode : container;
            
            const rect = range.getBoundingClientRect();
            const x = rect.left + window.scrollX;
            const y = rect.bottom + window.scrollY;

            const popup = createEditPopup(x, y, selection.toString(), targetElement);
            document.body.appendChild(popup);
            return true;
        }
        return false;
    }

    // 为移动端添加编辑按钮
    function createMobileEditButton(x, y) {
        const button = document.createElement('button');
        button.className = 'mobile-edit-button';
        button.textContent = '编辑文本';
        button.style.left = x + 'px';
        button.style.top = y + 'px';
        
        button.onclick = () => {
            handleSelectedText();
            document.body.removeChild(button);
        };
        
        document.body.appendChild(button);
        
        // 3秒后自动移除按钮
        setTimeout(() => {
            if (button.parentNode) {
                document.body.removeChild(button);
            }
        }, 3000);
    }

    // 注册 Tampermonkey 菜单命令
    GM_registerMenuCommand("修改选中文本", function() {
        if (!handleSelectedText()) {
            GM_notification({
                text: "请先选择要修改的文本",
                timeout: 2000
            });
        }
    });

    // 添加快捷键支持
    document.addEventListener('keydown', function(e) {
        // 支持 Windows(Ctrl+Q) 和 Mac(Command+Q)
        if ((e.ctrlKey || e.metaKey) && e.key === 'q') {
            e.preventDefault();
            handleSelectedText();
        }
    });
})();