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

Greasy fork 爱吃馍镜像

Greasy Fork is available in English.

📂 缓存分发状态(共享加速已生效)
🕒 页面同步时间:2026/01/06 07:02:20
🔄 下次更新时间:2026/01/06 08:02:20
手动刷新缓存

baidu_translate_hot_key_tool

v0.1.0 百度翻译快捷键插件;支持聚焦/搜索内容发音/翻译结果发音

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

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

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

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

公众号二维码

扫码关注【爱吃馍】

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

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

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

公众号二维码

扫码关注【爱吃馍】

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

// ==UserScript==
// @name         baidu_translate_hot_key_tool
// @namespace    http://tampermonkey.net/
// @version      1.2.0
// @description  v0.1.0 百度翻译快捷键插件;支持聚焦/搜索内容发音/翻译结果发音
// @description  v1.0.0 整理代码, 移除兼容部分代码
// @description  v1.1.0 为了方便纯键盘操作(使用 vimium 插件), 在发音时使输入框失去焦点
// @description  v1.2.0 支持自定义 group keys, 包含 ctrl, alt, shift, meta; 详情见 log
// @icon         http://fanyi.bdstatic.com/static/translation/img/favicon/favicon_d87cd2a.ico
// @author       sven
// @include      https://fanyi.baidu.com/*
// @match        <$URL$>
// ==/UserScript==

; (function () {
    if (location.href.indexOf('https://fanyi.baidu.com/#') !== 0) return false
    const input = document.getElementById('baidu_translate_input')
    const Handler = {
        _originBtn: null,
        _resultBtn: null,
        _defaultTriggerKeys: ['ctrl', 'meta'],
        get triggerKeys() {
            const cache = localStorage.getItem('triggerKeys')
            return JSON.parse(cache) || this._defaultTriggerKeys
        },
        get originBtn() {
            return this._originBtn || (this._originBtn = document.querySelector('.input-operate .operate-btn.op-sound'))
        },
        get resultBtn() {
            return this._resultBtn || (this._resultBtn = document.querySelector('.output-operate .operate-btn.op-sound'))
        },
        init() {
            Handler.listenKeyup()
            Handler.addTips()
            console.log('%c[baidu_translate_hot_key_tool] %c可以使用例如 `%clocalStorage.setItem("triggerKeys", \'["ctrl", "alt"]\')%c` 方式修改默认快捷键(user settings), 只支持 ctrl, alt, meta, shift', 'color: teal', 'color: auto', 'color: #FFF', 'color: auto')
            const userTriggerKeys = localStorage.getItem('triggerKeys');
            if (Array.isArray(JSON.parse(userTriggerKeys))) {
                console.log('%c[baidu_translate_hot_key_tool] %c已使用自定义快捷键: ' + userTriggerKeys, 'color: teal', 'color: #FFF')
            }
        },
        /**
         * 监听键盘事件
         * ctrl+meta+up(focus) 聚焦并选中
         * ctrl+meta+left(say) 发音[输入内容]
         * ctrl+meta+right(say) 发音[翻译结果]
         * Mac 下 meta 键换为 alt 键
         */
        listenKeyup() {
            document.addEventListener('keyup', evt => {
                const {
                    altKey, ctrlKey, shiftKey, keyCode, metaKey
                } = evt
                const trigger = this.triggerKeys.every(t => evt[t + 'Key'])
                if (!trigger) return false
                const originBtn = document.querySelector('.input-operate .operate-btn.op-sound')
                const resultBtn = document.querySelector('.output-operate .operate-btn.op-sound')
                switch (keyCode) {
                    case 38: // up
                        if (evt.target.tagName === 'TEXTAREA') return false;
                        input.focus()
                        input.select()
                        break
                    case 37: // left
                        originBtn && originBtn.click()
                        input.blur()
                        break
                    case 39: // right
                        resultBtn && resultBtn.click()
                        input.blur()
                        break
                }
            })
        },
        addTips() {
            // window.addEventListener('load', evt => {
            //    if (this.originBtn) this.originBtn.innerHTML += '<div>ctrl+meta+left</div>'
            //    if (this.resultBtn) this.resultBtn.innerHTML += '<div>ctrl+meta+right</div>'
            // })
        }
    }
    Handler.init()
})();