Greasy Fork

Greasy Fork is available in English.

bilibili弹幕隐藏快捷键(临时隐藏)

bilibili弹幕隐藏快捷键(临时隐藏,默认为 N 键,不是网页自带开关机制,网页自带开关快捷键为 D 键)

目前为 2023-02-19 提交的版本。查看 最新版本

// ==UserScript==
// @name         bilibili弹幕隐藏快捷键(临时隐藏)
// @namespace    tonyu_balabala_03e6ea
// @version      1.0
// @description  bilibili弹幕隐藏快捷键(临时隐藏,默认为 N 键,不是网页自带开关机制,网页自带开关快捷键为 D 键)
// @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 danMuSwitchKC = GM_getValue('tony_danmu_switch_keycode', 78)
    let danMuSwitchKName = GM_getValue('tony_danmu_switch_keyname', 'n')
    let danMuSwitchMode = GM_getValue('tony_danmu_switch_mode', '1')
    function mySwitch(danMu) {
        if(danMu) {
            if(danMu.style.visibility == "") danMu.style.visibility="hidden"
            else danMu.style.visibility=""
        }
    }
    function keydownHandler(e) {
        switchHandler(e)
        document.removeEventListener('keydown', keydownHandler);
    }
    function switchHandler(e) {
        if(e.keyCode == danMuSwitchKC) {
            let danMu1 = document.getElementsByClassName("bilibili-player-video-danmaku")[0]
            let danMu2 = document.getElementsByClassName("bilibili-player-video-adv-danmaku")[0]
            let danMu3 = document.getElementsByClassName("bilibili-player-video-bas-danmaku")[0]
            let danMu4 = document.getElementsByClassName("bpx-player-row-dm-wrap")[0]
            mySwitch(danMu1)
            mySwitch(danMu2)
            mySwitch(danMu3)
            mySwitch(danMu4)
        }
    }
    document.addEventListener('keydown', keydownHandler);
    document.addEventListener('keyup', function(e) {
        if(danMuSwitchMode === '1') switchHandler(e)
        document.addEventListener('keydown', keydownHandler);
    });

    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 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 danMuSwitchModeSelector = document.createElement('select')
        danMuSwitchModeSelector.setAttribute('style', 'margin-top:10px;padding:3px 10px;border:2px solid rgb(168,168,168);border-radius:10px;')
        let danMuSwitchModeOption1 = document.createElement('option')
        danMuSwitchModeOption1.value = '1'
        danMuSwitchModeOption1.innerText = '长按模式'
        danMuSwitchModeOption1.selected = danMuSwitchMode==='1'
        let danMuSwitchModeOption2 = document.createElement('option')
        danMuSwitchModeOption2.value = '2'
        danMuSwitchModeOption2.innerText = '敲击模式'
        danMuSwitchModeOption2.selected = danMuSwitchMode==='2'
        danMuSwitchModeSelector.appendChild(danMuSwitchModeOption1)
        danMuSwitchModeSelector.appendChild(danMuSwitchModeOption2)
        danMuSwitchModeSelector.addEventListener('change', function() {
            danMuSwitchMode = danMuSwitchModeSelector.value
            GM_setValue('tony_danmu_switch_mode', danMuSwitchMode)
        })
        settingContent.appendChild(danMuSwitchModeSelector)

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

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

        let KNameTitle = document.createElement('span')
        KNameTitle.innerText = '弹幕隐藏快捷键(点击修改→):'
        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 = danMuSwitchKName
        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 = danMuSwitchKC
        let clickSpdKName = danMuSwitchKName
        function keyupHandler(e) {
            e.stopPropagation()
            clickSpdKC = e.keyCode
            clickSpdKName = e.key
            KName.innerText = clickSpdKName
        }
        function kNameClickHandler() {
            clickSpdKC = danMuSwitchKC
            clickSpdKName = danMuSwitchKName
            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() {
            danMuSwitchKC = clickSpdKC
            danMuSwitchKName = clickSpdKName
            GM_setValue('tony_danmu_switch_keycode', clickSpdKC)
            GM_setValue('tony_danmu_switch_keyname', clickSpdKName)
            KName.innerText = danMuSwitchKName
            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 = danMuSwitchKName
            //                     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)

        settingContent.appendChild(KCSettingBox)

        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
    }
    GM_registerMenuCommand('设置',showSetting)

})();