// ==UserScript== // @name 把B站评论区挪到右边,边看视频边看评论 // @namespace http://tampermonkey.net/ // @version 2025.02.10 // @description 将B站评论区移动到右侧容器 // @author FruitJellies // @match https://www.bilibili.com/video/* // @icon https://www.bilibili.com/favicon.ico // @grant GM_addStyle // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; // 配置对象 const CONFIG = { containerSelector: "#mirror-vdcon > div.right-container", commentAppSelector: "#commentapp", targetPositionSelector: ".rcmd-tab", observerConfig: { childList: true, subtree: true, attributes: false }, timeoutDuration: 15000, // 15秒超时 styleSettings: { containerWidth: "22%", containerHeight: "110vh" } }; // 全局变量 let observer = null; let timeoutId = null; // 安全DOM操作 function safeDOMOperation(operation) { try { return operation(); } catch (error) { console.error('[BCTR] DOM操作失败:', error); return null; } } // 初始化容器样式 function initContainerStyles() { GM_addStyle(` ${CONFIG.containerSelector} { --container-width: ${CONFIG.styleSettings.containerWidth}; --container-height: ${CONFIG.styleSettings.containerHeight}; --scrollbar-display: none; width: var(--container-width); height: var(--container-height); overflow-y: scroll !important; scrollbar-width: var(--scrollbar-display); } ${CONFIG.containerSelector}::-webkit-scrollbar { display: var(--scrollbar-display); } body { overflow: auto !important; } `); } // 处理评论区移动 function handleCommentsMove() { return safeDOMOperation(() => { const commentApp = document.querySelector(CONFIG.commentAppSelector); const targetPosition = document.querySelector(CONFIG.targetPositionSelector); const shadowContent = commentApp?.querySelector('bili-comments')?.shadowRoot?.querySelector('#contents'); if (!commentApp || !targetPosition || !shadowContent) { return false; } targetPosition.parentNode.insertBefore(commentApp, targetPosition); console.log('[BCTR] 评论区移动成功'); return true; }); } // 清理资源 function cleanupResources() { if (observer) { observer.disconnect(); observer = null; } if (timeoutId) { clearTimeout(timeoutId); timeoutId = null; } console.log('[BCTR] 已释放观察器和定时器'); } // MutationObserver回调 function mutationCallback(mutationsList) { for (const mutation of mutationsList) { if (mutation.type === 'childList') { if (handleCommentsMove()) { cleanupResources(); break; } } } } // 初始化函数 function init() { initContainerStyles(); observer = new MutationObserver(mutationCallback); observer.observe(document.documentElement, CONFIG.observerConfig); timeoutId = setTimeout(() => { console.warn('[BCTR] 操作超时,终止检测'); cleanupResources(); }, CONFIG.timeoutDuration); console.log('[BCTR] 脚本初始化完成'); } // 启动脚本 try { init(); } catch (error) { console.error('[BCTR] 脚本初始化失败:', error); cleanupResources(); } })();