X岛-揭示板_显示优化,全面功能增强
// ==UserScript== // @name X岛-揭示板的增强型体验 // @namespace http://tampermonkey.net/ // @version 1.1.1 // @author 热心群众 // @description X岛-揭示板_显示优化,全面功能增强 // @license MIT // @match *://*.nmbxd1.com/* // @require https://update.greasyfork.org/scripts/494892/1376206/jquery-351.js // @require https://update.greasyfork.org/scripts/433654/977772/Spectrum.js // @grant GM_registerMenuCommand // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grant GM_listValues // @grant unsafeWindow // ==/UserScript== (function () { 'use strict'; class XDBBSScript { constructor() { //调试 this.DEV_value = true // 配置 this.setting = { original: [], normal: {}, advanced: {} } // 模块 this.modules = [] // 样式 this.style = '' // 数据存储 this.store = {} // 引用库 this.libs = { $ } } /** * 全程渲染函数 * @method renderAlways */ renderAlways() { for (const module of this.modules) { try { module.renderAlwaysFunc && module.renderAlwaysFunc(this) } catch (error) { this.printLog(`[${module.name}]模块在[renderAlwaysFunc()]中运行失败!`) console.log(error) } } } /** * 详情页渲染函数 * @method renderForms */ renderForms() { $('#h-menu[hld-forms-render!=ok]').each((index, dom) => { const $el = $(dom) // 等待页面渲染完成 if ($el.find('#h-menu-search').length == 0) return true for (const module of this.modules) { try { module.renderFormsFunc && module.renderFormsFunc($el, this) } catch (error) { this.printLog(`[${module.name}]模块在[renderFormsFunc()]中运行失败!`) console.log(error) } } $el.attr('hld-forms-render', 'ok') }) } /** * 添加模块 * @method addModule * @param {Object} module 模块对象 * @param {Boolean} plugin 是否为插件 */ addModule(module) { // 组件预处理函数 if (module.preProcFunc) { try { module.preProcFunc(this) } catch (error) { this.printLog(`[${module.name}]模块在[preProcFunc()]中运行失败!`) console.log(error) } } // 添加设置 const addSetting = setting => { // 标准模块配置 if (setting.key) { this.setting[setting.type || 'normal'][setting.key] = setting.default ?? '' this.setting.original.push(setting) } } // 功能板块 if (module.setting && !Array.isArray(module.setting)) { addSetting(module.setting) } if (module.settings && Array.isArray(module.settings)) { for (const setting of module.settings) { addSetting(setting) } } // 添加样式 if (module.style) { this.style += module.style } this.modules.push(module) } /** * 判断当前页面是否为详情页 * @method isForms * @return {Boolean} 判断状态 */ isForms() { return $('#h-content').length > 0 } /** * 抛出异常 * @method throwError * @param {String} msg 异常信息 */ throwError(msg) { alert(msg) throw (msg) } /** * 初始化 * @method init */ init() { // 开始初始化 this.printLog('初始化...') //localforage.config({ name: 'XD BBS Script DB' }) const startInitTime = new Date().getTime() const modulesTable = [] //同步配置 this.loadSetting() // 组件初始化函数 for (const module of this.modules) { if (module.initFunc) { try { module.initFunc(this) } catch (error) { this.printLog(`[${module.name}]模块在[initFunc()]中运行失败!`) console.log(error) } } } // 组件后处理函数 for (const module of this.modules) { if (module.postProcFunc) { try { module.postProcFunc(this) } catch (error) { this.printLog(`[${module.name}]模块在[postProcFunc()]中运行失败!`) console.log(error) } } } // 动态样式 for (const module of this.modules) { if (module.asyncStyle) { try { this.style += module.asyncStyle(this) } catch (error) { this.printLog(`[${module.name}]模块在[asyncStyle()]中运行失败!`) console.log(error) } } modulesTable.push({ name: module.title || module.name || 'UNKNOW', type: module.type == 'plugin' ? '插件' : '标准模块', version: module.version || '-' }) } // 插入样式 const style = document.createElement("style") style.appendChild(document.createTextNode(this.style)) document.getElementsByTagName('head')[0].appendChild(style) // 初始化完成 const endInitTime = new Date().getTime() console.table(modulesTable) this.printLog(`[v${this.getInfo().version}] 初始化完成: 共加载${this.modules.length}个模块,总耗时${endInitTime - startInitTime}ms`) console.log(`%c反馈问题请前往: ${this.getInfo().update}`, 'color:orangered;font-weight:bolder') } /** * 通知弹框 * @method popNotification * @param {String} msg 消息内容 * @param {Number} duration 显示时长(ms) */ popNotification(msg, duration = 1000) { $('#hld__noti_container').length == 0 && $('body').append('<div id="hld__noti_container"></div>') let $msgBox = $(`<div class="hld__noti-msg">${msg}</div>`) $('#hld__noti_container').append($msgBox) $msgBox.slideDown(100) setTimeout(() => { $msgBox.fadeOut(500) }, duration) setTimeout(() => { $msgBox.remove() }, duration + 500) } /** * 消息弹框 * @method popMsg * @param {String} msg 消息内容 * @param {String} type 消息类型 [ok, err, warn] */ popMsg(msg, type = 'ok') { $('.hld__msg').length > 0 && $('.hld__msg').remove() let $msg = $(`<div class="hld__msg hld__msg-${type}">${msg}</div>`) $('body').append($msg) $msg.slideDown(200) setTimeout(() => { $msg.fadeOut(500) }, type == 'ok' ? 2000 : 5000) setTimeout(() => { $msg.remove() }, type == 'ok' ? 2500 : 5500) } /** * 打印控制台消息 * @method printLog * @param {String} msg 消息内容 */ printLog(msg) { console.log(`%cXD%cScript%c ${msg}`, 'background: #222;color: #fff;font-weight:bold;padding:2px 2px 2px 4px;border-radius:4px 0 0 4px;', 'background: #fe9a00;color: #000;font-weight:bold;padding:2px 4px 2px 2px;border-radius:0px 4px 4px 0px;', 'background:none;color:#000;' ) } /** * 读取值 * @method saveSetting * @param {String} key */ getValue(key) { try { if (!this.DEV_value) { return GM_getValue(key) || window.localStorage.getItem(key) } else { return window.localStorage.getItem(key) } } catch { return window.localStorage.getItem(key) } } /** * 写入值 * @method setValue * @param {String} key * @param {String} value */ setValue(key, value) { try { if (!this.DEV_value) { GM_setValue(key, value) || window.localStorage.setItem(key, value); } else { window.localStorage.setItem(key, value); } } catch { window.localStorage.setItem(key, value); } } /** * 删除值 * @method deleteValue * @param {String} key */ deleteValue(key) { try { if (!this.DEV_value) { GM_deleteValue(key) || window.localStorage.removeItem(key); } else { window.localStorage.removeItem(key); } } catch { window.localStorage.removeItem(key); } } /** * 保存配置到本地 * @method saveSetting * @param {String} msg 自定义消息信息 */ saveSetting(msg = '面板:保存配置成功,刷新页面生效') { // 基础设置 for (let k in this.setting.normal) { $('input#hld__cb_' + k).length > 0 && (this.setting.normal[k] = $('input#hld__cb_' + k)[0].checked) } script.setValue('hld__NGA_setting', JSON.stringify(this.setting.normal)) // 高级设置 for (let k in this.setting.advanced) { if ($('#hld__adv_' + k).length > 0) { const originalSetting = this.setting.original.find(s => s.type == 'advanced' && s.key == k) const valueType = typeof originalSetting.default const inputType = $('#hld__adv_' + k)[0].nodeName if (inputType == 'SELECT') { this.setting.advanced[k] = $('#hld__adv_' + k).val() } else { if (valueType == 'boolean') { this.setting.advanced[k] = $('#hld__adv_' + k)[0].checked } if (valueType == 'number') { this.setting.advanced[k] = +$('#hld__adv_' + k).val() } if (valueType == 'string') { this.setting.advanced[k] = $('#hld__adv_' + k).val() } } } } script.setValue('hld__NGA_advanced_setting', JSON.stringify(this.setting.advanced)) msg && this.popMsg(msg) } /** * 从本地读取配置 * @method loadSetting */ loadSetting() { // 基础设置 try { const settingStr = script.getValue('hld__NGA_setting') if (settingStr) { let localSetting = JSON.parse(settingStr) for (let k in localSetting) { !this.setting.normal.hasOwnProperty(k) && delete localSetting[k] } this.setting.normal = localSetting } // 高级设置 const advancedSettingStr = script.getValue('hld__NGA_advanced_setting') if (advancedSettingStr) { let localAdvancedSetting = JSON.parse(advancedSettingStr) for (let k in this.setting.advanced) { !localAdvancedSetting.hasOwnProperty(k) && (localAdvancedSetting[k] = this.setting.advanced[k]) } for (let k in localAdvancedSetting) { !this.setting.advanced.hasOwnProperty(k) && delete localAdvancedSetting[k] } this.setting.advanced = localAdvancedSetting } } catch (e) { script.throwError(`【NGA-Script】读取配置文件出现错误,无法加载配置文件!\n错误问题: ${e}\n\n请尝试使用【修复脚本】来修复此问题`) } } /** * 运行脚本 * @method run */ run() { this.init() setInterval(() => { this.renderAlways() this.renderForms() }, 100) } /** * 获取脚本信息 * @method getInfo * @return {Object} 脚本信息对象 */ getInfo() { return { version: "1.1.0", author: '热心群众', github: 'https://github.com', update: 'https://greasyfork.org/zh-CN/scripts/497875-x%E5%B2%9B-%E9%A1%B5%E9%9D%A2%E7%BE%8E%E5%8C%96' } } } /* 注册菜单按钮 */ try { // 设置面板 GM_registerMenuCommand('设置面板', function () { $('#hld__setting_cover').css('display', 'block') $('html, body').animate({scrollTop: 0}, 500) }) // 清理缓存 GM_registerMenuCommand('清理缓存', function () { if (window.confirm('此操作为清理Local Storage缓存内容,不会清理配置\n\n继续请点击【确定】')) { localforage.clear() alert('操作成功,请刷新页面重试') } }) // 修复脚本 GM_registerMenuCommand('修复脚本', function () { if (window.confirm('如脚本运行失败或无效,尝试修复脚本,这会清除脚本的所有数据\n* 数据包含配置,各种名单等\n* 此操作不可逆转,请谨慎操作\n\n继续请点击【确定】')) { try { window.localStorage.clear() || GM_listValues().forEach(key => GM_deleteValue(key)) } catch {window.localStorage.clear()} alert('操作成功,请刷新页面重试') } }) // 反馈问题 GM_registerMenuCommand('反馈问题', function () { if (window.confirm('如脚本运行失败而且修复后也无法运行,请反馈问题报告\n* 问题报告请包含使用的: [浏览器],[脚本管理器],[脚本版本]\n* 描述问题最好以图文并茂的形式\n* 如脚本运行失败,建议提供F12控制台的红色错误输出以辅助排查\n\n默认打开的为Greasy Fork的反馈页面,有能力最好去Github Issue反馈问题,可以获得优先处理\n\n即将打开反馈页面,继续请点击【确定】')) { window.open('https://greasyfork.org/zh-CN/scripts/497875-x%E5%B2%9B-%E9%A1%B5%E9%9D%A2%E7%BE%8E%E5%8C%96/feedback') } }) } catch (e) { // 不支持此命令 console.warn(`【NGA Script】警告: 此脚本管理器不支持菜单按钮,可能会导致新特性无法正常使用,建议更改脚本管理器为 Tampermonkey[https://www.tampermonkey.net/] 或 Violentmonkey[https://violentmonkey.github.io/]`) } /* 标准模块 */ /** * 设置模块 * @name SettingPanel * @description 提供脚本的设置面板,提供配置修改,保存等基础功能 */ const SettingPanel = { name: 'SettingPanel', title: '设置模块', initFunc() { //设置面板 let $panelDom = $(` <div id="hld__setting_cover" class="animated zoomIn"> <div id="hld__setting_panel"> <a href="javascript:void(0)" id="hld__setting_close" class="hld__setting-close" close-type="hide">×</a> <p class="hld__sp-title"> <a title="更新地址" href="#" target="_blank">X岛 优化体验 <span class="hld__script-info">v${script.getInfo().version}</span> </a> </p> <div class="hld__field"> <p class="hld__sp-section">显示优化</p> <div id="hld__normal_left"></div> </div> <div class="hld__field"> <p class="hld__sp-section">功能增强</p> <div id="hld__normal_right"></div> </div> <div style="clear:both"></div> <div class="hld__advanced-setting"> <button id="hld__advanced_button">+</button><span>高级设置</span> <div class="hld__advanced-setting-panel"> <p>⚠️ 鼠标停留在 <span class="hld__help" title="详细描述">选项文字</span> 上可以显示详细描述,设置有误可能会导致插件异常或者无效! </p> <table id="hld__advanced_left"></table> <table id="hld__advanced_right"></table> </div> </div> <div class="hld__buttons"> <span id="hld_setting_panel_buttons"></span> <span> <button class="hld__btn" id="hld__save__data">保存设置</button> </span> </div> </div> </div> `) const insertDom = setting => { if (setting.type === 'normal') { $panelDom.find(`#hld__normal_${setting.menu || 'left'}`).append(` <p><label ${setting.desc ? 'class="hld__help" help="' + setting.desc + '"' : ''}> <input type="checkbox" id="hld__cb_${setting.key}"> ${setting.title || setting.key}${setting.shortCutCode ? '(快捷键切换[<b>' + script.getModule('ShortCutKeys').getCodeName(setting.rewriteShortCutCode || setting.shortCutCode) + '</b>])' : ''} </label></p> `) if (setting.extra) { $panelDom.find(`#hld__cb_${setting.key}`).attr('enable', `hld__${setting.key}_${setting.extra.mode || 'fold'}`) $panelDom.find(`#hld__normal_${setting.menu || 'left'}`).append(` <div class="hld__sp-${setting.extra.mode || 'fold'}" id="hld__${setting.key}_${setting.extra.mode || 'fold'}" data-id="hld__${setting.key}"> <p><button id="${setting.extra.id}">${setting.extra.label}</button></p> </div> `) } } if (setting.type === 'advanced') { let formItem = '' const valueType = typeof setting.default if (valueType === 'boolean') { formItem = `<input type="checkbox" id="hld__adv_${setting.key}">` } if (valueType === 'number') { formItem = `<input type="number" id="hld__adv_${setting.key}">` } if (valueType === 'string') { if (setting.options) { let t = '' for (const option of setting.options) { t += `<option value="${option.value}">${option.label}</option>` } formItem = `<select id="hld__adv_${setting.key}">${t}</select>` } else { formItem = `<input type="text" id="hld__adv_${setting.key}">` } } $panelDom.find(`#hld__advanced_${setting.menu || 'left'}`).append(` <tr> <td><span class="hld__help" help="${setting.desc || ''}">${setting.title || setting.key}</span></td> <td>${formItem}</td> </tr>`) } } for (const module of script.modules) { if (module.setting && module.setting.key) { insertDom(module.setting) } if (module.settings) { for (const setting of module.settings) { setting.key && insertDom(setting) } } } /** * Bind:Mouseover Mouseout * 提示信息Tips */ $('body').on('mouseover', '.hld__help', function (e) { if (!$(this).attr('help')) return const $help = $(`<div class="hld__help-tips">${$(this).attr('help').replace(/\n/g, '<br>')}</div>`) $help.css({ top: ($(this).offset().top + $(this).height() + 5) + 'px', left: $(this).offset().left + 'px' }) $('body').append($help) }).on('mouseout', '.hld__help', () => $('.hld__help-tips').remove()) $('body').append($panelDom) //本地恢复设置 //基础设置 for (let k in script.setting.normal) { if ($('#hld__cb_' + k).length > 0) { $('#hld__cb_' + k)[0].checked = script.setting.normal[k] const enableDomID = $('#hld__cb_' + k).attr('enable') if (enableDomID) { script.setting.normal[k] ? $('#' + enableDomID).show() : $('#' + enableDomID).hide() $('#' + enableDomID).find('input').each(function () { $(this).val() == script.setting.normal[$(this).attr('name').substring(8)] && ($(this)[0].checked = true) }) $('#hld__cb_' + k).on('click', function () { $(this)[0].checked ? $('#' + enableDomID).slideDown() : $('#' + enableDomID).slideUp() }) } } } //高级设置 for (let k in script.setting.advanced) { if ($('#hld__adv_' + k).length > 0) { const valueType = typeof script.setting.advanced[k] if (valueType == 'boolean') { $('#hld__adv_' + k)[0].checked = script.setting.advanced[k] } if (valueType == 'number' || valueType == 'string') { $('#hld__adv_' + k).val(script.setting.advanced[k]) } } } /** * Bind:Click * 设置面板-展开切换高级设置 */ $('body').on('click', '#hld__advanced_button', function () { if ($('.hld__advanced-setting-panel').is(':hidden')) { $('.hld__advanced-setting-panel').css('display', 'flex') $(this).text('-') } else { $('.hld__advanced-setting-panel').css('display', 'none') $(this).text('+') } }) /** * Bind:Click * 关闭面板(通用) */ $('body').on('click', '.hld__list-panel .hld__setting-close', function () { if ($(this).attr('close-type') == 'hide') { $(this).parent().hide() } else { $(this).parent().remove() } }) /** * Bind:Click * 保存配置 */ $('body').on('click', '#hld__save__data', () => { script.saveSetting() $('#hld__setting_cover').fadeOut(200) }) }, renderAlwaysFunc() { if ($('.hld__setting-box').length == 0) { $('#startmenu > tbody > tr > td.last').append('<div><div class="item hld__setting-box"></div></div>') let $entry = $('<a id="hld__setting" title="打开NGA优化摸鱼插件设置面板">NGA优化摸鱼插件设置</a>') $entry.click(() => { $('#hld__setting_cover').css('display', 'block') $('html, body').animate({ scrollTop: 0 }, 500) }) $('#hld__setting_close').click(() => $('#hld__setting_cover').fadeOut(200)) $('.hld__setting-box').append($entry) } }, addButton(button) { const $button = $(`<button class="hld__btn" id="${button.id}" title="${button.desc}">${button.title}</button>`) if (typeof button.click == 'function') { $button.on('click', function () { button.click($(this)) }) } $('#hld_setting_panel_buttons').append($button) }, style: ` .animated {animation-duration:.3s;animation-fill-mode:both;} .animated-1s {animation-duration:1s;animation-fill-mode:both;} .zoomIn {animation-name:zoomIn;} .bounce {-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;transform-origin:center bottom;} .fadeInUp {-webkit-animation-name:fadeInUp;animation-name:fadeInUp;} #loader {display:none;position:absolute;top:50%;left:50%;margin-top:-10px;margin-left:-10px;width:20px;height:20px;border:6px dotted #FFF;border-radius:50%;-webkit-animation:1s loader linear infinite;animation:1s loader linear infinite;} @keyframes loader {0% {-webkit-transform:rotate(0deg);transform:rotate(0deg);}100% {-webkit-transform:rotate(360deg);transform:rotate(360deg);}} @keyframes zoomIn {from {opacity:0;-webkit-transform:scale3d(0.3,0.3,0.3);transform:scale3d(0.3,0.3,0.3);}50% {opacity:1;}} @keyframes bounce {from,20%,53%,80%,to {-webkit-animation-timing-function:cubic-bezier(0.215,0.61,0.355,1);animation-timing-function:cubic-bezier(0.215,0.61,0.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}40%,43% {-webkit-animation-timing-function:cubic-bezier(0.755,0.05,0.855,0.06);animation-timing-function:cubic-bezier(0.755,0.05,0.855,0.06);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0);}70% {-webkit-animation-timing-function:cubic-bezier(0.755,0.05,0.855,0.06);animation-timing-function:cubic-bezier(0.755,0.05,0.855,0.06);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0);}90% {-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0);}} @keyframes fadeInUp {from {opacity:0;-webkit-transform:translate3d(-50%,100%,0);transform:translate3d(-50%,100%,0);}to {opacity:1;-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0);}} .hld__msg{display:none;position:fixed;top:10px;left:50%;transform:translateX(-50%);color:#fff;text-align:center;z-index:99###;padding:10px 30px 10px 45px;font-size:16px;border-radius:10px;background-image:url("");background-size:25px;background-repeat:no-repeat;background-position:15px} .hld__msg a{color:#fff;text-decoration: underline;} .hld__msg-ok{background:#4bcc4b} .hld__msg-err{background:#c33} .hld__msg-warn{background:#FF9900} .hld__flex{display:flex;} .hld__float-left{float: left;} .clearfix {clear: both;} #hld__noti_container {position:fixed;top:10px;left:10px;z-index:99;} .hld__noti-msg {display:none;padding:10px 20px;font-size:14px;font-weight:bold;color:#fff;margin-bottom:10px;background:rgba(0,0,0,0.6);border-radius:10px;cursor:pointer;} .hld__btn-groups {display:flex;justify-content:center !important;margin-top:10px;} button.hld__btn {padding:3px 8px;border:1px solid #591804;background:#fff8e7;color:#591804;} button.hld__btn:hover {background:#591804;color:#fff0cd;} button.hld__btn[disabled] {opacity:.5;} #hld__updated {position:fixed;top:20px;right:20px;width:230px;padding:10px;border-radius:5px;box-shadow:0 0 15px #666;border:1px solid #591804;background:#fff8e7;z-index: 9999;} #hld__updated .hld__readme {text-decoration:underline;color:#591804;} .hld__script-info {margin-left:4px;font-size:70%;color:#666;} #hld__setting {color:#6666CC;cursor:pointer;} #hld__setting_cover {display:none;padding-top: 70px;position:absolute;top:0;left:0;right:0;bottom:0;z-index:999;} #hld__setting_panel {position:relative;background:#fff8e7;width:600px;left: 50%;transform: translateX(-50%);padding:15px 20px;border-radius:10px;box-shadow:0 0 10px #666;border:1px solid #591804;} #hld__setting_panel > div.hld__field {float:left;width:50%;} #hld__setting_panel p {margin-bottom:10px;} #hld__setting_panel .hld__sp-title {font-size:15px;font-weight:bold;text-align:center;} #hld__setting_panel .hld__sp-section {font-weight:bold;margin-top:20px;} .hld__setting-close {position:absolute;top:5px;right:5px;padding:3px 6px;background:#fff0cd;color:#591804;transition:all .2s ease;cursor:pointer;border-radius:4px;text-decoration:none;z-index:9999;} .hld__setting-close:hover {background:#591804;color:#fff0cd;text-decoration:none;} #hld__setting_panel button {transition:all .2s ease;cursor:pointer;border-radius: 4px;} .hld__advanced-setting {border-top: 1px solid #e0c19e;border-bottom: 1px solid #e0c19e;padding: 3px 0;margin-top:25px;} .hld__advanced-setting >span {font-weight:bold} .hld__advanced-setting >button {padding: 0px;margin-right:5px;width: 18px;text-align: center;} .hld__advanced-setting-panel {display:none;padding:5px 0;flex-wrap: wrap;} .hld__advanced-setting-panel>p {width:100%;} .hld__advanced-setting-panel>table {width:50%;} .hld__advanced-setting-panel>p {margin: 7px 0 !important;font-weight:bold;} .hld__advanced-setting-panel>p svg {height:16px;width:16px;vertical-align: top;margin-right:3px;} .hld__advanced-setting-panel>table td {padding-right:10px} .hld__advanced-setting-panel input[type=text],.hld__advanced-setting-panel input[type=number] {width:80px} .hld__advanced-setting-panel input[type=number] {border: 1px solid #e6c3a8;box-shadow: 0 0 2px 0 #7c766d inset;border-radius: 0.25em;} .hld__help {cursor:help;text-decoration: underline;} .hld__buttons {clear:both;display:flex;justify-content:space-between;padding-top:15px;} button.hld__btn {padding:3px 8px;border:1px solid #591804;background:#fff8e7;color:#591804;} button.hld__btn:hover {background:#591804;color:#fff0cd;} .hld__sp-fold {padding-left:23px;} .hld__sp-fold .hld__f-title {font-weight:bold;} .hld__help-tips {position: absolute;padding: 5px 10px;background: rgba(0,0,0,.8);color: #FFF;border-radius: 5px;z-index: 9999;} ` } /** * 隐藏图片模块 * @name HideImage * @description 此模块提供了可以快捷键切换显示隐藏图片 * 其中隐藏的图片会用一个按钮来替代 */ const HideImage = { name: 'HideImage', title: '隐藏图片', setting: { //shortCutCode: 69, // E type: 'normal', key: 'hideImage', default: false, title: '隐藏贴内图片', menu: 'left' }, renderFormsFunc($el) { if (script.setting.normal.hideImage) { $el = $("#h-content") $el.find('.h-threads-img-box').each(function () { const classs = $(this).attr('class') if ((classs) && !$(this).is(':hidden')) { $(this).addClass('hld__img-postimg') let $imgB = $('<button class="switch-img" style="display:none">图</button>') $imgB.on('click', function () { $(this).parent().prev().toggle(); $(this).text($(this).parent().prev().is(':hidden') ? '图' : '隐藏') }) if (script.setting.normal.hideImage) { $(this).hide(); $imgB.show() } $(this).next().children().first().before($imgB) } }) } }, asyncStyle() { if (script.setting.normal.hideImage) { return ` .switch-img{background: #eee;border-radius: 0.25em;padding: 0 0.5em;margin-right: 10px;border: none;} .switch-img:hover{background: #dfdfdf;} ` } } } /** * 高清图片模块 * @name HDImage * @description 此模块替换了原有的图片链接为高清链接 * */ const HDImage = { name: 'HDImage', title: '高清图片', setting: { //shortCutCode: 69, // E type: 'normal', key: 'HDImage', default: false, title: '启用高清图片链接', menu: 'left' }, renderFormsFunc($el) { //console.log('高清图片模块加载', script.setting.normal.HDImage) if (script.setting.normal.HDImage) { $('img[src^="https://image.nmb.best/thumb"]').attr('src', function (index, oldSrc) { return oldSrc.replace('/thumb', '/image'); }); } }, asyncStyle() { if (script.setting.normal.HDImage) { console.log('高清图片模块加载', script.setting.normal.HDImage) return ` /*图片鼠标经过放大 -- 配合页面美化使用*/ ._xd_beautyCss .h-threads-img-box:hover::after {background: rgba(0, 0, 0, 0.5);} ._xd_beautyCss .h-threads-img:hover {position: relative;transform: translateX(160px) translateY(0px) scale(2.5) translateZ(0px);z-index: 9999;border-radius: 0px;margin: 0 20px 10px 0;} ._xd_beautyCss .h-threads-img:hover div.h-threads-item-index{overflow: inherit;} ._xd_beautyCss .h-threads-img{max-width: 250px !important;} ` } } } /** * 页面美化模块 * @name PageCss * @description 此模块对全站进行了页面Css美化 */ const PageCss = { name: 'PageCss', title: '页面美化', setting: { type: 'normal', key: 'PageCss', default: true, title: '启用页面美化', menu: 'left' }, renderFormsFunc() { //console.log('页面美化模块加载', script.setting.normal.PageCss) script.setting.normal.PageCss && $('body').addClass('_xd_beautyCss') // 新的<logo>内容 var newContent = ` <div id="h-menu-top" style="display: flex;justify-content: center;padding: 5px;"> <div class="h-menu-logo" style="width: 60px;margin-right: 10px;"> <img src="https://file.moetu.org/images/2023/08/29/e1db89f8b15b0002b1ebdf574d5a7f30c6f2590891da1a8422eba303bf8b589c.gif" alt="" border="0" width="100%"> </div> <div class="h-menu-slogan"> <a href="/" id="h-menu-top-sitename" style="display: block;font-size: 20px;font-weight: bold;margin:6px 6px 6px 0;text-align:left;">X岛揭示板 </a> <a href="/" id="h-menu-top-img" style="display: block;font-size: 14px;color: #ccc;">写作绅士,读作丧尸</a> </div> </div> `; // 替换logo $('#h-menu-top').empty(); $('#h-menu-top').append(newContent); // 添加头像 $(".h-threads-item-reply").each(function () { if ($(this).find(".h-threads-img-box").length === 0) { var uid = $(this).find(".h-threads-info-uid").text(); var mainUid = $(this).parent().siblings(".h-threads-item-main").find(".h-threads-info-uid").text(); var firstThreeChars = uid.substring(3, 6); if (mainUid == uid) { $(this).append(`<div class="h-threads-info-idafter Po-text">${firstThreeChars}</div>`) } else { $(this).append(`<div class="h-threads-info-idafter">${firstThreeChars}</div>`) } } else { $(this).find(".h-threads-item-reply-main").css("padding", "0") } }); //移除表单的类 $(".h-post-form-input").removeClass("uk-width-1-5") // 初始化隐藏表单 $("#h-post-form").find("form").hide(); $("#h-post-form").prepend(`<div class="__jion-form"><div>点击参与讨论</div></div>`); $(".__jion-form").on('click', function () { var hTitleText = $('h2.h-title').text(); if (hTitleText.indexOf('[只看PO]') !== -1) { var msg = "目前是[只看PO],请返回主串参与讨论" msg && script.popMsg(msg) // 定义动画 var blinkAnimation = '@keyframes blink { 0% { color: black; } 50% { color: red; } 100% { color: black; } }'; var blinkClass = '.blink { animation: blink 0.5s step-start infinite; }'; // 将动画样式添加到页面的样式表中 var styleSheet = document.createElement("style"); styleSheet.type = "text/css"; styleSheet.innerText = blinkAnimation + ' ' + blinkClass; document.head.appendChild(styleSheet); // 找到文本为“返回主串”的标签并添加闪烁类 var $target = $('span.h-threads-info-report-btn a').filter(function () { return $(this).text() === '返回主串'; }); if ($target.length) { $target.addClass('blink'); // 3秒后移除闪烁效果 setTimeout(function () { $target.removeClass('blink'); }, 3000); } } else { var form = $("#h-post-form").find("form"); if (form.is(":hidden")) { $(this).text("点击隐藏表单") form.slideDown(200); } else { $(this).text("点击参与讨论") form.slideUp(200); } } }); //底部导航 $(window).scroll(function () { if ($(window).scrollTop() + $(window).height() >= $(document).height()) { $('#h-bottom-nav').css('display', 'flex'); } else { $('#h-bottom-nav').css('display', 'none'); } }); }, asyncStyle() { return ` /*全局样式*/ ._xd_beautyCss hr{display:none;} ._xd_beautyCss font[color='#789922']{cursor: pointer;} /*导航目录*/ ._xd_beautyCss #h-menu {height: 100% !important;width: 240px;overflow: auto;border-right: 1px solid #e6e6e6;} ._xd_beautyCss #h-menu a{text-decoration: none;} ._xd_beautyCss #h-menu::-webkit-scrollbar-thumb {background-color: #d6f4ff;outline-offset: -2px;outline: 2px solid #fff;-webkit-border-radius: 4px;border: 2px solid #fff;} ._xd_beautyCss #h-menu::-webkit-scrollbar-thumb:hover {background-color: #00bbff;-webkit-border-radius: 4px;} ._xd_beautyCss #h-menu::-webkit-scrollbar {width: 8px;height: 8px;} ._xd_beautyCss #h-menu::-webkit-scrollbar-track-piece {background-color: #fff;-webkit-border-radius: 0;} ._xd_beautyCss #h-menu::-webkit-scrollbar-thumb:active{height:50px;background-color:#000;-webkit-border-radius:4px;} ._xd_beautyCss #h-menu #h-menu-content .uk-parent .uk-nav-sub{padding:0} ._xd_beautyCss #h-menu #h-menu-content .uk-parent .uk-nav-sub li {padding: 0 30px;border-radius: 5px;margin: 1px 10px;} ._xd_beautyCss #h-menu #h-menu-content .h-active {background: #ecf5ff;} ._xd_beautyCss #h-menu #h-menu-content .h-active a{color: #07D;} ._xd_beautyCss #h-menu .uk-nav-parent-icon>.uk-parent.uk-open>a:before {content: "\\f009";font-family: FontAwesome;margin-right: 5px;} ._xd_beautyCss #h-menu .uk-nav-parent-icon>.uk-parent>a:before {content: "\\f009";font-family: FontAwesome;margin-right: 5px;} ._xd_beautyCss #h-menu .uk-nav-sub>li:hover {background: rgba(0, 0, 0, .03);color: #444;outline: 0;box-shadow: inset 0 0 1px rgba(0, 0, 0, .06);text-shadow: 0 -1px 0 #fff;} /*主页*/ ._xd_beautyCss #h-content {margin: auto auto 30px 240px;display: flex;flex-direction: column;align-items: center;background-color: #f1f2f5;padding-bottom: 20px;} ._xd_beautyCss #h-content-top-nav{padding: 15px;background: #fff;margin: 10px 0 0 0 !important;border-radius: 10px 10px 0 0 ;} ._xd_beautyCss #h-content-top-nav .uk-breadcrumb{margin:0 !important;} ._xd_beautyCss #h-content h2.h-title{padding: 15px;background: #fff;margin: 0 0 10px 0 !important;border-radius: 0 0 10px 10px;} /*串样式*/ ._xd_beautyCss .h-threads-item {background-color: #FFF;border-radius: 10px;padding: 15px;margin-bottom: 10px;} /*串样式 -- PO串*/ ._xd_beautyCss .h-threads-item .h-threads-item-main .h-threads-content {line-height: 1.6;color: #555;margin: 15px 0px;} ._xd_beautyCss .h-threads-item .h-threads-item-main .h-threads-tips {color: #dbdbdb;} ._xd_beautyCss .h-threads-item .h-threads-item-main .h-threads-info {margin-bottom: 10px;} ._xd_beautyCss .h-threads-item .h-threads-item-main .h-threads-info-title {font-size: 1.5em;font-weight: bold;color: #333;} /*串样式 -- 回应串*/ ._xd_beautyCss .h-threads-item .h-threads-item-reply {border-radius: 5px;padding: 10px;margin-top: 10px;width: 100%;margin: 10px auto;padding: 10px 0;position: relative;border-top: 1px solid #cccccc50;} ._xd_beautyCss .h-threads-item .h-threads-item-reply .h-threads-item-reply-icon{display:none;} ._xd_beautyCss .h-threads-item .h-threads-item-reply .h-threads-item-reply-main {background-color: #fff0;padding: 0px 0 0 40px;} ._xd_beautyCss .h-threads-item .h-threads-item-reply .h-threads-item-reply-main .h-threads-info {font-size: 14px;line-height: 22px;margin: 5px 40px;color:#22222250;} ._xd_beautyCss .h-threads-item .h-threads-item-reply .h-threads-item-reply-main .h-threads-info-title {font-size: 14px;color:#22222250;} ._xd_beautyCss .h-threads-item .h-threads-item-reply .h-threads-item-reply-main .h-threads-info-email {display: none;} ._xd_beautyCss .h-threads-item .h-threads-item-reply .h-threads-item-reply-main .h-threads-info-createdat {color:#22222250;} ._xd_beautyCss .h-threads-item .h-threads-item-reply .h-threads-item-reply-main .h-threads-info-uid {color:#22222250;} ._xd_beautyCss .h-threads-item .h-threads-item-reply .h-threads-item-reply-main .h-threads-info-id {color:#22222250;} ._xd_beautyCss .h-threads-item .h-threads-item-reply .h-threads-item-reply-main .h-threads-content {margin: 10px 40px;} ._xd_beautyCss .h-threads-item .h-threads-item-reply .h-threads-item-reply-main .h-threads-content font{float: right;color: #22222220;font-size: 14px} ._xd_beautyCss .h-threads-item .h-threads-item-reply .h-threads-item-reply-main .h-threads-content br:first-of-type{display:none;} /*串样式 -- 回应串详情去除阴影*/ ._xd_beautyCss div.h-threads-item-reply.h-threads-item-reply-selected > div.h-threads-item-reply-main, ._xd_beautyCss div.h-threads-item.uk-clearfix.h-threads-item-selected > div.h-threads-item-main {box-shadow:none} /*串样式 -- 举报订阅按钮*/ ._xd_beautyCss .h-threads-item .h-threads-info-report-btn {float: right;color:#22222220;} ._xd_beautyCss .h-threads-item .h-threads-info-report-btn a{color:#22222220;} /*串样式 -- 回应按钮*/ ._xd_beautyCss .h-threads-item .h-threads-info-reply-btn {font-size: 14px !important;color: #cc1105;border: 1px solid #ccc;padding: 2px 10px;margin: 0 15px;border-radius: 5px;background: #cc1105;} ._xd_beautyCss .h-threads-item .h-threads-info-reply-btn:hover {color: red;background: red;} ._xd_beautyCss .h-threads-item .h-threads-info-reply-btn a {color: #fff;text-decoration: none;} /*主页引用串*/ ._xd_beautyCss #h-ref-view {right: 5px;box-shadow: -1px -1px 1px 0px #f5f5f5;border-radius: 10px;border: 1px solid #e5e5e5;background: #fff;} ._xd_beautyCss #h-ref-view .h-threads-item-ref{border-radius: 5px;border: 1px solid #fff;background: #fff;padding:0;margin:0;} /*图片*/ ._xd_beautyCss .h-threads-img {display: inline-block;margin: 0 20px 0 0 !important; max-height: 800px !important;border-radius: 5px;transition: transform 0.3s ease, box-shadow 0.3s ease, border-radius 0.3s ease;} ._xd_beautyCss .h-threads-img-box {position: relative;} ._xd_beautyCss .h-threads-img-box::after {content: '';position: fixed;top: 0;left: 0;width: 100vw;height: 100vh;background: rgba(0, 0, 0, 0);transition: background 0.3s ease;z-index: 1;pointer-events: none;} ._xd_beautyCss .h-threads-item .h-threads-img-box.h-active .h-threads-img-a .h-threads-img {max-height: 800px;} /*头像自定义样式*/ ._xd_beautyCss .h-threads-info-idafter {text-align: center;line-height: 50px;font-size: 15px;font-weight: bolder;color: #fff;position: absolute;left: 15px;top: 15px;display: block;width: 50px;height: 50px;background: #c0c4cc;border-radius: 10px;} ._xd_beautyCss .h-threads-info-idafter::before {content: " ";position: absolute;top: 0;left: 0;width: 100%;height: 100%; background-image: url(https://file.moetu.org/images/2023/08/29/e1db89f8b15b0002b1ebdf574d5a7f30c6f2590891da1a8422eba303bf8b589c.gif); background-size: cover;background-repeat: no-repeat;background-position: center;opacity: 0.1;} /* 表单样式 */ ._xd_beautyCss #h-post-form {display: block;width: 100%;} ._xd_beautyCss #h-post-form .h-forum-header{margin-bottom: 10px;padding: 5px;} ._xd_beautyCss #h-post-form .h-post-form-title {background-color: #fff0;font-weight: bold;margin-bottom: 5px;line-height: 35px;padding: 0;text-align: center;width: 100%;} ._xd_beautyCss #h-post-form .h-post-form-input {margin-bottom: 10px;} ._xd_beautyCss #h-post-form form {margin: 0 auto;padding: 20px 20px 0 20px;background-color: #FFF;border-radius: 10px;} ._xd_beautyCss #h-post-form form input[type="text"] {width: 100%;padding: 8px;font-size: 14px;border-radius: 4px;border: none;box-sizing: border-box;border: 1px solid #e9e9e9;} ._xd_beautyCss #h-post-form form input[type="file"] {width: 100%;padding: 8px;font-size: 14px;border-radius: 4px;border: none;box-sizing: border-box;cursor: pointer;} ._xd_beautyCss #h-post-form form input[type="submit"] {padding: 6px 20px;font-size: 16px;background-color: #4CAF50;color: white;border: none;border-radius: 4px;cursor: pointer;width: 100%;} ._xd_beautyCss #h-post-form form input[type="submit"]:hover {background-color: #45a049;} ._xd_beautyCss #h-post-form form textarea {width: 100%;padding:10px !important;;font-size: 14px;border: 1px solid #ccc;border-radius: 4px;box-sizing: border-box;} ._xd_beautyCss #h-post-form form label.h-water-tool {display: block;margin-top: 8px;font-size: 14px;} ._xd_beautyCss #h-post-form form select{border: 1px solid #ccc;border-radius: 4px;box-sizing: border-box;padding: 8px;} ._xd_beautyCss #h-post-form form select:focus{ outline: none;border: 1px solid #969696;} ._xd_beautyCss #h-post-form .uk-grid {display: flex;flex-wrap: wrap;} ._xd_beautyCss #h-post-form .uk-width-1-5, ._xd_beautyCss #h-post-form .uk-width-3-5, ._xd_beautyCss #h-post-form .uk-width-1-6 {box-sizing: border-box;padding: 0 10px 0 0;margin: 0 10px 10px 0;border-radius: 5px;} ._xd_beautyCss #h-post-form .h-post-form-option.uk-width-1-5:has(input[type="checkbox"]){display: none;} ._xd_beautyCss #h-post-form .uk-width-1-5 {width: 100px !important;border: 1px solid #e9e9e9;padding: 0!important;height: 35px;display: flex;align-content: flex-start;flex-wrap: wrap;background: #fff;} ._xd_beautyCss #h-post-form .uk-width-1-6 {width: 19% !important;} ._xd_beautyCss #h-post-form .h-post-form-title, ._xd_beautyCss #h-post-form .h-post-form-input, ._xd_beautyCss #h-post-form .h-post-form-option {padding: 0;line-height: 35px;} ._xd_beautyCss #h-post-form .__jion-form {width: 100%;height: 35px;display: flex;align-items: center;background-color: #fff;padding: 0 10px;border-radius: 5px;box-sizing: border-box;margin-bottom: 10px;cursor: pointer;user-select: none;} ._xd_beautyCss #h-post-form .__jion-form:hover {color: #FFF;background: linear-gradient(45deg,#84F0EE 0%,#84F0EE 30%,#5AD4C2 30%,#5AD4C2 60%,#7b8df3 60%,#7b8df3 100%,#84F0EE 100%,#84F0EE 100%);background-size: 400%;background-position: 0% 100%;animation: rainbow 1.5s linear infinite;} @keyframes rainbow {0% {background-position: 0% 200%;}100% {background-position: 200% 0%;}} /*底部 -- 配合隐藏底部使用*/ ._xd_beautyCss #h-bottom-nav {display: flex;justify-content: center;color: #cfcfcf;height: 30px;line-height: 30px;background: #fff;display: none;box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2);transition: opacity 0.3s ease, visibility 0.3s ease;border: none;font-size: 12px} ._xd_beautyCss #h-bottom-nav a {margin: 0 5px;color: #cfcfcf;font-size: 12px} ` } } /** * 自动翻页模块 * @name AutoPage * @description 此模块提供了脚本自动翻页的功能 * */ const AutoPage = { name: 'AutoPage', title: '自动翻页', settings: [{ type: 'normal', key: 'autoPage', default: true, title: '自动翻页', menu: 'right' }], $window: $(window), renderAlwaysFunc() { const _this = this if (script.setting.normal.autoPage) { if ($('#hld__next_page').length > 0) return $('ul.uk-pagination[hld-auto-page!=ok] li').each(function () { //console.log("自动翻页已加载") var $a = $(this).children('a'); if ($a.text().trim() == '下一页') { $a.attr('id', 'hld__next_page'); $(window).on('scroll.autoPage', function () { if ($(document).scrollTop() != 0 && (Math.ceil($(document).scrollTop()) + $(window).height() >= ($(document).height() - 20))) { if ($('#hld__next_page').length > 0) { script.popMsg("正在翻页...") document.getElementById('hld__next_page').click(); $('#hld__next_page').removeAttr('id'); $(window).off('scroll.autoPage'); } } }); } }); $('ul.uk-pagination').attr('hld-auto-page', 'ok'); } } } /** * 串串页新页面打开模块 * @name LinkBlank * @description 此模块可以选择在新页面打开链接 * */ const LinkBlank = { name: 'LinkBlank', title: '串串页新页面打开', setting: { //shortCutCode: 69, // E type: 'normal', key: 'LinkBlank', default: true, title: '串串页新页面打开', menu: 'right' }, renderFormsFunc($el) { //console.log('启用串串页新页面打开', script.setting.normal.LinkBlank) if (script.setting.normal.LinkBlank) { $("#h-content .h-threads-list a").attr("target", "_blank"); } } } /** * 回应串折叠模块 * @name FoldChuan * @description 此模块支持折叠回应串 * 当回应串超过3个时,折叠掉其余串 * 仅主页生效 * */ const FoldChuan = { name: 'FoldChuan', title: '回应串折叠', setting: { type: 'normal', key: 'FoldChuan', default: true, title: '回应串折叠', menu: 'left' }, renderFormsFunc($el) { console.log('启用回应串折叠', script.setting.normal.FoldChuan) if (script.setting.normal.FoldChuan) { if (!$("#h-content .uk-container .h-title").text().startsWith("No.")) { console.log('回应串折叠执行', script.setting.normal.FoldChuan) $('.h-threads-item .h-threads-item-replies').each(function () { $(this).parent().addClass("removeScorll") var replies = $(this).find('.h-threads-item-reply'); if (replies.length > 3) { replies.slice(3).hide(); replies.eq(2).after('<button class="show-more-replies">显示更多回复</button>'); $('.show-more-replies', this).click(function () { replies.slice(3).toggle(); $(this).text($(this).next().is(':hidden') ? '显示更多回复' : '隐藏回复') }); } }); var maxHeight = $(window).height() * 0.5; var maxHeightV = "300px"; $('.h-threads-content').each(function () { var $content = $(this); if ($content.outerHeight() > maxHeight) { $content.css({ 'max-height': maxHeightV, 'overflow': 'hidden', 'white-space': 'normal', 'text-overflow': 'ellipsis' }); $content.after(` <div style="position: relative;"><div style="width: 100%;height: 20px;background: linear-gradient(to bottom, #fff0, #fff);position: absolute;top: -30px;"></div> <button class="maxtoggle-button">展开</button></div>`); var $button = $content.next().find('.maxtoggle-button'); if ($button.parent().parent().attr('class') == "h-threads-item-main") { $content.css("padding-left", "35px") } $button.click(function () { if ($content.css('max-height') == maxHeightV) { var scrollHeight = $content[0].scrollHeight; $content.animate({ maxHeight: scrollHeight + 'px' }, "fast"); $(this).prev().css("background", "#fff0") $(this).text("隐藏"); } else { $content.animate({ maxHeight: maxHeightV }, "fast"); $(this).prev().css("background", "linear-gradient(to bottom, #fff0, #fff)") $(this).text("展开"); } }); } }); } } }, asyncStyle() { if (script.setting.normal.FoldChuan) { return ` #h-content .h-threads-list .maxtoggle-button{position: absolute;top: -30px;left: -10px;border: none;border-radius: 5px;background: #f9f9f9;color: #b9b9b9;} #h-content .h-threads-list .maxtoggle-button:hover{background: #e9e9e9;color:#222} #h-content .h-threads-list .removeScorll{max-height: 100%;overflow-y: none;} #h-content .h-threads-list .show-more-replies{width: 100%;border: none;padding: 5px 0;border-radius: 5px;background: #f9f9f9;color: #b9b9b9;} #h-content .h-threads-list .show-more-replies:hover{background: #e9e9e9;color:#222} ` } } } /** * 扩展坞模块 * @name ExtraDocker * @description 此模块提供了一个悬浮的扩展坞,来添加某些功能 * 目前添加的功能有: * TOP返回顶部: 返回顶部 * MENU打开菜单: 打开设置主菜单 * REPLY跳转上一页: 跳转到上一页 * BOTTOM跳转尾页: 跳转到当前帖子的尾页 */ const ExtraDocker = { name: 'ExtraDocker', title: '扩展坞', initFunc() { const _this = this const $dockerDom = $(` <div class="hld__docker"> <div class="hld__docker-sidebar"> <svg t="1603961015993" class="icon" viewBox="0 0 #### ####" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3634" width="64" height="64"><path d="M518.344359 824.050365c-7.879285 0-15.758569-2.967523-21.693614-9.004897l-281.403018-281.403018c-5.730389-5.730389-9.004897-13.609673-9.004897-21.693614s3.274508-15.963226 9.004897-21.693614l281.403018-281.403018c11.972419-11.972419 31.41481-11.972419 43.387229 0 11.972419 11.972419 11.972419 31.41481 0 43.387229L280.32857 511.948836l259.709403 259.709403c11.972419 11.972419 11.972419 31.41481 0 43.387229C534.0006 821.082842 526.223643 824.050365 518.344359 824.050365z" p-id="3635" fill="#888888"></path><path d="M787.160987 772.88618c-7.879285 0-15.758569-2.967523-21.693614-9.004897l-230.238833-230.238833c-11.972419-11.972419-11.972419-31.41481 0-43.387229l230.238833-230.238833c11.972419-11.972419 31.41481-11.972419 43.387229 0 11.972419 11.972419 11.972419 31.41481 0 43.387229L600.309383 511.948836l208.545218 208.545218c11.972419 11.972419 11.972419 31.41481 0 43.387229C802.817228 769.918657 794.937943 772.88618 787.160987 772.88618z" p-id="3636" fill="#888888"></path></svg> </div> <div class="hld__docker-btns"> <div data-type="TOP" id="hld__jump_top"><svg t="1603962702679" title="返回顶部" class="icon" viewBox="0 0 #### ####" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9013" width="64" height="64"><path d="M528.73 161.5c-9.39-9.38-24.6-9.38-33.99 0L319.65 336.59a24.028 24.028 0 0 0-7.05 23.59A24.04 24.04 0 0 0 330 377.6c8.56 2.17 17.62-0.52 23.6-7.02l158.14-158.14 158.1 158.14a23.901 23.901 0 0 0 17 7.09c6.39 0 12.5-2.55 17-7.09 9.38-9.39 9.38-24.61 0-34L528.73 161.5zM63.89 607.09h102.79V869.5h48.04V607.09h102.79v-48.04H63.89v48.04z m518.69-48.05h-127.3c-15.37 0-30.75 5.85-42.49 17.59a59.846 59.846 0 0 0-17.59 42.49v190.3c0 15.37 5.89 30.75 17.59 42.49 11.74 11.74 27.12 17.59 42.49 17.59h127.3c15.37 0 30.75-5.85 42.49-17.59 11.7-11.74 17.59-27.12 17.59-42.49V619.17a59.903 59.903 0 0 0-17.53-42.55 59.912 59.912 0 0 0-42.55-17.54v-0.04z m12 250.38c0 2.31-0.6 5.59-3.5 8.54a11.785 11.785 0 0 1-8.5 3.5h-127.3c-3.2 0.02-6.26-1.26-8.5-3.54a11.785 11.785 0 0 1-3.5-8.5V619.17c0-2.31 0.6-5.59 3.5-8.54 2.24-2.27 5.31-3.53 8.5-3.5h127.3c2.27 0 5.55 0.64 8.5 3.55 2.27 2.24 3.53 5.31 3.5 8.5v190.29-0.05z m347.4-232.78a59.846 59.846 0 0 0-42.49-17.59H734.74V869.5h48.04V733.32h116.71a59.94 59.94 0 0 0 42.54-17.55 59.923 59.923 0 0 0 17.55-42.54v-54.07c0-15.37-5.85-30.74-17.59-42.49v-0.03z m-30.44 96.64c0 2.26-0.64 5.55-3.55 8.5a11.785 11.785 0 0 1-8.5 3.5H782.78v-78.15h116.71c2.27 0 5.59 0.6 8.54 3.5 2.27 2.24 3.53 5.31 3.5 8.5v54.15z m0 0" p-id="9014" fill="#591804"></path></svg></div> <div data-type="MENU" id="hld__jump_menu"><svg t="1687167394269" class="icon" viewBox="0 0 #### ####" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5137" width="48" height="48"><path d="M708.367 353.656c0-56.745-22.729-110.092-63.###-150.218s-96.132-62.224-154.494-62.224-113.229 22.099-154.498 62.224-63.### 93.473-63.### 150.218c0 43.987 13.713 86.196 39.651 122.064 7.273 10.060 21.559 12.479 31.904 5.406 10.343-7.073 12.834-20.963 5.561-31.019-20.486-28.329-31.315-61.684-31.315-96.451 0-92.585 77.471-167.911 172.694-167.911s172.689 75.325 172.689 167.911-77.471 167.906-172.694 167.906c-47.055 0-92.711 8.965-135.702 26.646-41.516 17.076-78.796 41.509-110.806 72.632-32.007 31.123-57.142 67.371-74.705 107.736-18.181 41.808-27.401 86.199-27.401 131.948 0 12.298 10.252 22.266 22.898 22.266s22.898-9.968 22.898-22.266c0-162.35 135.843-294.425 302.816-294.425 58.361 0 113.229-22.099 154.497-62.22s63.###-93.477 63.###-150.221zM530.991 631.551c0 12.298 10.252 22.266 22.898 22.266h304.337c12.647 0 22.898-9.968 22.898-22.266s-10.252-22.266-22.898-22.266h-304.337c-12.647 0-22.898 9.968-22.898 22.266zM858.229 722.671h-304.337c-12.65 0-22.898 9.968-22.898 22.266s10.252 22.266 22.898 22.266h304.337c12.647 0 22.898-9.968 22.898-22.266 0-12.294-10.252-22.266-22.898-22.266zM858.229 836.056h-304.337c-12.65 0-22.898 9.967-22.898 22.266s10.252 22.266 22.898 22.266h304.337c12.647 0 22.898-9.968 22.898-22.266 0-12.294-10.252-22.266-22.898-22.266z" fill="#591804" p-id="5138"></path></svg></div> <div data-type="REPLY" id="hld__jump_reply"><svg t="1687169791224" class="icon" viewBox="0 0 1025 ####" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8570" width="48" height="48"><path d="M415.937331 320 415.937331 96 20.001331 438.176C-6.718669 461.28-6.622669 498.784 20.033331 521.824L415.937331 864 415.937331 640C639.937331 640 847.937331 688 1023.937331 928 943.937331 480 607.937331 320 415.937331 320" p-id="8571" fill="#591804"></path></svg></div> <div data-type="BOTTOM" id="hld__jump_bottom"><svg t="1603962680160" title="跳转至最后一页" class="icon" viewBox="0 0 #### ####" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7501" width="64" height="64"><path d="M792.855 465.806c-6.24-6.208-14.369-9.312-22.56-9.312s-16.447 3.169-22.688 9.44l-207.91 207.74v-565.28c0-17.697-14.336-32-32-32s-32.002 14.303-32.002 32v563.712l-206.24-206.164c-6.271-6.209-14.432-9.344-22.624-9.344-8.224 0-16.417 3.135-22.656 9.407-12.511 12.513-12.48 32.768 0.032 45.248L483.536 770.38c3.265 3.263 7.104 5.6 11.136 7.135 4 1.793 8.352 2.88 13.024 2.88 1.12 0 2.08-0.544 3.2-0.64 8.288 0.064 16.608-3.009 22.976-9.408l259.11-259.292c12.48-12.511 12.448-32.8-0.127-45.248z m99.706 409.725c0 17.665-14.303 32.001-31.999 32.001h-704c-17.665 0-32-14.334-32-31.999s14.335-32 32-32h704c17.696 0 32 14.334 32 31.998z" p-id="7502" fill="#591804"></path></svg></div> </div> </div> `) $('#h-tool').remove() $('body').append($dockerDom) /** * Bind:Click * 按钮点击事件 */ $('body').on('click', '.hld__docker-btns>div', function (e) { const type = $(this).data('type') if (type == 'TOP') { $('html, body').animate({ scrollTop: 0 }, 500) } if (type == 'MENU') { $('#hld__setting_cover').css('display', 'block') $('html, body').animate({ scrollTop: 0 }, 500) } if (type == 'REPLY') { if (script.isForms()) { window.location.href = $('.uk-pagination a:contains("上一页")').attr('href'); } } if (type == 'BOTTOM') { window.location.href = "#h-footer" } }) }, renderAlwaysFunc(script) { (script.isForms()) ? $('.hld__docker').show() : $('.hld__docker').hide() $('#hld__jump_favor').toggle(script.isForms()) $('#hld__jump_reply').toggle(script.isForms()) }, /** * 获取URL参数对象 * @method getQuerySet * @return {Object} 参数对象 */ getQuerySet() { let queryList = {} let url = decodeURI(window.location.search.replace(/&/g, "&")) url.startsWith('?') && (url = url.substring(1)) url.split('&').forEach(item => { let t = item.split('=') if (t[0] && t[1]) { queryList[t[0]] = t[1] } }) return queryList }, style: ` .hld__docker{position:fixed;height:80px;width:30px;bottom:180px;right:0;transition:all ease .2s} .hld__docker:hover{width:150px;height:300px;bottom:75px} .hld__docker-sidebar{background:#fff;position:fixed;height:50px;width:20px;bottom:195px;right:0;display:flex;justify-content:center;align-items:center;background:#fff;border:1px solid #CCC;box-shadow:0 0 1px #333;border-right:none;border-radius:5px 0 0 5px} .hld__excel-body .hld__docker-sidebar{background:#fff;border:1px solid #bbb} .hld__docker-btns{position:absolute;top:0;left:50px;bottom:0;right:50px;display:flex;justify-content:center;align-items:center;flex-direction:column} .hld__docker .hld__docker-btns>div{opacity:0;flex-shrink: 0;} .hld__docker:hover .hld__docker-btns>div{opacity:1} .hld__docker-btns>div{background:#fff;border:1px solid #CCC;box-shadow:0 0 1px #444;width:50px;height:50px;border-radius:50%;margin:10px 0;cursor:pointer;display:flex;justify-content:center;align-items:center} .hld__excel-body .hld__docker-btns>div{background:#fff;border:1px solid #bbb} .hld__docker-btns svg{width:30px;height:30px;transition:all ease .2s} .hld__docker-btns svg:hover{width:40px;height:40px} .hld__excel-body .hld__docker-sidebar{background:#fff;border:1px solid #bbb} .hld__excel-body .hld__docker-btns>div{background:#fff;border:1px solid #bbb} ` } /** * 引用串优化模块 * @name QuoteChuan * @description 此模块可以减少引用串的请求次数 * 优化样式与二次查看时的等待时间 * */ const QuoteChuan = { name: 'QuoteChuan', title: '引用串优化', setting: { type: 'normal', key: 'QuoteChuan', default: true, title: '引用串优化', menu: 'right' }, renderFormsFunc($el) { //console.log('启用引用串优化', script.setting.normal.QuoteChuan) if (script.setting.normal.QuoteChuan) { //console.log('引用串优化执行', script.setting.normal.QuoteChuan) // 重写4.绿色引用串显示、修改slideUpDown、缓存数据避免重复请求 // 话说不要用color=#789922发串啊! const cache = {}; var removedHtmls = $('font[color="#789922"]').map(function () { return this.outerHTML; }).get(); $('font[color="#789922"]').each(function (index) { var prevSibling = $(this).prev(); if (prevSibling.length > 0) { prevSibling.after(removedHtmls[index]); } else { $(this).parent().prepend(removedHtmls[index]); } $(this).remove(); }); $(document).on('mouseenter', 'font[color="#789922"]', function () { const $this = $(this); const tid = $this.text().match(/\d+/)[0]; fetchData(tid, $this); }); function fetchData(tid, $this) { if (cache[tid]) { showRefView(cache[tid], $this); } else { $this.css('cursor', 'progress'); $.get(`/Home/Forum/ref?id=${tid}`).done(function (data) { if (typeof data == "string") { if (data.startsWith('<div class="h-threads-item">')) { cache[tid] = data; data = data; } else { data = `<div class="h-threads-item">Error:服务器返回错误.</div>`; } } else if (typeof data == "object") { data = `<div class="h-threads-item">${data.info}</div>`; } else { data = `<div class="h-threads-item">Error:服务器返回错误.</div>`; } showRefView(data, $this); }); } } function showRefView(data, $this) { const $refView = $("#h-ref-view").off().html(data).css({ top: $this.offset().top, left: $this.offset().left }); $refView.ready().addClass("QuoteChuan").slideDown(200); setTimeout(() => { $refView.one('mouseleave', function () { $(this).slideUp(200); $("#h-ref-view").removeAttr('QuoteChuan-state'); }); }, 500); } } }, asyncStyle() { if (script.setting.normal.QuoteChuan) { return ` ._xd_beautyCss .QuoteChuan .h-threads-item .h-threads-item-ref {margin: 0!important;padding: 0!important;} ._xd_beautyCss .QuoteChuan .h-threads-item .h-threads-item-reply .h-threads-item-reply-main{display:flex;margin: 0;padding: 20px 0 0 0;} ._xd_beautyCss .QuoteChuan .h-threads-item .h-threads-item-reply .h-threads-item-reply-main .h-threads-img-box{display: block;width: 200px;border-radius: 10px;max-width: 220px;background: #ccc;margin: 10px 10px 0 0;} ._xd_beautyCss .QuoteChuan .h-threads-item .h-threads-item-reply .h-threads-item-reply-main .h-threads-img-box img{width: 100%;min-width: 100px;max-height: 300px;overflow: hidden;} ._xd_beautyCss .QuoteChuan .h-threads-item .h-threads-item-reply .h-threads-item-reply-main .h-threads-info{position: absolute;top: 0px;margin: 0;padding: 0;} ._xd_beautyCss .QuoteChuan .h-threads-item .h-threads-item-reply .h-threads-item-reply-main .h-threads-info .h-threads-info-createdat{display:none} ._xd_beautyCss .QuoteChuan .h-threads-item .h-threads-item-reply .h-threads-item-reply-main .h-threads-content{margin: 10px 0;font-size: small;min-width: 260px;} ._xd_beautyCss .QuoteChuan .h-threads-item .h-threads-item-reply .h-threads-item-reply-main .h-threads-tips{display: none;} ` } } } /** * 初始化脚本 */ const script = new XDBBSScript() /** * 添加模块 */ script.addModule(SettingPanel) //设置模块 script.addModule(HDImage) //高清图片模块 script.addModule(PageCss) //页面美化模块 script.addModule(ExtraDocker) //扩展坞模块 script.addModule(LinkBlank) //串串页新页面打开模块 script.addModule(AutoPage) //自动翻页模块 script.addModule(HideImage) //隐藏图片 script.addModule(QuoteChuan) //引用串优化 script.addModule(FoldChuan) //回应串折叠 /** * 运行脚本 */ script.run() })();