bilibili倍速快捷键(增强)+记忆

bilibili倍速快捷键+记忆(可自定义设置快捷键,自定义一个额外倍速按钮,设置记忆模式)

目前為 2023-02-19 提交的版本,檢視 最新版本

// ==UserScript==
// @name         bilibili倍速快捷键(增强)+记忆
// @namespace    tonyu_balabala_03e6ea
// @version      1.0
// @description  bilibili倍速快捷键+记忆(可自定义设置快捷键,自定义一个额外倍速按钮,设置记忆模式)
// @author       Tony
// @icon        data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAoVQTFRFAAAAfov/f4v/f4z/f4z/f4z/f4z/f4v/fYr/fov/f4z/f4z/f4z/f4z/f4z/foz/fYv/e4n/f4z/f4z/f4z/fov/eor/for/f4z/f4z/f4z/foz/f4v/eYj/eon/fov/foz/f4z/f4z/f4z/foz/f4z/f4z/fov/d4j/fov/f4z/f4z/fov/foz/f4z/fov/fIz/UWD8UWD8UWD8UWD8q7D/q7D/q7D/fYv/foz/fov/fIn/f4z/QID/UWD8UWD8UWD8q7D/q7D/q7D/q7D/Zmb/f4z/f4z/eYz/f4z/fov/UWD8q7D/q7D/q7D/VYD/f4z/f4z/f4r/f4z/fIv/q7D/for/f4z/fYr/f4z/fov/q7D/q7D/fov/foz/f4z/aoD/q7D/cID/f4z/fYv/f4v/q7D/q7D/q7D/f4z/f4z/fov/UWD8UWD8q7D/q7D/q7D/q7D/q7D/f4v/f4z/fov/UWD8UWD8UWD8f4z/f4z/f4z/e4f/UWD8UWD8d4n/f4z/d4b/UWD8eIf/f4z/f4z/UWD8UWD8UWD8UWD8f4v/f4z/foz/fov/foz/f4z/fYv/f4z/f4z/fIv/f4z/eIf/eYb/f4z/f4z/fov/fov/f4z/foz/f4z/fIr/fIz/f4z/f4z/f4z/cXH/YID/f4z/foz/fYj/f4z/UWD8UWD8f4z/fIn/for/foz/fIz/UWD8UWD8foz/f4z/for/f4v/fov/bW3/cXH/f4z/f4z/foz/f4z/f4z/fov/foz/eYj/eon/foz/f4z/f4z/fov/eIf/f4z/f4z/f4z/f4v/e4T/for/foz/f4z/f4z/f4z/f4v/for/f4v/f4z/f4v/fov/VQ1gSwAAANd0Uk5TAB9fg5SSgVoXFY3Z/v/RgQ4FjPXwewMh1MloNxUEBhg7b9XFLujMOgFG29weH+eFBhjl2xAeRAEJnRQE0ABM/zOU/9E9AIq5A4mDTZn7awCjYxfLBl4J3g6OOfcoV2XdALEB2iBjhP4ckFkxUjcJXGZhCEuCEtS9UBxWkwTk1wdiBcgIYYDBojYLIFVYNE86Gm2aEdYBAuXAgURmWe8JDeZ3nwABulQDw0sypQIWpQnYyrjKDh5QAAHIFBW7kUMbBwhLmeMOAmDt5FIBDGPG/bxZCD9YPBCTjRZGAAACCklEQVR4nJWT+V9MURjGX1FMzaNoUZaULJkSaSRbJzdDSZRE2UJ2lZ1kC9FiT9bKkrKVXUJR1rLv/p7OPXfmujN3/OD55Tzv+3w/n3Pez+c9RP+jLi5du7m6de/hPDW4exghZOzp6aWLe/X2hkY+vn72eR9/3g3o26//gMCBQcGDeBFi0OaDhwBDh4XaytDhJiAs/G8+IgIYOUp2kaOjzGOix1LMOMA03pZPmAgETxI2lrG4yVL8FLJMBaYlWIFEYLqSUxIHZkhS8kyalQKkKs3Z3kibQ3aAJKXT3HnwyRDNTGA+OQILFtIiYLFoZiFkiQ6QltKybKTJveXACtICKwWwajWtAeRB1gLrVCCHsdy89Ru4Nm6izUAQ720BtlJkklDONsa25yveTDuAAg7sBHbRbqbTHtoLFHLAFdhHUXpgPx0AijhwUH6KOU4o9xBjxSWKL6Uy4DAHjgBH1UfmM1aiFseA4/w4AZy0G1MtymE8JZ8VqDjtDDhzFueEOQ9ccAZUAlXCeFUj+6IeuBSByzGKvQLUXHUEauuAa1b2+g0g0SLsTcZuCWPh61DfYLvtdhZw567szPful4prHwAPH6nzUKO8pI+bbOWTIr6kT5+RRs0tfNNNz1+0tr0Mf/X6DS/q35Kd3rV3aD/O+w8fyVGfPn+xfr2v377/0MVChp+/UgsLfv9xnv5Dnauuj5T4NeYmAAAAAElFTkSuQmCC
// @license       MIT
// @match        *://*.bilibili.com/*
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// ==/UserScript==

(function() {
    'use strict';
    let hasObserve = false
    let count = 0
    let defaultSpd = 1
    let callbackTimer
    let spdMemoryMode = GM_getValue('tony_spd_memory_mode', '2')
    let spdKCSettings = []
    let spdKCSettingKeys = ['tony_spd2_KC', 'tony_spd1p5_KC', 'tony_spd1p25_KC', 'tony_spd1_KC', 'tony_spd0p75_KC', 'tony_spd0p5_KC', 'tony_spdcus_KC']
    let spdKCSettingDefaultVals = [66, 86, 67, 71, 72, 74, 75]
    let spdKNames = []
    let spdKNameKeys = ['tony_spd2_KC_name', 'tony_spd1p5_KC_name', 'tony_spd1p25_KC_name', 'tony_spd1_KC_name', 'tony_spd0p75_KC_name', 'tony_spd0p5_KC_name', 'tony_spdcus_KC_name']
    let spdKNameDefaultVals = ['b', 'v', 'c', 'g', 'h', 'j', 'k']
    // spd2_KC_enable, spd1p5_KC_enable, spd1p25_KC_enable, spd1_KC_enable, spd0p75_KC_enable, spd0p5_KC_enable
    let spdEnableSettings = []
    let spdEnableSettingKeys = ['tony_spd2_KC_enable', 'tony_spd1p5_KC_enable', 'tony_spd1p25_KC_enable', 'tony_spd1_KC_enable', 'tony_spd0p75_KC_enable', 'tony_spd0p5_KC_enable', 'tony_spdcus_KC_enable']
    let spdEnableSettingDefaultVals = [true, true, false, false, false, false, true]
    for(let i =0;i<spdKCSettingKeys.length;i++) {
        spdKCSettings.push(GM_getValue(spdKCSettingKeys[i], spdKCSettingDefaultVals[i]))
    }
    for(let i =0;i<spdKNameKeys.length;i++) {
        spdKNames.push(GM_getValue(spdKNameKeys[i], spdKNameDefaultVals[i]))
    }
    for(let i= 0;i<spdEnableSettingKeys.length;i++) {
        spdEnableSettings.push(GM_getValue(spdEnableSettingKeys[i], spdEnableSettingDefaultVals[i]))
    }
    let cusSpd = GM_getValue('tony_spd_cus', 3)
    let speedList = [2, 1.5, 1.25, 1, 0.75, 0.5]
    speedList.push(cusSpd)
    let spd = GM_getValue('tony_spd', 1)
    let bvdos = getVdos()
    if(bvdos.length>0) defaultSpd = bvdos[0].playbackRate
    function getVdos() {
        let vdos = document.getElementsByTagName('bwp-video')
        if(vdos.length === 0) {
            vdos = document.getElementsByTagName('video')
        }
        return vdos
    }
    function getBeisuList() {
        let beisuList = document.getElementsByClassName("bilibili-player-video-btn-speed-menu-list")
        if(beisuList.length==0) {
            beisuList = document.querySelectorAll(".squirtle-speed-select-list>.squirtle-select-item ")
        }
        if(beisuList.length==0) {
            beisuList = document.querySelectorAll(".edu-player-speed-list>.edu-player-speed-item")
        }
        if(beisuList.length==0) {
            beisuList = document.querySelectorAll(".bpx-player-ctrl-playbackrate-menu>.bpx-player-ctrl-playbackrate-menu-item")
        }
        return beisuList
    }
    function changeSpeed(beisuList, spd) {
        switch(spd) {
            case 2:
                beisuList[0].click()
                break
            case 1.5:
                beisuList[1].click()
                break
            case 1.25:
                beisuList[2].click()
                break
            case 1:
                beisuList[3].click()
                break
            case 0.75:
                beisuList[4].click()
                break
            case 0.5:
                beisuList[5].click()
                break
            case cusSpd:
                beisuList[6].click()
                break
            default:
                break
        }
    }
    function setPlaybackRate1(beisuList, vdo1) {
        let intervalCount = 0
        let myInterval
        myInterval = setInterval(() => {
            intervalCount++
            if(intervalCount>40 || vdo1.playbackRate === 1) {
                // 有时候直接点击当前倍速按钮并没有效果,通过先点击1倍速按钮,再点击其他倍速按钮来实现。
                let temSpd = spd
                changeSpeed(beisuList, 1)
                changeSpeed(beisuList, temSpd)
                intervalCount = 0
                clearInterval(myInterval)
            }
        },100)
    }
    function initObserver() {
        let vdos = getVdos()
        let config = {attributes: true, attributeFilter:['src']}
//         let listWrapper = document.getElementsByClassName('list-wrapper')[0]
//         let vdoTitle = document.getElementsByClassName('video-title')[0]
//         let config1 = {attributes: true, attributeFilter:['class'], subtree: true}
//         let config2 = {childList: true}
        function callback(mutationsList, observer) {
            clearTimeout(callbackTimer)
            callbackTimer = setTimeout(function() {
                let vdo1s = getVdos()
                if(vdo1s.length>0) {
                    let vdo1 = vdo1s[0]
                    let beisuList = getBeisuList()
                    if(beisuList.length>0) {
                        function vdoPlayHandler() {
                            changeSpeed(beisuList, spd)
                            vdo1.removeEventListener('play',vdoPlayHandler)
                        }
                        vdo1.addEventListener('play', vdoPlayHandler)
                    }
                }
            },100)
        }
        if(vdos.length>0) {
            const observer = new MutationObserver(callback)
            observer.observe(vdos[0], config)
            hasObserve = true
        }
//         if(listWrapper) {
//             const observer1 = new MutationObserver(callback)
//             observer1.observe(listWrapper, config1)
//             hasObserve = true
//         } else if(vdoTitle) {
//             const observer2 = new MutationObserver(callback)
//             observer2.observe(vdoTitle, config2)
//             hasObserve = true
//         }
        count++
        if(count<=20 && !hasObserve) setTimeout(initObserver, 1000)
    }
    //initObserver()

    // 全局记忆
    if(spdMemoryMode==='2') defaultSpd = spd
    else {
        spd = defaultSpd
        GM_setValue('tony_spd',defaultSpd)
    }
    let cusBeisuMenu
    let initSpdCnt = 0
    let hasAddVdoListener = false
    let hasAddMenuListener = false
    let oldSrc = ''
    let vdoPlayTimer
    function initSpeedAndListener() {
        let beisuList = getBeisuList()
        initSpdCnt++
        let vdos
        vdos = getVdos()
        if(spdMemoryMode === '1' || spdMemoryMode === '2' || spdMemoryMode ==='3') {
            // 尝试持续监听视频play来判断切换
            if(vdos.length>0 && !hasAddVdoListener) {
                vdos[0].addEventListener('play', function() {
                    clearTimeout(vdoPlayTimer)
                    vdoPlayTimer = setTimeout(function() {
                        //视频开始播放
                        if(oldSrc !== vdos[0].src) {
                            let bsList = getBeisuList()
                            if(bsList.length>0) {
                                // 不知什么原因,部分场景下设置为其他倍速,比如2倍速,切换视频后显示依然是2倍速,但是视频确实1倍速,通过再次点击2倍速来纠正
                                // 每次初始倍速为1
                                if(spdMemoryMode === '3') spd = 1
                                // 默认 当前页面记忆倍速(页面刷新丢失记忆) 或 全局记忆
                                changeSpeed(bsList, spd)
                                setPlaybackRate1(bsList, vdos[0])
                            }
                            oldSrc = vdos[0].src
                        }
                    },100)
                })
                vdos[0].addEventListener('canplay', function() {
                    //if(beisuList.length>0)
                })
                hasAddVdoListener = true
            }
        } else if(vdos.length>0 && !hasAddVdoListener) {
            hasAddVdoListener = true
        }
        if(beisuList.length>0 && !hasAddMenuListener) {
            cusBeisuMenu = beisuList[0].cloneNode(true)
            let settingMenu = document.createElement('li')
            settingMenu.setAttribute('style', 'text-align: -webkit-match-parent;position: relative;height: 36px;line-height: 36px;cursor: pointer;margin:0;padding:0;')
            settingMenu.innerText = '设置'
            settingMenu.addEventListener('click',showSetting)
            cusBeisuMenu.setAttribute('data-value', cusSpd)
            cusBeisuMenu.innerText = cusSpd%1>0?(cusSpd+'x'):(cusSpd+'.0x')
            beisuList[0].parentNode.appendChild(cusBeisuMenu)
            beisuList[0].parentNode.insertBefore(settingMenu, beisuList[0])
            beisuList = getBeisuList()
            function getMenuClickHandler(i) {
                return function() {
                    spd = speedList[i]
                    //console.log('spd', spd)
                    GM_setValue('tony_spd',spd)
                }
            }
            for(let i = 0;i<beisuList.length;i++) {
                beisuList[i].addEventListener('click', getMenuClickHandler(i))
            }
            hasAddMenuListener = true
            changeSpeed(beisuList, spd)
        }
        if(initSpdCnt<=40 && (!hasAddMenuListener || !hasAddVdoListener)) {
            setTimeout(initSpeedAndListener,500)
        }
        if(hasAddMenuListener && hasAddVdoListener) {
            setPlaybackRate1(beisuList, vdos[0])
        }
    }
    initSpeedAndListener()

    // 节流标志
    let flag = false
    document.addEventListener('keydown', function(e){
        if(flag) return
        flag = true
        setTimeout(() => {
            flag = false
        },100)
        let beisuList = getBeisuList()
        for(let i=0;i<spdKCSettings.length;i++) {
            if(e.keyCode == spdKCSettings[i] && beisuList.length!==0) {
                if(spdEnableSettings[i]) {
                    if(spd === speedList[i]) {
                        beisuList[3].click()
                    } else {
                        beisuList[i].click()
                    }
                }
                break
            }
        }
    });
    let hasSettingShow = false
    function showSetting() {
        if(hasSettingShow) return
        let settingBox = document.createElement("div");
        settingBox.setAttribute("style", `position: fixed !important;
        top: 10px !important;
        left: 50% !important;
        z-index:2147483647 !important;
        `)
        let contentBox = document.createElement('div')
        contentBox.setAttribute("style", `box-shadow: 0 0 10px rgba(100, 100, 100, 0.2) !important;
        max-height: calc(100vh - 60px) !important;
        max-width: 80vw !important;
        overflow: auto !important;
        background-color: rgb(235, 235, 235) !important;
        text-align: center !important;
        font-size: 13px !important;
        border-radius: 16px !important;
        white-space: nowrap;
        padding: 10px 16px 10px 16px !important;
        margin-left: -50% !important;
        margin-right: 50% !important;
        z-index:2147483647 !important;
        box-sizing: content-box !important;
        border: 2px solid rgb(100 100 100 / 10%) !important;
        `)
        if('backdropFilter' in document.documentElement.style) {
            contentBox.style.backgroundColor = 'rgba(235, 235, 235, 0.8)'
            contentBox.style.backdropFilter = 'saturate(50%) blur(14px)'
            //contentBox.style.transform = 'translateZ(0)'
        }
        if(getComputedStyle) {
            let fontFml = getComputedStyle(document.body, null)['font-family']
            if(fontFml) contentBox.style.fontFamily = fontFml
        }
//         let logoDiv = document.createElement('div')
//         logoDiv.setAttribute("style", 'margin-bottom: 6px !important;')
//         contentBox.appendChild(logoDiv)
        let settingContent = document.createElement('div')
        settingContent.setAttribute('style', 'font-weight: 600 !important;')

        let MemorySettingTitle = document.createElement('div')
        MemorySettingTitle.setAttribute('style', 'margin-top:10px;')
        MemorySettingTitle.innerText = '倍速记忆模式'
        settingContent.appendChild(MemorySettingTitle)

        let spdMemoryModeSelector = document.createElement('select')
        spdMemoryModeSelector.setAttribute('style', 'margin-top:10px;padding:3px 10px;border:2px solid rgb(168,168,168);border-radius:10px;')
        let spdMemoryModeOption1 = document.createElement('option')
        spdMemoryModeOption1.value = '1'
        spdMemoryModeOption1.innerText = '仅当前页面记忆倍速'
        spdMemoryModeOption1.selected = spdMemoryMode==='1'
        let spdMemoryModeOption2 = document.createElement('option')
        spdMemoryModeOption2.value = '2'
        spdMemoryModeOption2.innerText = '全局记忆倍速'
        spdMemoryModeOption2.selected = spdMemoryMode==='2'
        let spdMemoryModeOption3 = document.createElement('option')
        spdMemoryModeOption3.value = '3'
        spdMemoryModeOption3.innerText = '每次初始倍速为1(不记忆)'
        spdMemoryModeOption3.selected = spdMemoryMode==='3'
        let spdMemoryModeOption4 = document.createElement('option')
        spdMemoryModeOption4.value = '4'
        spdMemoryModeOption4.innerText = '什么都不做'
        spdMemoryModeOption4.selected = spdMemoryMode==='4'
        spdMemoryModeSelector.appendChild(spdMemoryModeOption1)
        spdMemoryModeSelector.appendChild(spdMemoryModeOption2)
        spdMemoryModeSelector.appendChild(spdMemoryModeOption3)
        spdMemoryModeSelector.appendChild(spdMemoryModeOption4)
        spdMemoryModeSelector.addEventListener('change', function() {
            spdMemoryMode = spdMemoryModeSelector.value
            GM_setValue('tony_spd_memory_mode', spdMemoryMode)
        })
        settingContent.appendChild(spdMemoryModeSelector)

        let cusSpdTitle = document.createElement('div')
        cusSpdTitle.setAttribute('style', 'margin-top:10px;')
        cusSpdTitle.innerText = '自定义倍速键设置(0~4)'
        settingContent.appendChild(cusSpdTitle)

        let cusSpdSettingBox = document.createElement('div')
        cusSpdSettingBox.setAttribute('style', 'margin-top:10px;')
        let cusSpdSettingBtnBox = document.createElement('div')
        cusSpdSettingBtnBox.setAttribute('style', 'display:none;margin-top:8px;')
        let cusSpdSettingBtnOK = document.createElement('button')
        let cusSpdSettingBtnCancel = document.createElement('button')
        let cusSpdInput = document.createElement('input')
        cusSpdInput.setAttribute('type', 'number')
        cusSpdInput.setAttribute('style', 'max-width:100px;padding:5px 10px;border:2px solid rgb(168,168,168);border-radius:10px;')
        cusSpdInput.value = cusSpd
        let oldCusSpd
        cusSpdInput.addEventListener('focus', function() {
            oldCusSpd = cusSpd
            cusSpdSettingBtnBox.style.display = 'block'
        })

        cusSpdSettingBtnOK.innerText = '确认'
        cusSpdSettingBtnOK.setAttribute('style', 'padding:8px 10px;border:0;color:white;background-color:rgb(25,207,20);border-radius:28px;')
        cusSpdSettingBtnOK.addEventListener('click', function() {
            let temCusSpd = parseFloat(cusSpdInput.value)
            if(!temCusSpd || temCusSpd<=0 || temCusSpd>4) {
                cusSpdInput.value = cusSpd
                cusSpdSettingBtnBox.style.display = 'none'
                return
            }
            cusSpd = temCusSpd
            GM_setValue('tony_spd_cus', cusSpd)
            speedList[speedList.length-1] = cusSpd
            if(cusBeisuMenu) {
                cusBeisuMenu.setAttribute('data-value', cusSpd)
                cusBeisuMenu.innerText = cusSpd%1>0?(cusSpd+'x'):(cusSpd+'.0x')
            }
            speedSettingBtns[speedSettingBtns.length-1].innerText = cusSpd
            if(speedSettingBtns[speedSettingBtns.length-1].style.backgroundColor === 'rgb(50, 130, 236)') speedSettingBtns[speedSettingBtns.length-1].click()
            cusSpdSettingBtnBox.style.display = 'none'
        })

        cusSpdSettingBtnCancel.innerText = '取消'
        cusSpdSettingBtnCancel.setAttribute('style', 'margin-right:6px;padding:8px 10px;border:0;color:white;background-color:rgb(243,97,128);border-radius:28px;')
        cusSpdSettingBtnCancel.addEventListener('click', function() {
            cusSpdInput.value = cusSpd
            cusSpdSettingBtnBox.style.display = 'none'
        })
        cusSpdSettingBox.appendChild(cusSpdInput)
        cusSpdSettingBtnBox.appendChild(cusSpdSettingBtnCancel)
        cusSpdSettingBtnBox.appendChild(cusSpdSettingBtnOK)
        cusSpdSettingBox.appendChild(cusSpdSettingBtnBox)
        settingContent.appendChild(cusSpdSettingBox)

        let KCSettingTitle = document.createElement('div')
        KCSettingTitle.setAttribute('style', 'margin-top:10px;')
        KCSettingTitle.innerText = '倍速快捷键设置'
        settingContent.appendChild(KCSettingTitle)

        let KCBox = document.createElement('div')
        KCBox.setAttribute('style', 'margin-top:10px;')

        let settingBtnBox = document.createElement('div')
        settingBtnBox.setAttribute('style', 'margin-top:10px;')
        let speedSettingBtns = []
        for(let i = 0; i < speedList.length; i++) {
            let speedSettingBtn = document.createElement('button')
            speedSettingBtns.push(speedSettingBtn)
            speedSettingBtn.setAttribute('style', 'margin:0 3px;padding:8px 10px;min-width:38px;border:0;color:white;background-color:rgb(100,100,100);border-radius:28px;')
            speedSettingBtn.innerText = speedList[i]
            speedSettingBtn.addEventListener('click', function() {
                for(let j = 0; j<speedList.length;j++) {
                    if(j===i) speedSettingBtns[j].style.backgroundColor = 'rgb(50,130,236)'
                    else speedSettingBtns[j].style.backgroundColor = 'rgb(100,100,100)'
                }

                let KCSwitch = document.createElement('input')
                KCSwitch.setAttribute('style', 'vertical-align: middle;')
                let switchTip = document.createElement('span')
                switchTip.setAttribute('style', 'vertical-align: middle;')
                KCSwitch.setAttribute('type', 'checkbox')
                KCSwitch.checked = spdEnableSettings[i]
                switchTip.innerText = speedList[i]+'倍速快捷键 '+(spdEnableSettings[i]?'启用':'关闭')
                KCSwitch.addEventListener('change', function() {
                    spdEnableSettings[i] = KCSwitch.checked
                    switchTip.innerText = speedList[i]+'倍速快捷键 '+(spdEnableSettings[i]?'启用':'关闭')
                    GM_setValue(spdEnableSettingKeys[i], KCSwitch.checked)
                })

                let KCSettingBox = document.createElement('div')
                KCSettingBox.setAttribute('style', 'margin-top:10px;')

                let KNameTitle = document.createElement('span')
                KNameTitle.innerText = speedList[i]+'倍速快捷键(点击修改→):'
                KNameTitle.setAttribute('style', 'margin-right:6px;')
                let KCSettingBtnBox = document.createElement('div')
                KCSettingBtnBox.setAttribute('style', 'display:none;margin-top:8px;')
                let KCSettingBtnOK = document.createElement('button')
                let KCSettingBtnCancel = document.createElement('button')
                let KName = document.createElement('button')
                KName.innerText = spdKNames[i]
                KName.setAttribute('style', 'padding:8px 16px;border-radius:28px;color:rgb(5,107,0);background-color:rgb(240,240,240);border:1px solid rgb(100,100,100);')
                let clickSpdKC = spdKCSettings[i]
                let clickSpdKName = spdKNames[i]
                function keyupHandler(e) {
                    e.stopPropagation()
                    clickSpdKC = e.keyCode
                    clickSpdKName = e.key
                    KName.innerText = clickSpdKName
                }
                function kNameClickHandler() {
                    clickSpdKC = spdKCSettings[i]
                    clickSpdKName = spdKNames[i]
                    KName.innerText = '请按键ヾ(•ω•`)o'
                    KName.addEventListener('keydown', keyupHandler)
                    KName.removeEventListener('click', kNameClickHandler)
                    KCSettingBtnBox.style.display = 'block'
                    KName.focus()
                }
                KName.addEventListener('click', kNameClickHandler)

                KCSettingBtnOK.innerText = '确认'
                KCSettingBtnOK.setAttribute('style', 'padding:8px 10px;border:0;color:white;background-color:rgb(25,207,20);border-radius:28px;')
                KCSettingBtnOK.addEventListener('click', function() {
                    spdKCSettings[i] = clickSpdKC
                    spdKNames[i] = clickSpdKName
                    GM_setValue(spdKCSettingKeys[i], clickSpdKC)
                    GM_setValue(spdKNameKeys[i], clickSpdKName)
                    KName.innerText = spdKNames[i]
                    KName.removeEventListener('keydown', keyupHandler)
                    KName.addEventListener('click', kNameClickHandler)
                    KCSettingBtnBox.style.display = 'none'
                })

                KCSettingBtnCancel.innerText = '取消'
                KCSettingBtnCancel.setAttribute('style', 'margin-right:6px;padding:8px 10px;border:0;color:white;background-color:rgb(243,97,128);border-radius:28px;')
                KCSettingBtnCancel.addEventListener('click', function() {
                    KName.innerText = spdKNames[i]
//                     let clickSpdKC = spdKCSettings[i]
//                     let clickSpdKName = spdKNames[i]
                    KName.removeEventListener('keydown', keyupHandler)
                    KName.addEventListener('click', kNameClickHandler)
                    KCSettingBtnBox.style.display = 'none'
                })
                KCSettingBox.appendChild(KNameTitle)
                KCSettingBox.appendChild(KName)
                KCSettingBtnBox.appendChild(KCSettingBtnCancel)
                KCSettingBtnBox.appendChild(KCSettingBtnOK)
                KCSettingBox.appendChild(KCSettingBtnBox)

                KCBox.innerHTML = ''
                KCBox.appendChild(switchTip)
                KCBox.appendChild(KCSwitch)
                KCBox.appendChild(KCSettingBox)

            })
            settingBtnBox.appendChild(speedSettingBtn)
        }
        settingContent.appendChild(settingBtnBox)

        settingContent.appendChild(KCBox)

        let hideBtnBox = document.createElement('div')
        hideBtnBox.setAttribute('style', 'margin-top:10px;')
        let hideBtn = document.createElement('button')
        hideBtn.innerText = '关闭面板'
        hideBtn.setAttribute('style', 'padding:8px 10px;border:0;color:white;background-color:rgb(50,130,236);border-radius:28px;')
        hideBtn.addEventListener('click', function() {
            document.documentElement.removeChild(settingBox)
            hasSettingShow = false
        })
        hideBtnBox.appendChild(hideBtn)
        settingContent.appendChild(hideBtnBox)

        let settingTip = document.createElement('div')
        settingTip.setAttribute('style', 'margin-top:10px;')
        settingTip.innerText = '设置完成后刷新页面,以确保生效'
        settingContent.appendChild(settingTip)

        contentBox.appendChild(settingContent)
        settingBox.appendChild(contentBox)
        document.documentElement.appendChild(settingBox)
        hasSettingShow = true
        speedSettingBtns[0].click()
    }
    GM_registerMenuCommand('设置',showSetting)
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址