Tampermonkey Script

这里放一些我写油候脚本时候的示例

获取元素的异步函数

    /**
 * 获取元素的异步函数
 * @param {string} selector - 元素的选择器
 * @param {number} delay - 尝试获取元素的最大等待时间(毫秒)
 * @returns {Promise<HTMLElement>} - 返回找到的元素或抛出错误
 */
    function getElement(selector, delay) {
        return new Promise((resolve, reject) => {
            const element = document.querySelector(selector);
            if (element) {
                resolve(element);
            } else {
                setTimeout(() => {
                    const elementAfterDelay = document.querySelector(selector);
                    if (elementAfterDelay) {
                        resolve(elementAfterDelay);
                    } else {
                        reject(new Error(`元素未找到: ${selector}`));
                    }
                }, delay);
            }
        });
    }

显示 正在加载插件 消息

     /**
     * 显示"正在加载插件"消息
     */
    function showLoadingMessage() {
        // 创建一个新的div元素来显示加载消息
        var loadingMessage = document.createElement('div');
        // 设置消息内容
        loadingMessage.innerHTML = '正在加载插件';
        // 设置消息的样式
        loadingMessage.style.position = 'fixed';
        loadingMessage.style.top = '50px';
        loadingMessage.style.left = '50%';
        loadingMessage.style.fontSize = '20px';
        loadingMessage.style.opacity = '1';
        // 将消息元素添加到页面上
        document.body.appendChild(loadingMessage);
        // 设置一个定时器,在2秒后开始淡出动画
        setTimeout(function() {
            // 使用CSS过渡来改变透明度
            loadingMessage.style.transition = 'opacity 1s ease-out';
            // 设置透明度为0以启动淡出动画
            loadingMessage.style.opacity = '0';
        }, 2000);
    }

使用 百度翻译

    /**
     * @function translateContent
     * @description 使用百度翻译API将中文文本翻译成英文
     * @param {string} query - 源文本
     * @returns {Promise<string>} 翻译后的文本
     */
    function translateContent(query) {
        return new Promise((resolve, reject) => {
            const salt = Date.now();
            const signStr = BAIDU_APPID + query + salt + BAIDU_KEY;
            const sign = CryptoJS.MD5(signStr).toString();
            const url = 'http://api.fanyi.baidu.com/api/trans/vip/translate';
            const data = `q=${encodeURIComponent(query)}&appid=${BAIDU_APPID}&salt=${salt}&from=${BAIDU_FROM}&to=${BAIDU_TO}&sign=${sign}`;

            GM.xmlHttpRequest({
                method: 'POST',
                url,
                headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
                data,
                onload: (response) => {
                    if (response.status === 200) {
                        const respJSON = JSON.parse(response.responseText);
                        if (respJSON && respJSON.trans_result?.length) {
                            return resolve(respJSON.trans_result[0].dst);
                        }
                        console.error('翻译失败:', respJSON);
                        return reject('翻译失败');
                    }
                    console.error('翻译请求失败:', response);
                    reject('翻译请求失败');
                },
                onerror: (err) => {
                    console.error('请求发送错误:', err);
                    reject(err);
                }
            });
        });
    }

文本框之间的自动翻译

    /**
     * @function setupInputEventListener
     * @description 当用户在源输入框中输入时,自动翻译并写入目标输入框(防抖处理)
     * @param {string} containerId - 容器的 ID
     * @param {string} sourceSelector - 源输入框的选择器
     * @param {string} targetSelector - 目标输入框的选择器
     */
    function setupInputEventListener(containerId, sourceSelector, targetSelector) {
        const container = document.getElementById(containerId);
        if (!container) {
            console.error(`未找到容器 ID: ${containerId}`);
            return;
        }
        const sourceEl = container.querySelector(sourceSelector);
        if (!sourceEl) {
            console.error(`未在容器 '${containerId}' 中找到源元素: '${sourceSelector}'`);
            return;
        }
        sourceEl.addEventListener('input', debounce(() => {
            const sourceText = sourceEl.value.trim();
            if (!sourceText) return; // 若为空,不发起翻译请求

            translateContent(sourceText)
                .then((translated) => {
                    const targetEl = container.querySelector(targetSelector);
                    if (targetEl) {
                        targetEl.value = translated;
                    } else {
                        console.error(`未在容器 '${containerId}' 中找到目标元素: '${targetSelector}'`);
                    }
                })
                .catch((error) => console.error('翻译失败:', error));
        }, 500));
    }

最后更新于

这有帮助吗?