b站笔记

此脚本是用于b站看视频同时在视频全屏页面记录笔记,同时增加了一些便利的功能

目前为 2024-08-10 提交的版本。查看 最新版本

// ==UserScript==
// @name         b站笔记
// @namespace    http://tampermonkey.net/
// @version      1.2.1
// @description  此脚本是用于b站看视频同时在视频全屏页面记录笔记,同时增加了一些便利的功能
// @author       繁星1678
// @match        https://www.bilibili.com/video/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        GM_addStyle
// @license      MIT
// @require      https://cdn.jsdelivr.net/npm/sweetalert2@11
// ==/UserScript==
(function () {
    'use strict';
    let IsFull = false;
    let IsJbjClick = false;
    let bar;
    let selection;
    let range;
    let tm_qd;
    let IsInsert = false;
    let IsMyNote = false;
    let IsNotePcHightChange = false;
    let isClose = true;
    let isTmAddLisner = false;//是否设置了插入时间标签点击监听事件

    function isFirefox() {
        return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
    }

    function moveButtonWhenDetected() {
        const jbj_btn = document.querySelector('#arc_toolbar_report > div.video-toolbar-right > div.video-note.video-toolbar-right-item.toolbar-right-note > div.video-note-inner');
        const qxd_btn = document.querySelector('#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-control-wrap > div.bpx-player-control-entity > div.bpx-player-control-bottom > div.bpx-player-control-bottom-right > div.bpx-player-ctrl-btn.bpx-player-ctrl-quality');
        const full_btn = document.querySelector("#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-control-wrap > div.bpx-player-control-entity > div.bpx-player-control-bottom > div.bpx-player-control-bottom-right > div.bpx-player-ctrl-btn.bpx-player-ctrl-full")
        const wyqp_btn = document.querySelector("div.bpx-player-ctrl-btn.bpx-player-ctrl-web")
        if (jbj_btn && qxd_btn && full_btn && wyqp_btn) {
            qxd_btn.parentNode.insertBefore(jbj_btn, qxd_btn);

            // 重新设置样式,确保移动后的按钮也有正确的样式
            const newJbjBtn = document.querySelector('#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-control-wrap > div.bpx-player-control-entity > div.bpx-player-control-bottom > div.bpx-player-control-bottom-right > div.video-note-inner');
            if (newJbjBtn) {

                // 直接修改style属性来应用样式
                newJbjBtn.style.marginRight = '25px';
                newJbjBtn.style.cursor = 'pointer';
                // 注意:颜色需要确保与CSS中定义的一致,这里直接应用白色
                newJbjBtn.style.color = 'white';

                newJbjBtn.addEventListener("click", (e) => {
                    setTimeout(() => {
                        jbjBtnOnclickEvent()
                    }, 0);
                    // 这里应该是具体的点击事件处理逻辑
                    // jbjBtnOnclickEvent()

                });
            }
            observer.disconnect();

            full_btn.addEventListener("click", function () {
                // setTimeout(() => {
                //     full_btn_event()
                // }, 0);
                full_btn_event()
            })
            wyqp_btn.addEventListener("click", function () {
                // setTimeout(() => {
                //     wyqpBtnEvent()
                // }, 0);
                wyqpBtnEvent()
            })

        }
    }
    // 创建MutationObserver实例
    const observer = new MutationObserver(moveButtonWhenDetected);

    // 配置观察选项:子节点变化
    const config = { childList: true, subtree: true };

    // 开始观察body(或其它合适的容器)
    observer.observe(document.body, config);

    // 确保DOMContentLoaded后也尝试执行一次,以防元素一开始就存在
    window.addEventListener('DOMContentLoaded', moveButtonWhenDetected);


    // 删除时间戳与图片之间的空格br元素
    function deleteBr() {
        ////////////////////////////////////////////
        // 获取所有匹配 .ql-image-preview 类的元素
        let images = document.querySelectorAll(".ql-image-preview");

        // 初始化变量以存储最大数字和对应的元素
        let maxNumber = -1;
        let maxImageElement = null;

        // 遍历每个元素
        images.forEach(image => {
            // 获取 data-id 属性的值
            const dataId = image.getAttribute('data-id');
            // 提取数字部分
            const number = parseInt(dataId.match(/\d+/)[0], 10);

            // 比较数字,更新最大数字和对应的元素
            if (number > maxNumber) {
                maxNumber = number;
                maxImageElement = image;
            }
        });


        let currentImage = maxImageElement.previousElementSibling;
        // let currentImage = lastImage.previousElementSibling;
        if (currentImage && currentImage.tagName === 'P') {
            currentImage.parentNode.removeChild(currentImage)
        } else {
            console.log('没有找到匹配的元素');
        }

    }



    // 插入截屏的同时也插入时间标记

    function Screenshot() {
        if (isTmAddLisner) return;
        // 插入截屏按钮
        let tp = document.querySelector("span.ql-capture-btn.ql-bar");
        // 插入时间标记按钮
        let tm = document.querySelector("span.ql-tag-btn.ql-bar-btn");
        let note_editor = document.querySelector("div.note-editor")


        if (tp && tm) {
            tp.addEventListener("click", (e) => {
                creatNoteImageClikEvent();
                tm.click()
                setTimeout(() => {
                    deleteBr()
                }, 900)
            });

            let observerActive = false;


            tm.addEventListener("click", () => {
                if (observerActive) return;

                if (IsInsert) return;
                const insert = () => {
                    let tm_qd = document.querySelector("div.dialog-btn.tag-dialog__btn--confirm");
                    if (tm_qd) {
                        tm_qd.click();
                        observer.disconnect();
                        observerActive = false;
                    }
                };

                const observer = new MutationObserver(insert);
                const config = { childList: true, subtree: true };
                observer.observe(note_editor, config);
                observerActive = true;


            });
        } else {
            console.error("无法找到截屏按钮或时间标记按钮");
        }

    }

    ///////////////////////////


    ///////////////////////////





    function full_btn_event() {
        // let bfy = document.querySelector('#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-video-perch');
        // let bfyHeight = bfy.getBoundingClientRect().height;
        let note_pc = document.querySelector("div.resizable-component.note-pc")
        let bfy = document.querySelector('#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-video-perch');

        let bfyHeight = bfy.getBoundingClientRect().height;
        // let wh = window.innerHeight;

        if (note_pc && bfyHeight != 1080 && IsJbjClick) {
            setNotePanel()

        } else if (note_pc && bfyHeight == 1080 && IsJbjClick) {
            let infoflow = document.querySelector("#__infoflow_commercial")
            let biliMainHeader = document.querySelector("#biliMainHeader")
            if (infoflow) {
                infoflow.parentNode.insertBefore(note_pc, infoflow)
            } else if (biliMainHeader) {
                biliMainHeader.parentNode.insertBefore(note_pc, biliMainHeader)
            } else {
                console.log("没有找到infoflow和biliMainHeader节点")
            }

        }

    }


    function wyqpBtnEvent() {
        let bfy = document.querySelector('#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-video-perch');
        let wh = window.innerHeight;
        let bfyHeight = bfy.getBoundingClientRect().height;

        let note_pc = document.querySelector("div.resizable-component.note-pc")

        if (bfyHeight == wh && IsJbjClick) {
            setNotePanel()
        } else {
            if (note_pc && IsJbjClick) {
                let infoflow = document.querySelector("#__infoflow_commercial")
                let biliMainHeader = document.querySelector("#biliMainHeader")

                if (infoflow) {
                    infoflow.parentNode.insertBefore(note_pc, infoflow)
                } else if (biliMainHeader) {
                    biliMainHeader.parentNode.insertBefore(note_pc, biliMainHeader)
                } else {
                    console.log("没有找到infoflow和biliMainHeader节点")
                }

            }


        }
    }
    ////////////////////////////////////////////


    function MyNoteBtnClick() {
        const userNames = document.querySelectorAll('.user-name');

        // 统计这些元素的数量
        const count = userNames.length;

        // 输出结果
        console.log(`user-name 的个数是: ${count}`);

        for (let i = 0; i < count; i++) {
            let note_card_container = document.querySelector(`div.note-card-container > div:nth-child(${i + 1})`);
            if (note_card_container) {

                note_card_container.addEventListener('click', function () {
                    // IsMyNote = false;
                    // creatNoteImageClikEvent()
                    let MyNoteBtn = document.querySelector("div.note-operation.detail");
                    if (MyNoteBtn) {
                        MyNoteBtn.addEventListener('click', handleMyNoteBtnClick);
                    } else {
                        console.log('没有找到MyNoteBtn');
                    }
                });
            }
        }

    }

    function OnNoteListWheel() {
        let NoteList = document.querySelector("div.note-content > div")
        if (NoteList) {
            NoteList.addEventListener('wheel', e => {
                let MyNoteBtn = document.querySelector("div.note-operation");
                if (MyNoteBtn) {
                    MyNoteBtn.addEventListener('click', handleMyNoteBtnClick);
                } else {
                    console.log('没有找到MyNoteBtn');
                }
            });
        } else {
            console.log('没有找到NoteList');
        }

    }
    function handleMyNoteBtnClick() {


        setTimeout(() => {
            refreshBtn();

            back_note_btn_event();
        }, 0);

    }



    function close_btn_event() {
        let close_btn = document.querySelector("div.close-note")
        if (!close_btn) return;

        close_btn.addEventListener("click", (e) => {
            isClose = true
            IsJbjClick = false
            isTmAddLisner = false

        })
    }



    // 查看笔记按钮事件
    function ckbj_btn_event() {
        let thumb = document.querySelector("div.ZDscrollbar.custom-scrollbar > div > div")
        if (thumb) { thumb.style.top = "0" }
        range = ""
        let ckbj_btn = document.querySelector('div.list-note-operation');
        if (ckbj_btn) {

            ckbj_btn.addEventListener('click', function () {

                IsMyNote = true
                let ql_editor = document.querySelector(".ql-editor")
                if (ql_editor) {
                    ql_editor.style.overflowY = "auto"
                    ql_editor.style.overflowX = "hidden"
                } else {
                    console.log("没有找到ql_editor,无法修改滚动条样式")
                }
                let note_editor = document.querySelector("div.note-editor")
                note_editor.style.height = "96%"
                creatNoteImageClikEvent()//点击笔记中图片触发事件

                Screenshot()
                isTmAddLisner = true


                InsertBtnEvent()
                // let NotePanel = document.querySelector("body > div.resizable-component.note-pc")

                // if (NotePanel) {
                //     NotePanel.style.width = '450px'
                // }

                refreshScrollbar()
                // refreshWidthDivBox()
                // refreshOpacity()

                // refreshBtn()
                setTimeout(() => {
                    refreshBtn()


                }, 0);
                back_note_btn_event()

                editorEvent()
                setTimeout(() => {
                    InsertBtnEvent()

                }, 0);
                // refreshScrollbar()


            })
        }



    }


    // 从笔记页面后退按钮的事件
    function back_note_btn_event() {



        let back_note_btn = document.querySelector("div.back-note-list")

        if (back_note_btn) {
            back_note_btn.addEventListener("click", function () {
                // IsNotePcHightChange=false
                isTmAddLisner = false

                scrollbarDisplay("hide")
                BtnDisplay("hide")
                let note_pc = document.querySelector("div.resizable-component.note-pc")

                if (note_pc.style.opacity != 1) { note_pc.style.opacity = 1 }
                // 重置透明度值
                let opacitySlider = document.querySelector("div.sliderContainer > input")
                if (opacitySlider) { opacitySlider.value = 0 }

                let label2 = document.querySelector("div.sliderContainer > label2")
                if (label2) { label2.textContent = '0%' }

                // if (note_pc.style.width != "405px") {
                //     note_pc.style.width = "405px"
                // }
                ckbj_btn_event()


            })
        } else {
            console.log("没有找到back_note_btn")
        }


    }


    // 添加宽度控制条
    function jbjBtnOnclickEvent() {
        let thumb = document.querySelector("div.ZDscrollbar.custom-scrollbar > div > div")
        if (thumb) { thumb.style.top = "0" }

        range = ""
        isClose = false
        IsJbjClick = true
        let opacitySlider = document.querySelector("div.sliderContainer > input")
        if (opacitySlider) { opacitySlider.value = 0 }

        let label2 = document.querySelector("div.sliderContainer > label2")
        if (label2) { label2.textContent = '0%' }

        let note_list = document.querySelector("div.note-list")
        if (note_list) { note_list.style.height = '96%'; }

        let bfy = document.querySelector('#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-video-perch');

        let ql_editor = document.querySelector(".ql-editor")
        if (ql_editor) {
            ql_editor.style.overflowY = "auto"
            ql_editor.style.overflowX = "hidden"
        }
        let bfyHeight = bfy.getBoundingClientRect().height;
        let wh = window.innerHeight;
        if (bfyHeight == wh) {
            setNotePanel()

        }

        noteEvent()

        refreshBar()

        // 笔记宽度
        refreshWidthDivBox()
        console.log("1 if (jbj_btn_title == 记笔记)执行")
        // 笔记透明度
        refreshOpacity()
        close_btn_event()




        let newJbjBtn = document.querySelector('#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-control-wrap > div.bpx-player-control-entity > div.bpx-player-control-bottom > div.bpx-player-control-bottom-right > div.video-note-inner');
        let jbj_btn_title = newJbjBtn.innerText.trim()
        let note_pc = document.querySelector("div.resizable-component.note-pc");
        if (note_pc) {
            note_pc.style.minWidth = "300px"
            note_pc.addEventListener('mouseover', (e) => {
                note_pc.addEventListener('wheel', (e) => {
                    e.stopPropagation();

                })
            })
            note_pc.addEventListener('mousedown', (e) => {
                note_pc.addEventListener('wheel', (e) => {
                    e.stopPropagation();

                })
            })
            note_pc.addEventListener('mouseup', (e) => {
                note_pc.addEventListener('wheel', (e) => {
                    e.stopPropagation();

                })
            })
        } else {
            console.log("在代码416行没有找到note_pc")
        }


        if (note_pc.style.opacity != 1) { note_pc.style.opacity = 1 }
        if (jbj_btn_title === "记笔记") {
            IsMyNote = true
            let note_editor = document.querySelector("div.note-editor")
            note_editor.style.height = "96%"
            creatNoteImageClikEvent()

            Screenshot()
            isTmAddLisner = true


            editorEvent()
            InsertBtnEvent()
            console.log("2 if (jbj_btn_title == 记笔记)执行")
            refreshScrollbar()
            // refreshWidthDivBox()
            // refreshOpacity()
            refreshBtn()




            back_note_btn_event()


        } else {
            OnNoteListWheel()
            MyNoteBtnClick()
            scrollbarDisplay("hide")
            BtnDisplay("hide")
            // console.log("2:jbjBtnOnclickEvent()执行-按钮隐藏和滚动条隐藏已经执行")
            ckbj_btn_event()



        }


        let bar = document.querySelector("#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-video-perch > div.custom-bar-class")
        // let bfyHeight = bfy.getBoundingClientRect().height;
        if (bfyHeight >= 1080) {
            bar.style.display = "block"
        }

        refreshBtnlistener()

        // let note_editor = document.querySelector("div.note-editor")
        // note_pc.style.height += 100+"px";
        // note_pc = document.querySelector("div.resizable-component.note-pc")


    }



    //  1.笔记面板宽度控制条相关
    // 判断WidthDivBoxExist是否存在如果不存在则添加宽度控制条,存在则删除后重新添加才能不出错保持监听事件有效
    function refreshWidthDivBox() {

        let widthDivBox = document.querySelector("div.width-control-box")
        if (!widthDivBox) { setWidthDivBox() }
    }



    //  设置宽度控制条
    function setWidthDivBox() {

        let note_pc = document.querySelector("div.resizable-component.note-pc")


        // 创建一个新的div来容纳滑块和标签,并添加类名
        let widthDivBox = document.createElement('div');
        widthDivBox.className = 'width-control-box';
        widthDivBox.style.width = '405px';
        widthDivBox.style.marginLeft = '25px';
        // widthDivBox.style.height = '15px';

        widthDivBox.style.height = '1.5%';
        // widthDivBox.style.marginBottom = '1.4%';

        // 创建并设置宽度滑块左侧标签,并添加类名
        let widthLab1 = document.createElement('label');
        widthLab1.className = 'width-slider-label';
        widthLab1.textContent = '宽度';
        widthLab1.style.fontSize = '15px';
        widthLab1.style.borderRadius = "10px";
        widthLab1.style.marginRight = '2.5px';
        widthLab1.style.color = "rgb(19, 72, 87)";

        // 创建并设置宽度滑块右侧标签,并添加类名
        let widthLab2 = document.createElement('label');
        widthLab2.className = 'width-slider-value';
        widthLab2.textContent = '800px';
        widthLab2.style.borderRadius = "10px";
        widthLab2.style.color = "rgb(19, 72, 87)";
        widthLab1.style.marginRight = '2.5px';
        widthLab2.style.fontSize = '15px';
        // widthLab2.style.right = '0';

        // 创建宽度滑块,并添加类名
        let widthSlider = document.createElement('input');
        widthSlider.className = 'width-slider';
        widthSlider.type = 'range';
        widthSlider.min = '300';
        widthSlider.max = '1912';
        widthSlider.step = '1';
        widthSlider.value = note_pc.offsetWidth.toString(); // 初始值为当前宽度

        // 设置宽度滑块样式
        widthSlider.style.marginRight = '2.5px';
        widthSlider.style.height = "8px";
        widthSlider.style.width = "300px";
        widthSlider.style.outline = "none";
        widthSlider.style.backgroundColor = "#003300";
        // widthSlider.style.backgroundColor = "skyblue";
        widthSlider.style.opacity = "1";
        widthSlider.style.cursor = "pointer";

        widthLab1.addEventListener('mousedown', function (e) {
            e.preventDefault();
            e.stopPropagation();
        })
        widthLab2.addEventListener('mousedown', function (e) {
            e.preventDefault();
            e.stopPropagation();
        })

        // 添加事件监听器来响应滑块的变化
        // 笔记中有图片时,图片宽度也需要单独调节
        const img = document.getElementsByClassName('ql-image-preview');


        const observer = new MutationObserver(mutations => {
            mutations.forEach(mutation => {
                if (mutation.attributeName === 'style') {
                    const width = parseInt(note_pc.style.width.replace('px', ''), 10);
                    widthSlider.value = width;
                    widthLab2.textContent = width + 'px';
                }
            });
        });

        // 观察note_pc的style属性
        observer.observe(note_pc, { attributes: true, attributeFilter: ['style'] });

        widthSlider.addEventListener("input", function (e) {
            e.preventDefault();
            e.stopPropagation();
            let value = widthSlider.value;
            note_pc.style.width = value + 'px';
            if (img) {
                for (let i = 0; i < img.length; i++) {
                    // 为当前元素设置宽度
                    img[i].style.width = value + 'px';
                }
            }

            widthLab2.textContent = value + 'px';
        });

        // 将元素添加到DOM中
        widthDivBox.appendChild(widthLab1);
        widthDivBox.appendChild(widthSlider);
        widthDivBox.appendChild(widthLab2);

        let note_content = document.querySelector("div.note-content")

        if (note_content) {
            note_content.parentNode.insertBefore(widthDivBox, note_content);
        } else {
            console.error("note_content元素不存在")
        }


    }




    // 2.笔记内容高度控制条
    // 刷新笔记面板内容高度控制条
    function refreshScrollbar() {
        // 类名:ZDscrollbar
        if (isFirefox()) {
            console.log('这是火狐浏览器');
            return;
        } else {
            console.log('这不是火狐浏览器');
        }

        let note_pc = document.querySelector("div.resizable-component.note-pc")
        if (!note_pc) return;

        let scrollbar = document.querySelector("div.ZDscrollbar.custom-scrollbar")

        if (scrollbar && scrollbar.style.display == "none") {
            scrollbarDisplay("show")

            refreshScrollBarListener(scrollbar)

        } else if (!scrollbar) {
            setScrollbar()
        }


        function refreshScrollBarListener(s) {
            function alteration() {
                let contentHeight;
                let scrollbar = s;

                let isDragging = false;
                let dragStartPos = 0;
                // dragStartPos = 0;

                let editor = document.querySelector('.ql-editor');
                if (!editor) {
                    console.log("在633行未找到 editor 元素")
                }



                let track = document.querySelector("div.ZDscrollbar.custom-scrollbar > div")
                let thumb = document.querySelector("div.ZDscrollbar.custom-scrollbar > div > div")




                if (!IsNotePcHightChange) {
                    thumb.style.top = '0';
                }

                // thumb.style.top = '0';
                let scrollbarHeight;
                let note_pcHeight;
                track.addEventListener('mouseover', () => {
                    contentHeight = editor.scrollHeight;
                    note_pcHeight = editor.clientHeight;
                    scrollbarHeight = scrollbar.clientHeight;

                });

                editor.addEventListener('mouseover', () => {
                    contentHeight = editor.scrollHeight;
                    note_pcHeight = editor.clientHeight;
                    scrollbarHeight = scrollbar.clientHeight;
                });

                editor.addEventListener('mouseover', () => {
                    contentHeight = editor.scrollHeight;
                    note_pcHeight = editor.clientHeight;
                    scrollbarHeight = scrollbar.clientHeight;
                });


                editor.addEventListener('scroll', () => {
                    // contentHeight = editor.scrollHeight;
                    // scrollbarHeight = scrollbar.clientHeight;
                    // note_pcHeight = editor.clientHeight;
                    let scrollTop = editor.scrollTop;
                    let thumbTop = (scrollTop / (contentHeight - note_pcHeight)) * (scrollbarHeight - thumb.clientHeight);
                    thumb.style.top = `${thumbTop}px`;
                });

                // let isDragging = false;
                // let dragStartPos = 0;
                // dragStartPos = 0;

                thumb.addEventListener('mousedown', (e) => {
                    e.preventDefault();  // 取消默认操作,阻止链接跳转
                    e.stopPropagation(); // 阻止事件冒泡到其他监听器
                    isDragging = true;
                    dragStartPos = e.clientY - thumb.offsetTop;
                });

                thumb.addEventListener('mouseover', (e) => {

                    thumb.style.opacity = '1';
                });

                thumb.addEventListener('mouseout', (e) => {

                    thumb.style.opacity = '0.3';
                });

                document.addEventListener('mouseup', () => {
                    isDragging = false;
                });

                document.addEventListener('mousemove', (e) => {
                    if (!isDragging) return;
                    let newTop = Math.max(0, Math.min(scrollbarHeight - thumb.clientHeight, e.clientY - dragStartPos));
                    thumb.style.top = `${newTop}px`;
                    let scrollFraction = newTop / (scrollbarHeight - thumb.clientHeight);
                    editor.scrollTop = scrollFraction * (contentHeight - note_pcHeight);
                });

            }
            const ro = new ResizeObserver(entries => {
                IsNotePcHightChange = true
                entries.forEach(entry => {
                    alteration();
                    // console.log(`note_pc高度发生变化 ${entry.contentRect.height}`);
                });


            });
            ro.observe(note_pc);
        }



    }


    function scrollbarDisplay(displayState) {

        let scrollbar = document.querySelector("div.ZDscrollbar.custom-scrollbar")
        if (scrollbar === null) {
            console.error(" Scrollbar element not found.");
            return;
        }

        if (displayState === "hide") {

            scrollbar.style.display = "none";
        } else if (displayState === "show") {

            scrollbar.style.display = "block";
        } else {
            console.warn("Invalid display state. Expected 'hide' or 'show'.");
        }
    }
    // 设置笔记内容高度控制条
    function setScrollbar() {


        let note_pc = document.querySelector("div.resizable-component.note-pc")
        if (note_pc === null) {
            console.error("note_pc element not found.");
            return;
        }
        const scrollbar = document.createElement('div');
        scrollbar.className = 'ZDscrollbar';
        scrollbar.classList.add('custom-scrollbar');
        scrollbar.style.position = 'absolute';
        // scrollbar.style.top = note_pc.style.top;
        scrollbar.style.top = '0';
        scrollbar.style.width = '12px';
        scrollbar.style.height = '100%';
        scrollbar.style.right = '-13px';


        const track = document.createElement('div');
        track.className = 'track';
        track.style.width = '100%';
        track.style.height = '100%';
        track.style.backgroundColor = "#f0f0f0";
        track.style.borderRadius = '3px';


        const thumb = document.createElement('div');
        thumb.className = 'thumb';
        thumb.style.position = 'relative';
        thumb.style.width = '100%';
        thumb.style.backgroundColor = "#888";
        thumb.style.borderRadius = '5px';
        thumb.style.opacity = '0.3';
        thumb.style.height = '49px';


        // 鼠标移到thumb后光标变成小手:
        thumb.style.cursor = 'pointer';

        track.appendChild(thumb);
        scrollbar.appendChild(track);
        // bjk_box.parentNode.appendChild(scrollbar);
        note_pc.appendChild(scrollbar);



        alteration()

        function alteration() {
            let editor = document.querySelector('.ql-editor');
            let contentHeight;
            let scrollbarHeight;
            let note_pcHeight;
            if (!IsNotePcHightChange) {
                thumb.style.top = '0';
            }
            // thumb.style.top = '0';
            track.addEventListener('mouseover', () => {
                contentHeight = editor.scrollHeight;
                note_pcHeight = editor.clientHeight;
                scrollbarHeight = scrollbar.clientHeight;

            });

            editor.addEventListener('mouseover', () => {
                contentHeight = editor.scrollHeight;
                note_pcHeight = editor.clientHeight;
                scrollbarHeight = scrollbar.clientHeight;
            });

            editor.addEventListener('scroll', () => {
                let scrollTop = editor.scrollTop;
                let thumbTop = (scrollTop / (contentHeight - note_pcHeight)) * (scrollbarHeight - thumb.clientHeight);
                thumb.style.top = `${thumbTop}px`;
            });

            let isDragging = false;
            let dragStartPos = 0;
            isDragging = false;
            dragStartPos = 0;

            thumb.addEventListener('mousedown', (e) => {
                e.preventDefault();  // 取消默认操作,阻止链接跳转
                e.stopPropagation(); // 阻止事件冒泡到其他监听器
                isDragging = true;
                dragStartPos = e.clientY - thumb.offsetTop;
            });

            thumb.addEventListener('mouseover', (e) => {

                thumb.style.opacity = '1';
            });

            thumb.addEventListener('mouseout', (e) => {

                thumb.style.opacity = '0.3';
            });

            document.addEventListener('mouseup', () => {
                isDragging = false;
            });

            document.addEventListener('mousemove', (e) => {
                if (!isDragging) return;
                let newTop = Math.max(0, Math.min(scrollbarHeight - thumb.clientHeight, e.clientY - dragStartPos));
                thumb.style.top = `${newTop}px`;
                let scrollFraction = newTop / (scrollbarHeight - thumb.clientHeight);
                editor.scrollTop = scrollFraction * (contentHeight - note_pcHeight);
            });

        }
        const ro = new ResizeObserver(entries => {
            IsNotePcHightChange = true
            entries.forEach(entry => {
                alteration();
                // console.log(`note_pc高度发生变化 ${entry.contentRect.height}`);
            });

        });
        ro.observe(note_pc);

    }


    // 3.透明度控制条
    // 刷新笔记面板内容高度控制条
    function refreshOpacity() {

        let OpacityBox = document.querySelector("div.sliderContainer")
        if (OpacityBox) {
            return
        } else {
            setOpacity()
        }
    }

    function setOpacity() {


        let ql_snow = document.querySelector("div.editor-innter.ql-container.ql-snow")

        let opacitySliderBox = document.createElement('div');
        opacitySliderBox.className = 'sliderContainer'; // 添加类名
        opacitySliderBox.style.width = '405px';
        opacitySliderBox.style.marginLeft = '25px';
        // opacitySliderBox.style.height = '15px';
        opacitySliderBox.style.height = '3%';
        opacitySliderBox.style.marginTop = '10px';
        // opacitySliderBox.style.marginBottom = '1%';
        opacitySliderBox.style.marginBottom = '10px';
        // opacitySliderBox.style.backgroundColor = '#000000';

        let lab1 = document.createElement('label1');
        lab1.className = 'sliderLabel1'; // 添加类名
        lab1.textContent = '透明';

        lab1.style.fontSize = '15px';
        lab1.style.borderRadius = "10px";
        lab1.style.marginRight = '2.5px';
        // lab1.style.color = "#000000";
        lab1.style.color = "#020205";
        // lab1.style.background = '#663366';
        // lab1.style.fontWeight = "bold";
        // lab1.style.color = "##FFFF00";

        let lab2 = document.createElement('label2');
        lab2.className = 'sliderLabel2'; // 添加类名
        lab2.textContent = '0%';
        lab2.style.borderRadius = "10px";
        // lab2.style.color = "#000000";
        lab2.style.color = "#020205";
        // lab2.style.background = '#663366';
        lab2.style.right = '50px'; // 可能需要调整,因为right属性通常与position属性一起使用

        lab2.style.fontSize = '15px';
        lab2.style.fontWeight = "bold";

        let opacitySlider = document.createElement('input');
        opacitySlider.className = 'opacitySlider'; // 添加类名
        opacitySlider.type = 'range';
        opacitySlider.min = '0';
        // opacitySlider.max = '1';
        opacitySlider.max = '0.95';
        opacitySlider.step = '0.01';
        // opacitySlider.value = '1';
        opacitySlider.value = '0';

        // 滑块样式
        opacitySlider.style.marginRight = '2.5px';
        opacitySlider.style.height = "8px";
        opacitySlider.style.width = "300px";
        opacitySlider.style.outline = "none";
        opacitySlider.style.backgroundColor = "#000000";
        opacitySlider.style.color = "#000000";
        opacitySlider.style.opacity = "1";
        opacitySlider.style.cursor = "pointer";

        // 将元素添加到dom中
        opacitySliderBox.appendChild(lab1);
        opacitySliderBox.appendChild(opacitySlider);
        opacitySliderBox.appendChild(lab2);



        let note_pc = document.querySelector("div.resizable-component.note-pc")

        opacitySlider.addEventListener("input", function (e) {
            // 若不阻止默认操作opacitySlider.value就无法拖动到最大值
            e.preventDefault();
            e.stopPropagation();
            let value = opacitySlider.value;
            note_pc.style.opacity = 1 - value;
            // let text_value = Math.round(value * 100);
            let text_value = Math.round(value * 100);
            lab2.textContent = text_value + '%';
        });


        // 鼠标移入透明度调节滑块时,弹窗提示鼠标所x在位置透明度数值
        opacitySlider.addEventListener('mousemove', function (event) {
            // 获取滑块的宽度和鼠标的位置
            let rect = opacitySlider.getBoundingClientRect();
            let offsetX = event.clientX - rect.left;
            let sliderWidth = rect.width;

            // 计算滑块的值
            let value = (offsetX / sliderWidth) * (opacitySlider.max - opacitySlider.min) + opacitySlider.min;
            value = Math.round(value * 100); // 保留两位小数

            opacitySlider.title = '透明度调整为: ' + value + "%";
        });

        let width_control_box = document.querySelector("div.width-control-box")
        width_control_box.insertAdjacentElement('afterend', opacitySliderBox);


        // ql_snow.parentNode.insertBefore(opacitySliderBox, ql_snow);
    }


    // 4.到顶部/到底部按钮

    function refreshBtn() {
        let BtnBox = document.querySelector("div.note-header.drag-el > div.scrollButtonWrapper")


        if (BtnBox) {
            BtnDisplay('show')
            refreshBtnlistener()
            return;
        }
        else {
            setBtn()
        }

    }


    function BtnDisplay(displayState) {

        let BtnBox = document.querySelector("div.scrollButtonWrapper")


        if (!BtnBox) { return; }
        if (displayState == "hide") {
            BtnBox.style.display = "none";
        } else if (displayState == "show") {
            BtnBox.style.display = "block";

        }

    }



    function setBtn() {
        // 创建到底部按钮

        // 创建容器div
        let btnContainer = document.createElement('div');
        // btnContainer.id = 'scrollButtonContainer'; // 设置容器的ID
        btnContainer.className = 'scrollButtonWrapper'; // 添加类名
        btnContainer.style.left = "245px";
        // btnContainer.style.right = "90px";
        btnContainer.style.position = "absolute";

        // 创建到顶部按钮
        let toTopBtn = document.createElement("button");
        toTopBtn.className = 'scrollToTopBtn'; // 添加类名

        toTopBtn.innerHTML = "到顶";
        toTopBtn.style.fontSize = "14px"
        // 创建到底部按钮
        let toBottomBtn = document.createElement("button");
        toBottomBtn.className = 'scrollToBottomBtn'; // 添加类名

        toBottomBtn.innerHTML = '到底';
        toBottomBtn.style.fontSize = "14px"
        // 创建隐藏按钮
        let hideBtn = document.createElement("button");
        hideBtn.className = 'hide'; // 添加类名
        hideBtn.style.fontSize = "14px"

        hideBtn.innerHTML = '隐藏';
        hideBtn.title = '隐藏后鼠标移到视频右边框可显示笔记';


        // 共享的样式设置
        const sharedStyles = {
            marginLeft: "4.2px",
            // marginRight: "5px",
            width: "37px",
            height: "26px",
            // backgroundColor: "#6CA0DC",//蓝
            backgroundColor: "#996699",//深紫色
            color: "white",
            // color: "#333333",
            // color: "#FFA500",//橙色
            // color: "#000000", //黑色
            // color: "#FFFF00", //黄色
            // color: "#F5F5DC", //米黄色
            borderRadius: "4px",
            cursor: "pointer",
            border: "none",
            boxShadow: "0 2px 4px rgba(0, 0, 0, 0.2)",
            // left: "6px"
        };

        // 应用共享样式
        Object.assign(toTopBtn.style, sharedStyles);
        Object.assign(toBottomBtn.style, sharedStyles);
        Object.assign(hideBtn.style, sharedStyles);
        // 将按钮添加到容器中
        btnContainer.appendChild(toTopBtn);
        btnContainer.appendChild(toBottomBtn);
        btnContainer.appendChild(hideBtn);




        let note_message = document.querySelector("div.status-bar.note-message")
        // let close_note = document.querySelector("div.close-note")
        // 将容器添加到gkbj_btn的父节点中
        if (note_message) {
            // alert('找到了公开笔记按钮')
            note_message.parentNode.insertBefore(btnContainer, note_message);
            setTimeout(() => {
                setBtnEvent();
            }, 0);
            // setBtnEvent();
        } else {
            alert('没找到公开笔记按钮')
        }





        // 设置事件监听器
        function setBtnEvent() {



            let editor = document.querySelector("div.ql-editor")


            toBottomBtn.addEventListener("click", (e) => {
                editor.scrollTo(0, editor.scrollHeight);
                let thumb = document.querySelector("div.ZDscrollbar.custom-scrollbar > div > div")
                let scrollbar = document.querySelector("div.ZDscrollbar.custom-scrollbar")
                if (thumb) {
                    thumb.style.top = scrollbar.clientHeight - thumb.clientHeight + "px"
                    // refreshScrollBarListener(scrollbar)

                }
                e.stopPropagation();
            });

            toTopBtn.addEventListener("click", (e) => {
                editor.scrollTo(0, 0);
                let scrollbar = document.querySelector("div.ZDscrollbar.custom-scrollbar")

                let thumb = document.querySelector("div.ZDscrollbar.custom-scrollbar > div > div")
                if (thumb) {
                    thumb.style.top = "0px"
                    // refreshScrollBarListener(scrollbar)
                }
                e.stopPropagation();
            });

            hideBtn.addEventListener('click', (e) => {
                // let bfy = document.querySelector('#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-video-perch');
                let NotePanel = document.querySelector("div.resizable-component.note-pc")
                NotePanel.style.display = "none";


            });

            editor.addEventListener('click', (e) => {
                e.preventDefault();
                e.stopPropagation();
            });

        }

    };

    function refreshBtnlistener() {
        let editor = document.querySelector("div.ql-editor")
        let toBottomBtn = document.querySelector("button.scrollToBottomBtn")
        let toTopBtn = document.querySelector("button.scrollToTopBtn")

        toBottomBtn.addEventListener("click", (e) => {
            editor.scrollTo(0, editor.scrollHeight);
            let scrollbar = document.querySelector("div.ZDscrollbar.custom-scrollbar")
            if (scrollbar) {
                // refreshScrollBarListener(scrollbar)
            }
            editor.stopPropagation();
        });


        toTopBtn.addEventListener("click", (e) => {
            editor.scrollTo(0, 0);
            let scrollbar = document.querySelector("div.ZDscrollbar.custom-scrollbar")
            if (scrollbar) {
                // refreshScrollBarListener(scrollbar)
            }
            e.stopPropagation();
        });

        editor.addEventListener('click', (e) => {
            e.preventDefault();
            e.stopPropagation();
        });

        hideBtn.addEventListener('click', (e) => {

            let NotePanel = document.querySelector("div.resizable-component.note-pc")

            NotePanel.style.display = "none";


        });

    }



    // 5.移动笔记面板:

    // 此函数的作用是点击jbj_btn时设置,当视频全屏状态点击记笔记按钮时将笔记面板放到视频播放页里面
    function setNotePanel() {
        let bfy = document.querySelector('#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-video-perch');
        let NotePanel = document.querySelector("div.resizable-component.note-pc");

        // 类名resizable-component note-pc
        // NotePanel.style.minWidth = '455px'
        // NotePanel.style.width = "800px"
        NotePanel.style.height = "600px"
        // NotePanel.style.zIndex = "99999"
        NotePanel.style.background = "rgba(0, 0, 100, 0.1)";
        let bfyRect = bfy.getBoundingClientRect();
        let NotePanelRect = NotePanel.getBoundingClientRect();

        let bfyCenterX = bfyRect.left + bfyRect.width / 2;
        let bfyCenterY = bfyRect.top + bfyRect.height / 2;

        let NotePanelWidth = NotePanelRect.width;
        let NotePanelHeight = NotePanelRect.height;

        let NotePanelLeft = bfyCenterX - NotePanelWidth / 2;
        let NotePanelTop = bfyCenterY - NotePanelHeight / 2;

        NotePanel.style.left = NotePanelLeft + 'px';
        NotePanel.style.top = NotePanelTop + 'px';
        bfy.appendChild(NotePanel)
        NotePanel.addEventListener('click', function (event) {
            event.preventDefault();
            event.stopPropagation();

        })
        NotePanel.addEventListener('dblclick', function (event) {
            event.preventDefault();
            event.stopPropagation();
        });
        //  鼠标移到NotePanel里面设置监听事件阻止滚轮事件冒泡,防止鼠标滚轮影响视频的音量
        NotePanel.addEventListener('mouseenter', () => { NotePanel.addEventListener('wheel', (e) => { e.stopPropagation(); }) })


    };



    // 6.弧形按钮;
    function refreshBar() {
        let bar = document.querySelector("#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-video-perch > div.custom-bar-class")
        if (bar && bar.style.display == "none") {
            // return;
            bar.style.display = "block";
            refreshBarListener()

        } else { setbar() }

    }

    function refreshBarListener() {
        let note_pc = document.querySelector("div.resizable-component.note-pc")

        bar.addEventListener('mouseover', (e) => {
            // bar.title = "鼠标移开可显示笔记"

            setTimeout(() => {
                let NotePanel = document.querySelector("div.resizable-component.note-pc")
                // NotePanel.style.left = NotePanel_x
                if (NotePanel.style.display == "none") {
                    NotePanel.style.display = "block"
                }

            }, 0)


        })

        bar.addEventListener('click', (e) => {
            e.preventDefault();
            e.stopPropagation();

            if (isClose) {
                let newJbjBtn = document.querySelector('#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-control-wrap > div.bpx-player-control-entity > div.bpx-player-control-bottom > div.bpx-player-control-bottom-right > div.video-note-inner');
                newJbjBtn.click();
            }


        });
    }



    function setbar() {
        let bfy = document.querySelector('#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-video-perch');
        // if (bfy.clientHeight < 1076) { return }
        let bar0 = document.querySelector("#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-video-perch > div.custom-bar-class")
        if (bar0) return;

        let bar = document.createElement('div');

        // 添加类名到bar元素
        bar.classList.add('custom-bar-class'); // 你可以将'custom-bar-class'替换为你想要的任何类名

        bar.style.cursor = 'pointer';
        bar.style.borderRadius = "100% 0 0 100%";
        bar.style.width = '60px';
        bar.style.height = '80%';
        bar.style.background = "rgba(33, 55, 61, 0.07)";
        // bar.style.background = "#1C1C1C";
        // bar.style.opacity = "0";
        bar.style.position = 'absolute';
        bar.style.right = '0';
        bar.style.top = '0';
        // bar.style.opacity = "0.05"

        bfy.appendChild(bar);
        let isBarClicked = false;






        bar.addEventListener('mouseover', (e) => {
            setTimeout(() => {
                let NotePanel = document.querySelector("div.resizable-component.note-pc")
                ////////////////////////////
                if (NotePanel.style.top == "0px") {
                    NotePanel.style.height = "600px"
                    NotePanel.style.width = "405px"
                    NotePanel.style.left = "590px"
                    NotePanel.style.top = "240px"

                }
                ///////////////////////////////

                if (NotePanel.style.display == "none" && IsJbjClick) {
                    NotePanel.style.display = "block"
                }

            }, 0)

        })

        bar.addEventListener('click', (e) => {
            e.preventDefault();
            e.stopPropagation();
            if (isClose) {
                let newJbjBtn = document.querySelector('#bilibili-player > div > div > div.bpx-player-primary-area > div.bpx-player-video-area > div.bpx-player-control-wrap > div.bpx-player-control-entity > div.bpx-player-control-bottom > div.bpx-player-control-bottom-right > div.video-note-inner');
                newJbjBtn.click();

            }

        });


    }


    // 7.插入标题按钮

    function pasteText(text) {
        let textNode = document.createTextNode(text);
        range.insertNode(textNode);
        range.setStartAfter(textNode);
        range.setEndAfter(textNode);
        selection.removeAllRanges();
        selection.addRange(range);
    }

    // 复制文本到剪贴板
    async function copyToClipboard() {
        let title;

        let multi_page = document.querySelector("#multi_page")
        if (!multi_page) {
            title = document.querySelector("#viewbox_report > div.video-info-title > div > h1")?.getAttribute('title').trim();
        } else {
            let path = 'li.on>a, li.watched.on>a'; // 修改选择器语法以正确应用"或"逻辑

            // // 获取 span 元素中的文本内容
            let pageNum = document.querySelector(path)?.getAttribute('href');

            let newPageNumber;
            let match = pageNum.match(/p=(\d+)/);
            if (match) {
                // match[1] 存储的是正则表达式中第一个括号内匹配的内容,即数字部分
                let pageNumber = match[1];

                // 将数字转换为 "P" 加上 数字,并在后面加上空格
                newPageNumber = 'P' + pageNumber + ' ';
            }

            title = document.querySelector(path)?.getAttribute('title');
            title = newPageNumber + " " + title

        }


        if (title) {
            try {
                await navigator.clipboard.writeText(title);
                //   console.log('文本已复制到剪贴板', title);
                return title;
            } catch (err) {
                console.error('无法复制文本: ', err);
            }
        } else {
            console.warn('未找到匹配的标题元素');
        }
    }




    function editorEvent() {

        const editor = document.querySelector('.ql-editor[contenteditable="true"]');
        // console.log("editor", editor);


        editor.addEventListener('keydown', function (event) {

            if (event.key === 'Enter' || event.key === 'ArrowUp' || event.key === 'ArrowDown' || event.key === 'Backspace' || event.key === 'ArrowLeft' || event.key === 'ArrowRight') {
                // 处理回车键按下事件
                selection = editor.ownerDocument.defaultView.getSelection(); // 更安全地获取selection,考虑editor所在的文档上下文
                range = selection.getRangeAt(0);
                //   console.log("enter的range", range);

            }
        });


        editor.addEventListener("click", function () {
            selection = editor.ownerDocument.defaultView.getSelection(); // 更安全地获取selection,考虑editor所在的文档上下文
            range = selection.getRangeAt(0);
            // console.log("点击的range", range);
        })



        editor.addEventListener('keydown', function (event) {
            if (event.ctrlKey && event.key === 'End')
                selection = editor.ownerDocument.defaultView.getSelection(); // 更安全地获取selection,考虑editor所在的文档上下文
            range = selection.getRangeAt(0);

        })
        editor.addEventListener('keydown', function (event) {
            if (event.ctrlKey && event.key === 'Home')
                selection = editor.ownerDocument.defaultView.getSelection(); // 更安全地获取selection,考虑editor所在的文档上下文
            range = selection.getRangeAt(0);

        })



    }




    function InsertBtnEvent() {
        let insertBox = document.querySelector("#web-toolbar > div > div")
        if (insertBox) {
            insertBox.style.display = 'inline-block';
            return;
        }




        let bcBtn = document.querySelector("span.ql-save-btn");
        if (!bcBtn) return;

        let bcBtnBox = document.querySelector("#web-toolbar > div")



        GM_addStyle(`
        .styled-button {
          background-color: #007bff;
          color: #393e46;
          // padding: 10px 20px;
          border: none;
          border-radius: 5px;
          cursor: pointer;
          box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.08);

        }
      `);



        let insertBtn = document.createElement('button');
        //   let insertBox = document.createElement('div');
        insertBox = document.createElement('div');
        insertBox.className = 'insert-box';

        insertBtn.className = 'styled-button';
        //   insertBtn.id = 'insert-btn';
        insertBtn.style.top = '0'
        insertBtn.innerText = 'P';
        // insertBtn.style.color = '#393e46'; // 设置字体颜色为黑色
        insertBtn.style.fontWeight = 'bold'; // 设置字体加粗
        insertBtn.style.fontSize = "20px"
        insertBox.style.display = 'inline-block';
        insertBox.style.position = 'relative';
        // insertBtn.classList.add('custom-button-insert'); // 假设类名为 'custom-button'
        insertBtn.title = "插入视频标题"

        insertBox.appendChild(insertBtn);
        //   bcBtnBox.insertBefore(insertBox, bcBtn)
        bcBtnBox.appendChild(insertBox)
        //   bcBtn.parentNode.insertBefore(insertBox, bcBtn)


        insertBtn.addEventListener('click', async function () {

            function swalEvent() {
                GM_addStyle(`
        .swal2-popup {

          font-size: 20px !important;  // 改变字体大小
          width: 120px !important;      // 改变宽度
          hight: 100px !important;      // 改变高度
          background-color: #f0f0f0 !important;
          display: flex;
        }
        .swal2-styled.swal2-confirm {
          border: 0;
          border-radius: 5px;
          background: #11999e;
          background-color: #3e4149 !important;  // 确认按钮颜色
          color: #444f5a;

          font-size: 20px;
        }
          `)

            }
            if (!range) {
                let bfy = document.querySelector('div.bpx-player-video-perch');
                let bfyHeight = bfy.getBoundingClientRect().height;
                let wh = window.innerHeight;
                if (bfyHeight == wh) {
                    return
                }

                Swal.fire({
                    // title: '提示',
                    // title: '',
                    text: '请选择区域',
                    // icon: 'info',
                })

                swalEvent()




                return;
            }

            try {
                let text = await copyToClipboard(); // 使用await等待Promise解析


                setTimeout(() => {
                    pasteText(text); // 确保pasteText接收实际的文本内容

                }, 0);
                // pasteText(text); // 确保pasteText接收实际的文本内容
            } catch (err) {
                console.error('从剪贴板读取文本时出错:', err);
            }


        })

    }

    // 笔记面板鼠标监听事件

    function noteEvent() {
        let note_pc = document.querySelector("div.resizable-component.note-pc");
        if (note_pc) {
            note_pc.addEventListener("contextmenu", function (event) {
                // 阻止右击冒泡
                event.stopPropagation();

                // 检查是否选中了文本或图片
                let selection = window.getSelection().toString().trim();
                let selectedImages = note_pc.querySelectorAll(".ql-image-preview.active"); // 假设图片有 selected 类表示被选中
                if (selection === "" && selectedImages.length === 0) {
                    event.preventDefault();
                    // 如果没有选中文本或图片,隐藏 note_pc
                    note_pc.style.display = "none";
                }
            });
        }
    }


    // 点进笔记列表后获取笔记列表中的所有图片元素,为每个图片元素添加点击事件
    function creatNoteImageClikEvent() {

        setTimeout(() => {

            let imgElements
            let zoomedImage = document.querySelector('.zoomed-image');
            let bpx = document.querySelector('.bpx-player-container');

            // bfx 非全屏 data-screen="normal"     全屏data-screen="full"  网页全屏data-screen="web"
            let data_screen = bpx.getAttribute('data-screen')
            function imageClickListener() {
                // 获取所有图片元素
                imgElements = document.querySelectorAll('.ql-image-preview .img-preview');
                for (let i = 0; i < imgElements.length; i++) {
                    const image = imgElements[i];
                    image.style.cursor = 'pointer';
                    image.title = "弹出"
                    image.addEventListener('mousedown', handleImageClick);
                    
                }

                let isDragging = false;
                let offsetX, offsetY;

                function handleImageClick(event) {

                    const image = event.currentTarget;
                    zoomedImage.src = image.src; // 动态设置 zoomedImage 的 src
                    
                    const rect = image.getBoundingClientRect();
                    const originalWidth = image.offsetWidth;
                    const originalHeight = image.offsetHeight;
                    const offsetX = 120;
                    const offsetY = 300; 
                    const x = rect.left + window.scrollX + (originalWidth / 2) + offsetX;
                    const y = rect.top + window.scrollY + (originalHeight / 2) - offsetY;
                    // 设置放大图片的位置
                    zoomedImage.style.left = `${x - (originalWidth * 0.5)}px`; // 根据原始图片的宽度调整位置
                    zoomedImage.style.top = `${y - (originalHeight * 0.5)}px`; // 根据原始图片的高度调整位置
                    zoomedImage.style.display = 'block';
                    zoomedImage.style.opacity = '1';

                    // 添加鼠标悬停和离开事件监听器
                    zoomedImage.addEventListener('mouseover', handleZoomedImageMouseOver);
                    zoomedImage.addEventListener('dblclick', handleZoomedImageDblclick);

                    // 添加拖动事件监听器
                    zoomedImage.addEventListener('mousedown', startDrag);
                    document.addEventListener('mousemove', drag);
                    document.addEventListener('mouseup', endDrag);
                    let data_screen = bpx.getAttribute('data-screen')
                    if (data_screen == 'full' || data_screen == 'web') {
                        document.body.removeChild(zoomedImage);
                        bpx.appendChild(zoomedImage);

                    } else {
                        bfx.removeChild(zoomedImage);
                        document.body.appendChild(zoomedImage);

                    }
                }

                function handleZoomedImageMouseOver() {
                    zoomedImage.style.transform = 'scale(0.6)'; // 初始放大比例
                    // if(IsMyNote){
                    //     zoomedImage.style.transform = 'scale(0.6)'; // 初始放大比例

                    // }else{
                    //     zoomedImage.style.transform = 'scale(0.8)'; // 初始放大比例
                    // }
                    zoomedImage.title = '双击关闭';
                }

                function handleZoomedImageDblclick() {
                    zoomedImage.style.opacity = '0';
                    setTimeout(() => {
                        zoomedImage.style.display = 'none';
                        zoomedImage.removeEventListener('mouseover', handleZoomedImageMouseOver);
                        zoomedImage.removeEventListener('mouseout', handleZoomedImageDblclick);
                        // if (data_screen == 'full' || data_screen == 'web') {
                        //     bfx.removeChild(zoomedImage);
                        // }else{
                        //     document.body.removeChild(zoomedImage);
                        // }
                    }, 300); // 与 transition 时间一致
                }

                function startDrag(event) {
                    isDragging = true;
                    offsetX = event.clientX - zoomedImage.offsetLeft;
                    offsetY = event.clientY - zoomedImage.offsetTop;
                }

                function drag(event) {
                    if (isDragging) {
                        zoomedImage.style.left = `${event.clientX - offsetX}px`;
                        zoomedImage.style.top = `${event.clientY - offsetY}px`;
                    }
                }

                function endDrag() {
                    isDragging = false;
                }
            }
            if (!zoomedImage) {
                // let bfy = document.getElementsByClassName("bpx-player-video-area")[0]
                // 创建一个新的图片元素,用于显示放大后的图片
                zoomedImage = document.createElement('img');
                zoomedImage.className = 'zoomed-image';
                zoomedImage.style.position = 'absolute';
                zoomedImage.style.display = 'none';
                zoomedImage.style.zIndex = 1000;
                zoomedImage.style.cursor = 'pointer';
                zoomedImage.style.maxWidth = 'none'; // 确保图片不受容器限制
                zoomedImage.style.maxHeight = 'none'; // 确保图片不受容器限制
                // if(IsMyNote){
                //     zoomedImage.style.transform = 'scale(0.6)'; // 初始放大比例

                // }else{
                //     zoomedImage.style.transform = 'scale(0.8)'; // 初始放大比例
                // }
                zoomedImage.style.transform = 'scale(0.6)'; // 初始放大比例

                zoomedImage.style.transition = 'transform 0.3s ease, opacity 0.3s ease';

                // alert("首次加载图片放大插件:" + data_screen)
                if (data_screen == 'full' || data_screen == 'web') {
                    bpx.appendChild(zoomedImage);
                    imageClickListener()
                } else {
                    document.body.appendChild(zoomedImage);
                    imageClickListener()
                }

                // imageClickListener()
            } else {
                // alert("非首次加载图片放大插件:" + data_screen)
                if (data_screen == 'full' || data_screen == 'web') {
                    bpx.appendChild(zoomedImage);
                }
                imageClickListener()
            }
        }, 1500);
    }

    // Your code here...
})();