// ==UserScript== // @name MCBBS Extender // @namespace https://i.zapic.cc // @version release-1.4.4 // @description MCBBS行为拓展/样式修复 // @author Zapic // @match https://*.mcbbs.net/* // @run-at document-body // @downloadURL none // ==/UserScript== (() => { // jQuery检查 if (typeof jQuery == "undefined") { console.error("This page does NOT contain JQuery,MCBBS Extender will not work."); return false; } //在手机页面主动禁用 if(document.getElementsByTagName('meta').viewport){ console.log("MCBBS Extender not fully compatible with Moblie page,exit manually"); return false; } // 基本信息初始化 let version = "v1.4.4"; let vercode = 111444; let updatelist = [ '1.优化 在关闭顶栏固定功能后强制卸除论坛自带的固定顶栏功能' ]; let configableList = [ { "id": "fixCodeBlock", "default": true, "type": "check", "name": "美化代码块样式", "desc": "修正代码块的一些样式,如滚动条." }, { "id": "fixCodeCopy", "default": true, "type": "check", "name": "\"复制代码\"修复", "desc": "修复复制代码时换行全部消失的问题." }, { "id": "fixTableLayout", "default": true, "type": "check", "name": "修复表格样式", "desc": "使用快捷键Ctrl+Shift+F快速修复当前页面表格样式." }, { "id": "queryMessage", "default": true, "type": "check", "name": "后台轮询消息", "desc": "在后台自动查询是否有新的消息并推送,需保证至少打开一个页面.注意,过低的值可能会导致你被论坛屏蔽,超过200的值可能会导致消息反复推送." }, { "id": "queryMessageInterval", "default": 60, "type": "num", "name": "后台轮询消息间隔", "desc": "两次轮询消息之间的间隔,单位秒." }, { "id": "rememberPage", "default": true, "type": "check", "name": "板块内翻页记忆", "desc": "点击板块内下一页按钮时记忆当前页." }, { "id": "animateGoToTopButton", "default": true, "name": "回到顶部按钮美化", "type": "check", "desc": "为右侧回到顶部按钮增加动画以及位置修正." }, { "id": "pinnedTopBar", "default": true, "name": "固定顶栏", "type": "check", "desc": "将顶栏固定到页面顶部,不随页面滚动." }, { "id": "fixTopBarPopMenu", "default": true, "type": "check", "name": "弹出菜单美化", "desc": "美化弹出菜单的样式,如个人信息菜单." }, { "id": "hoverableMedal", "default": true, "name": "玻璃质感勋章", "type": "check", "desc": "亮闪闪的勋章~" }, { "id": "viewWarns", "default": true, "name": "查看警告记录", "type": "check", "desc": "为每一层楼和每一个个人主页(除自己)添加查看警告记录按钮" }, { "id": "removeLinkWarn", "default": true, "name": "移除外链警告", "type": "check", "desc": "去除论坛跳转外链时的警告页面." },{ "id": "useIgInQuickReply", "default": true, "name": "快速回复使用个人签名", "type": "check", "desc": "在页脚快速回复帖子时使用个人签名." }, { "id": "fixImgZoom", "default": true, "name": "优化图片缩放", "type": "check", "desc": "使用更现代的方法实现图片缩放." }, { "id": "disableAutoplay", "default": false, "name": "禁止BGM自动播放", "type": "check", "desc": "阻止页内BGM自动播放." },{ "id": "maxMedalLine", "default": -1, "type": "num", "name": "最大勋章行数", "desc": "限制楼层勋章的最大行数,提升鼠标滚轮寿命,设置为-1以禁用此功能." }, { "id": "quickAtList", "default": "", "name": "快速 @ 列表", "type": "text", "desc": "按下Ctrl+Shift+A/或者按钮以快速在当前输入框内插入预定义的@用户名代码.用户名之间用\",\"(半角逗号)分隔." }, { "id": "miscFix", "default": "", "name": "杂项修复", "type": "text", "desc": "此值用于规定杂项修复的行为,默认值为空,修改为00000以关闭全部.错误的值会使该项失效.详情请查阅源码." }, { "id": "myReportReason", "default": "", "name": "自定义举报理由", "type": "textarea", "desc": "在举报时提供自定义的举报理由,一行一个理由." }, { "id": "myCSS", "default": "", "name": "自定义CSS", "type": "textarea", "desc": "在框内的CSS会被加载到页面内,可自由发挥." }, { "id": "myLinks", "default": "", "name": "自定义工具菜单链接", "type": "textarea", "desc": "在右上角\"工具\"菜单里添加自定义的链接,以\"[名称] [链接]\"的格式添加(如\"个人主页 home.php\"),一行一个." }]; //夹带私货 console.log(" %c Zapic's Homepage %c https://i.zapic.cc ", "color: #ffffff; background: #E91E63; padding:5px;", "background: #000; padding:5px; color:#ffffff"); //初始化jQuery和基本封装方法 let $ = jQuery; let dlg = (m) => { console.debug("[MCBBS Extender]" + m); }; let getRequest = (variable,url = "") => { let query = url ? /\?(.*)/.exec(url)[1] : window.location.search.substring(1); let vars = query.split("&"); for (let i = 0; i < vars.length; i++) { let pair = vars[i].split("="); if (pair[0] == variable) { return pair[1]; } } return (false); } //内建静态资源 let staticRes = { "atBtnImage" : "data:image/png;base64,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", "medalReflectImage" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAA3CAYAAACGnvPUAAAAAXNSR0IArs4c6QAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAA1UlEQVRYw+3Qy6rBARRGcQcjl1zCG5AkkY48gUiEMHU/7/8GS/vUHoqif1/ZgzX/tVLAn0qpwAQmMIH5NsxECWM1gYMKxsoBUxWM1wKOKhgrD8xUMF47yUvPMFYBmKtgvA5wUsFYRWChgrF+gC5wVsB4JWCpgvFLvU9dehfjlYGVCsYv9YGLAsarAGsVjJUGBsBVAeNVgY0Kxi8NX7mUBMarAVsVjF/6fXQpaYxXB3YqGCsDjICbAsZrAHsVjJUFxiqY/wITmMAEJjCBCUxgAhOYb8PcAbo5rkGPsZmjAAAAAElFTkSuQmCC" }; //配置数据迁移函数 let transferConfig = ()=>{ let tempconf = null; try{ tempconf = JSON.parse(getcookie("MExt_config")); if(typeof tempconf.version == "undefined"){return false;}else{ localStorage.setItem("MExt_config", JSON.stringify(tempconf)); setcookie("MExt_config","",0); } }catch(e){ return false; } } //配置初始化函数 let initConfig = () => { $(configableList).each((i, v) => { conf[v.id] = typeof conf[v.id] == "undefined" ? v.default : conf[v.id]; }); localStorage.setItem("MExt_config", JSON.stringify(conf)); } let conf = ''; try { transferConfig(); conf = JSON.parse(localStorage.getItem("MExt_config")); } catch (e) { dlg("Failed to load config\n" + e); } if (!conf) { conf = {}; conf.version = vercode; initConfig(); showDialog("欢迎使用MCBBS Extender.
本脚本的设置按钮已经放进入了您的个人信息菜单里,如需调整设置请在个人信息菜单里查看.", "right", "欢迎", () => { showMenu('user_info'); $("#MExt_config").css("background-color", "#E91E63").css("color", "#fff"); setTimeout(() => { hideMenu('user_info_menu'); $("#MExt_config").css("background-color", "").css("color", ""); }, 3000); }); dlg("Config init."); } if (typeof conf.version == "undefined" || conf.version < vercode) { let updateContent = ''; $(updatelist).each((i, v) => { updateContent += "
" + v; }); showDialog("MCBBS Extender 已经更新至 " + version + "" + updateContent, "right"); conf.version = vercode; initConfig(); } $(() => { // 设置界面初始化 $("#user_info_menu .user_info_menu_btn").append("
  • MCBBS Extender 设置
  • "); dlg("Appended Config button"); $("head").append(''); dlg("Appended Config window style"); $("#MExt_config").on("click", () => { let confwinContent = '
    '; $(configableList).each((i, v) => { let inputType = ''; switch (v.type) { case "check": inputType = ''; break; case "num": inputType = ''; break; case "text": inputType = ''; break; case "textarea": inputType = ''; break; default: inputType = ''; break; } confwinContent += '

    ' + v.name + '
    ' + v.desc + '' + inputType + '

    '; }); confwinContent += '
    '; showDialog( confwinContent, "confirm", "MCBBS Extender 设置", () => { $(configableList).each((i, v) => { let val = ''; if (v.type == "num" || v.type == "text" || v.type == "textarea") { val = $("#in_" + v.id).val(); } else { val = $("#in_" + v.id).prop("checked"); } conf[v.id] = val; }); initConfig(); setTimeout(() => { showDialog("设置已保存,刷新生效", "right"); }); }, true, () => {}, "MCBBS Extender " + version + " - 世予可爱w" ); $(configableList).each((i, v) => { if (v.type == "num" || v.type == "text" || v.type == "textarea") { $("#in_" + v.id).val(conf[v.id]); } else { $("#in_" + v.id).prop("checked", conf[v.id]); } }); dlg("Config cookie loaded."); }); dlg("Config button event attached."); // 钩住DiscuzAjax函数,使其触发全局事件 let __ajaxpost = ajaxpost; ajaxpost = (formid, showid, waitid, showidclass, submitbtn, recall) => { let relfunc = () => { if (typeof recall == 'function') { recall(); } else { eval(recall); } $(this).trigger('DiscuzAjaxPostFinished'); } __ajaxpost(formid, showid, waitid, showidclass, submitbtn, relfunc); } let __ajaxget = ajaxget; ajaxget = (url, showid, waitid, loading, display, recall) => { let relfunc = () => { if (typeof recall == 'function') { recall(); } else { eval(recall); } $(this).trigger('DiscuzAjaxGetFinished'); } __ajaxget(url, showid, waitid, loading, display, relfunc); } dlg("Hooked into Discuz Ajax event"); }); if (conf.fixCodeBlock) { // 代码块美化样式 $("head").append(""); dlg("Code block fix style appended."); } if (conf.fixTableLayout) { MExt_Func_fixTable = () => { // 添加修复样式 $("head").append(""); dlg("Table style fixed."); } // 监听快捷键事件 $(document).on("keydown", (e) => { if (e.shiftKey && e.ctrlKey &&e.keyCode == 70 && $("#fixTableLayout").length == 0) { dlg("Table layout fix actived"); showDialog("是否尝试修复此页表格?", "confirm", "MCBBS Extender", () => { MExt_Func_fixTable(); }) } }); dlg("Table layout fix event attached."); } if (conf.fixCodeCopy) { // 重写copycode函数,手动添加换行 copycode = (obj) => { if (!obj) { dlg("Code copy with invalid object."); return false; } let code = ''; $(obj).find("li").each((i, v) => { code += v.innerText + "\r\n"; }); // 复制代码 setCopy(code, '代码已复制到剪贴板'); dlg("Code copied."); }; dlg("Code copy fix actived."); } // 消息轮询 if (conf.queryMessage) { // 检查消息函数 let checkNotifica = (noNotifica = false) => { $.get("/forum.php?mod=misc",(d)=>{ dlg("Checking message..."); // 设置最后通知时间为当前时间,以防止反复推送 localStorage.setItem('notifica-time', new Date().getTime()); let dom = $(d); // 获得顶栏图标类 let noticlass = dom.find("#myprompt").attr("class"); // 获得通知菜单元素 let notimenu = dom.filter("#myprompt_menu"); // 将顶栏图标类写入当前页 $("#myprompt").attr("class",noticlass); // 将通知菜单写入当前页 $("#myprompt_menu").html(notimenu.html()); // 获得消息内容,用作缓存 let noticontent = notimenu.text(); // 判断是否应该发送消息 if(!noNotifica && localStorage.getItem("MExt_ActiveQueryId") == queryId && localStorage.getItem("MExt_LastNoticeContent") != noticontent){ // 获得通知脚本(暴力) let scp = dom.filter("script[src*=html5notification]").nextUntil("div").last().text(); // 将最后通知时间设置为1,强行启用通知 localStorage.setItem('notifica-time', 1); // 执行通知脚本 eval(scp); dlg("Notifica sent"); // 写入消息缓存 localStorage.setItem("MExt_LastNoticeContent",noticontent); } }); } // 刷新消息缓存 let flushContent = ()=>{ $.get("/forum.php?mod=misc",(d)=>{ let dom = $(d); let noticontent = dom.filter("#myprompt_menu").text(); // 写入消息缓存 localStorage.setItem("MExt_LastNoticeContent",noticontent); }); } // 生成queryID,用于页面间的互斥 let queryId = hash(new Date().getTime().toLocaleString(), 16); // 判断是否在消息页面||最后通知时间是否超过200秒 if ((location.pathname == "/home.php" && (getRequest('do') == "pm" || getRequest('do') == "notice")) || new Date().getTime() - localStorage.getItem("notifica-time") > 200000) { flushContent(); } else { checkNotifica(); } dlg("Query id is " + queryId + ".") // 运行定时器,用于检查其他页面是否在运行 setInterval(() => { if (localStorage.getItem("MExt_LastQuery") == "") { localStorage.setItem("MExt_LastQuery", 0); } let nowtime = Math.floor(new Date().getTime() / 1000); if ((localStorage.getItem("MExt_ActiveQueryId") == "" || nowtime - localStorage.getItem("MExt_LastQuery") > 5) && localStorage.getItem("MExt_ActiveQueryId") != queryId) { localStorage.setItem("MExt_ActiveQueryId", queryId); checkNotifica(); dlg("Kick off inactive querier,start query."); } if (localStorage.getItem("MExt_ActiveQueryId") == queryId) { localStorage.setItem("MExt_LastQuery", nowtime); } }, 1000); dlg("Running checker actived."); // 判断是否有HTML5Notification if (!window.Html5notification) { $.getScript("data/cache/html5notification.js?xm6"); dlg("Html5notification added."); } // 定时运行检查函数 let msgChecker = setInterval(checkNotifica,conf.queryMessageInterval * 1000); dlg("Message querier actived."); } if (conf.rememberPage) { // 记住当前页 $(() => { let npbtn = $("#autopbn"); if(npbtn.length){ // 绑定事件 let orgfunc = npbtn[0].onclick; npbtn[0].onclick = null; npbtn.on("click",()=>{ if(npbtn.html() == "正在加载, 请稍后..."){return false;} let nextpageurl = npbtn.attr('rel'); let curpage = parseInt(npbtn.attr('curpage')); npbtn.attr('curpage', curpage + 1); nextpageurl = nextpageurl.replace(/&page=\d+/, '&page=' + (curpage + 1)); $("#threadlisttableid").append("") //history.replaceState(null, null, nextpageurl); orgfunc(); }); $("#separatorline").after(""); let timer = -1; $(window).on("scroll",()=>{ clearTimeout(timer); timer = setTimeout(()=>{ let scroll = document.scrollingElement.scrollTop - window.innerHeight/2; let url = null; document.querySelectorAll(".mext_rempage").forEach((v,i)=>{ let vtop = v.offsetTop; if(vtop < scroll || i == 0){ url = v.rel; } }); if(url){ history.replaceState(null, null, url); } },250); }); } dlg("Page remember actived."); }); } if (conf.animateGoToTopButton) { // 添加侧边按钮样式 $("head").append(""); dlg("Animate go to top buttom style appended."); // 重写showTopLink函数,使其使用侧边栏样式 showTopLink = () => { let ft = $('#ft')[0]; if (ft) { let scrolltop = $('#scrolltop')[0]; if (!scrolltop) { return false; } let scrolltopbtn = $(".scrolltopa"); let scrollHeight = parseInt(document.body.getBoundingClientRect().top); let basew = parseInt(ft.clientWidth); let sw = scrolltop.clientWidth; if (basew < 1000) { let left = parseInt(fetchOffset(ft)['left']); left = left < sw ? left * 2 - sw : left; scrolltop.style.left = (basew + left + 44) + 'px'; } else { scrolltop.style.left = 'auto'; scrolltop.style.right = 0; } if (scrollHeight < -100) { scrolltopbtn.addClass("scrolltopashow"); } else { scrolltopbtn.removeClass("scrolltopashow"); } } } showTopLink(); dlg("Animate go to top buttom actived."); } if (conf.pinnedTopBar) { // 添加固定顶栏样式 $("head").append(""); $(() => { // 重写editorcontrolpos函数,与固定顶栏兼容 editorcontrolpos = () => { if (editorisfull) { return; } let scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop); if (scrollTop + 47 > editorcontroltop && editorcurrentheight > editorminheight) { $("#" + editorid + '_controls').prop("style", "z-index:0!important").css("position", 'fixed').css("top", '47px').css("width", editorcontrolwidth + 'px'); $("#" + editorid + '_controls_mask').css("display", ''); } else { $("#" + editorid + '_controls').css("position", '').css('top', '').css('width', ''); $("#" + editorid + '_controls_mask').css('display', 'none'); } }; //增加一个5px的遮罩,防止鼠标经过空隙时碰到底层内容 $("#toptb").after('
    '); }); dlg("Pinned top bar style appended."); } else { $("head").append(``); dlg("Restored topbar."); } if (conf.fixTopBarPopMenu) { // 添加弹出菜单美化样式 $("head").append(""); dlg("Pop menu fix style appended."); // 重写extstyle函数,使更换主题时同步更新样式 let __extstyle = extstyle; let checkStyle = () => { let theme = getcookie('extstyle'); if (theme == "./template/mcbbs/style/winter") { if (!$("#fixTopBarPopMenuWinter").length) { $("head").append(""); } } else { $("#fixTopBarPopMenuWinter").remove(); } } extstyle = (style) => { __extstyle(style); checkStyle(); } checkStyle(); dlg("Overwrite extstyle function"); } if (conf.hoverableMedal) { // 重写勋章结构函数 let rewriteMedal = () => { // 遍历所有未重写楼层 $('.md_ctrl:not([glassmedal])').attr("glassmedal", "true").each((t, v) => { // 遍历楼层所有勋章 $(v).children(0).children('img').each((b, n) => { // 获得勋章ID let id = 'md' + /\_\d*$/.exec($(n).attr('id'))[0]; // 重写勋章结构 $(v).append( $('
    ').on('mouseover', () => { showMenu({ 'ctrlid': $(n).attr('id'), 'menuid': id + '_menu', 'pos': '12!' }); }) ); // 重写提示样式 $("#" + id + "_menu .tip_horn").css("background-image", "url(" + $(n).attr('src') + ")"); // 移除旧的勋章 $(n).remove(); }); }); dlg("Hoverable medal rewrote."); }; //调用重写勋章函数 $(rewriteMedal); // 在Ajax时重新调用Ajax函数,保存勋章样式 $(this).on("DiscuzAjaxGetFinished DiscuzAjaxPostFinished", rewriteMedal); // 添加勋章样式 $("head").append(""); dlg("Hoverable medal style appended."); } if (conf.quickAtList) { $("head").append(""); // 获得At代码函数 let getAtCode = () => { // 分隔list let quickAtList = conf.quickAtList.split(","); let atstr = ""; //拼接@代码 $(quickAtList).each((i, v) => { atstr += "@" + v + " "; }); return atstr; } // 将函数暴露到全局 MExt_Func_getAtCode = getAtCode; // 监听按键事件 $(document).on("keydown", (e) => { if (e.shiftKey && e.ctrlKey && e.keyCode == 65) { // 判断是否在输入框内 if (($(document.activeElement).prop("nodeName") == "INPUT" && $(document.activeElement).prop("type") == "text")) { // 拼接方法插入 $(document.activeElement).val($(document.activeElement).val() + getAtCode()); dlg("@ string added"); } else if ($(document.activeElement).prop("nodeName") == "TEXTAREA") { // discuz内建函数插入 seditor_insertunit('fastpost',getAtCode(), ''); dlg("@ string added"); } } }); // 高级编辑模式插入@代码 $(() => { if ($("#e_iframe").length) { // 由于高级模式的输入框是iFrame,无法直接监听,故再次监听高级输入框的按键事件 $($("#e_iframe")[0].contentWindow).on("keydown", (e) => { if (e.shiftKey && e.ctrlKey && e.keyCode == 65) { // 判断是否在输入框内 if ($(document.activeElement).prop("nodeName") == "IFRAME") { //discuz内建函数插入 insertText(getAtCode()); dlg("@ string added"); } } }); } }); let hookReplyBtn = ()=> { // 添加按钮 $("div.pob.cl a.fastre:not([qa-hooked])").on("click",()=>{ // 等待窗口出现(暴力) let waitWindow = setInterval(()=>{ if(!$("#fwin_reply .tedt .bar:not([qa-added])").attr("qa-added",true).length){ return false; } clearInterval(waitWindow); // 添加按钮 $("#postat.fat").after('快速@ '); },500); }).attr("qa-hooked",true); // 为已经钩住的按钮添加标记 dlg("Reply bottons hooked(QuickAt)."); } $(this).on("DiscuzAjaxGetFinished DiscuzAjaxPostFinished", hookReplyBtn); $(() => { $("#fastpostat").after('快速@ '); $("#e_adv_s1").append('快速@'); hookReplyBtn(); }); } if (conf.viewWarns) { // 添加查看警告样式 $("head").append(""); // 添加查看警告按钮函数 let addVWLink = () => { $(".plhin").each((i, v) => { let href = $(v).find(".authi .xw1").attr("href"); if (!href) { return false; } let uid = /uid=(\d*)/.exec(href)[1]; $(v).find("ul.xl.xl2.o.cl:not([vw_added*=true])").attr("vw_added", "true").append($('
  • 查看警告记录
  • ')); }); dlg("In-posts view warns link added"); } // 在DiscuzAjax时重新调用添加函数,防止失效 $(this).on("DiscuzAjaxGetFinished", addVWLink).on("DiscuzAjaxPostFinished", addVWLink); dlg("adddVWLink Ajax Event attached."); $(() => { // 添加查看警告按钮 addVWLink(); // 用户信息界面添加查看警告按钮 let href = $("#uhd .cl a").attr("href"); if (!href) { return false; } let uid = /uid=(\d*)/.exec(href)[1]; if (!uid) { return false; } $("#uhd .mn ul").append('
  • 查看警告记录
  • '); dlg("Home page view warns link added.") }); } // 自定义举报内容 if(conf.myReportReason){ // 获得举报内容列表函数 let getReasons = () => { // 分隔list let reportReason = conf.myReportReason.split("\n"); let rrstr = ""; //拼接HTML $(reportReason).each((i, v) => { rrstr += '
    '; }); return rrstr; } // 举报按钮钩子函数 let hookReportBtn = ()=> { let reportContent = getReasons(); $("div.pob.cl a[onclick*=\"miscreport\"]:not([report-added])").on("click",()=>{ // 等待窗口出现(暴力) let waitWindow = setInterval(()=>{ if(!$("[action*=report]").length){ return false; } clearInterval(waitWindow); // 添加自定义内容 $("#report_reasons").prepend(reportContent)},500) }).attr("report-added",true); // 为已经钩住的按钮添加标记 dlg("Report bottons hooked."); } $(hookReportBtn); $(this).on("DiscuzAjaxGetFinished DiscuzAjaxPostFinished", hookReportBtn); } // 移除外链警告延时,直接跳转目标页 if(conf.removeLinkWarn){ if(location.pathname == "/plugin.php" && getRequest('id') == "link_redirect"){ let url = getRequest('target'); if(url){ // 跳就完事了 location.href = decodeURIComponent(url); } } } if(conf.useIgInQuickReply){ // 快速回复框使用个人签名 let hookReplyBtn = ()=> { // 添加选项 $("div.pob.cl a.fastre:not([ig-hooked])").on("click",()=>{ // 等待窗口出现(暴力) let waitWindow = setInterval(()=>{ if(!$("#fwin_reply #moreconf:not([ig-added])").attr("ig-added",true).length){ return false; } clearInterval(waitWindow); // 添加选项 $("#fwin_reply #postsubmit").after(''); },500); }).attr("ig-hooked",true); // 为已经钩住的按钮添加标记 dlg("Report bottons hooked."); } $(()=>{ // 底部快速回复增加选项 $("#fastpostsubmit").after(''); hookReplyBtn(); }); $(this).on("DiscuzAjaxGetFinished DiscuzAjaxPostFinished", hookReplyBtn); } // 故意把这个功能搞玄乎,纯粹是好玩,其实还是非常简单的. // 这里包含一些对体验影响不大又非常杂的修复选项,不适合单独开一个选项,显得很臃肿. // 配置里的这一串数字代表每一个功能的开关情况,比如第一位数字为1时代表第一个功能开启,第二位为0时,代表第二个功能关闭. if(/^[01]*$/.exec(conf.miscFix)){ let fixconf = conf.miscFix.split(""); let fixlist = [ // 暗牧悬浮预览 {"style":".t_f font[style*=\"background-color:black\"], .t_f font[style*=\"background-color:#000\"] {transition-duration: .3s;transition-delay: .5s;cursor: default;}.t_f font[style*=\"background-color:black\"]:hover, .t_f font[style*=\"background-color:#000\"]:hover {transition-delay: 0s;background-color: transparent!important;}"}, //增加空方法,用于修复论坛的一个报错. {"script":"announcement = () => {};"}, //修复页脚问题 {"style":".mc_map_wp{min-height:calc(100vh - 202px)!important;}"}, //修复用户组页面不对齐的问题 {"style":".tdats .tb{margin-top:0px}"}, // 修复编辑器@超级加倍的问题 {"script":"$(()=>{if(typeof setEditorEvents != \"undefined\"){let __setEditorEvents = setEditorEvents;setEditorEvents= ()=>{ __setEditorEvents();setEditorEvents=()=>{};}}})"}, // 允许改变个人签名编辑框大小 {"style":"#sightmlmessage{resize:vertical;}"}, // 修复切换主题按钮失效的问题 {"script":`$(()=>{$("span.sslct_btn[title*=默认]").attr("onclick","extstyle('./template/mcbbs/style/winter')")})`}, // 按住shift点击带有超链接的图片则不打开链接 {"script": `$(()=>{$("img.zoom").parent().each((i,v)=>{if(v.nodeName=="A"){$(v).on("click",(e)=>{console.log(e);if(e.shiftKey){e.preventDefault();}})}})})`}, // 修复某些页面书框被撕裂的问题 {"script":"$(()=>{if(!$('.mc_map_wp .mc_map_border_foot').length){$('.mc_map_border_foot').remove();$('.mc_map_wp').append('
    ')}})"}, // 默认使用高清头像 {"script":"$(()=>{$('.avtm img').each((i,v)=>{v.src=v.src.replace('middle','big')});})"} ]; let styleContent = ""; $(fixlist).each((i,v)=>{ if(typeof fixconf[i] == "undefined"){fixconf[i] = "1"} if(fixconf[i] === "1"){ // 拼接样式字符串 styleContent += fixlist[i].style ? fixlist[i].style : ""; // 执行脚本 eval(fixlist[i].script ? fixlist[i].script : ""); } }); // 添加修复样式 $("head").append("") } if(conf.fixImgZoom){ dlg("Zoom style append"); $("head").append(``); dlg("FixImgZoom style appended."); let __zoom = zoom; let t = 0; // 初始化基本缩放信息对象 let img = {width:0,height:0,top:0,left:0,radio:1,scale:1,orgwidth:0}; // 缩放函数 let resize = (width)=>{ dlg("Image resizing...") clearTimeout(t); // 显示缩放比例 $("#img_scale").html(parseInt(img.scale*100)+"%").css("opacity",1); t = setTimeout(()=>{$("#img_scale").css("opacity",0)},2000); // 计算目标大小和位置 let ow = img.width; img.width = width; ow = (ow - img.width)/-2; img.left -= ow; img.top -= ow*img.radio; // 修改 $("#imgzoom_zoom").css("width",img.width+"px"); $("#imgzoom").css("left",img.left+"px"); $("#imgzoom").css("top",img.top+"px"); } // 保存基本信息 let initP = () => { dlg("Init Picture info"); img.width = parseInt($("#imgzoom_zoom").attr("width")); img.height = parseInt($("#imgzoom_zoom").attr("height")); img.radio = img.height/img.width; img.top = parseInt($("#imgzoom").css("top")); img.left = parseInt($("#imgzoom").css("left")); img.scale = 1; img.orgwidth = img.width; } zoom = (obj,zimg,nocover,pn,showexif)=>{ // 伪装成IE,使原函数的DOMMouseScroll事件监听器以可以被卸除的形式添加 BROWSER.ie = 6; __zoom(obj,zimg,nocover,pn,showexif); // 防止翻车,改回去 setTimeout(()=>{BROWSER.ie = 0;dlg("IE canceled.")},1000); // 等待窗口出现 let wait = setInterval(()=>{ if($("#imgzoom_zoom").length){ dlg("Image found"); clearInterval(wait); // 信息归零,准备下一次保存 img = {width:0,height:0,top:0,left:0,radio:1,scale:1,orgwidth:0}; // 显示遮罩 $("#imgzoom_cover").css("display","unset"); // 判断是否已经监听事件,防止超级加倍 if($("#imgzoom").attr("fixed")=="true"){return true;} // 原始尺寸按钮事件 $("#imgzoom_adjust").on("click",()=>{ dlg("return source size"); $("#imgzoom").css("transition-property","opacity,top,left,transform"); img.width == 0 ? initP(): 0; img.scale = 1; resize($("#imgzoom_zoom").attr("width")); }); // 屏蔽页面滚动 $("#imgzoom_cover").on("mousewheel DOMMouseScroll",(e)=>{ if(e.ctrlKey||e.altKey||e.shiftKey){return true;} e.preventDefault(); }); // 卸除原函数监听器 $("#imgzoom")[0].onmousewheel=null; // 增加显示缩放大小元素并监听事件 $("#imgzoom").append(``).on("mousewheel DOMMouseScroll",(e)=>{ // 判断是否按下功能键 if(e.ctrlKey||e.altKey||e.shiftKey){dlg("Func key pressed.");return true;} // 阻止滚动 e.preventDefault(); // 兼容火狐,正确判断滚轮方向 let scroll = e.originalEvent.wheelDelta ? e.originalEvent.wheelDelta : -e.originalEvent.detail; // 忽略无效滚动 if(scroll == 0 ){return true;} // 判断是否需要初始化 img.width == 0 ? initP() : 0; // 规定需要显示过渡动画的属性 $("#imgzoom").css("transition-property","opacity,top,left,transform"); // 判断是否过小 if(scroll <0 && ((img.width<350&&img.radio<1)||(img.width*img.radio<350&&img.radio>=1))){ // 回弹动画 dlg("Reach min size"); $("#imgzoom").css("transform","scale(0.8)"); setTimeout(()=>{$("#imgzoom").css("transform","scale(1)");},200); return true; } // 修改缩放比例 img.scale += scroll > 0 ? 0.1 : -0.1; // 判断比例是否过小 if(img.scale<0.1){ img.scale= 0.1; // 回弹动画 dlg("Reach min size"); $("#imgzoom").css("transform","scale(0.8)"); setTimeout(()=>{$("#imgzoom").css("transform","scale(1)");},200); return true; } // 缩放 resize(img.orgwidth*img.scale); }).attr("fixed","true"); // 按下鼠标事件 $("#imgzoom").on("mousedown",(e)=>{ // 按下鼠标时移除修改位置的过渡动画,使窗口跟手 dlg("Animate removed"); $("#imgzoom").css("transition-property","opacity"); }); // 释放鼠标事件 $("#imgzoom").on("mouseup",(e)=>{ // 改回去 $("#imgzoom").css("transition-property","opacity,top,left,transform"); // 保存移动后的窗口位置 img.top = parseInt($("#imgzoom").css("top")); img.left = parseInt($("#imgzoom").css("left")); dlg("Animate added,Pos saved"); }); } },50); } dlg("Zoom function rewrote."); } if(conf.myCSS){ // 增加自定义的CSS dlg("DIY CSS Appended"); $("head").append(``); } if(conf.disableAutoplay){ let clearAutoPlay = ()=>{ dlg("Canceling autoplay"); setTimeout(()=>{$("iframe[id*=iframe_mp3]").each((i,v)=>{ // 去掉自动播放属性 v.src=v.src.replace("&auto=1",""); });},1); }; $(document).one("click touchend",clearAutoPlay); $(this).on("DiscuzAjaxGetFinished DiscuzAjaxPostFinished", ()=>{setTimeout(clearAutoPlay,100);$(document).one("click touchend",clearAutoPlay);}); $(clearAutoPlay); } if(conf.myLinks){ // 分割 $(conf.myLinks.split("\n")).each((i,v)=>{ try{ //判断是否合法 if(!v.split(" ")[1]||!v.split(" ")[0]){return true;} // 添加 $("#usertools_menu").append('
  • '+v.split(" ")[0]+'
  • ') }catch(ignore){} }); dlg("My Links added"); } if(conf.maxMedalLine >= 0){ let restrict = ()=>{ // 判断是否在个人主页 if($("#uhd").length>0){$("#restrictMedalLine").remove();return;} // 限制勋章行数 dlg("Restricting line..."); $('.md_ctrl:not([restrictline])').attr("restrictline", "true").append($("展开/收起勋章").on("click",(e)=>{$(e.target).parent().toggleClass("show-all")})).each((i,v)=>{ if((v.childElementCount - 2 <= conf.maxMedalLine * 3 && conf.hoverableMedal) ||( v.firstChild.childElementCount - 2 <= conf.maxMedalLine * 3 && !conf.hoverableMedal)){ v.removeChild(v.lastChild); } }); } let maxheight = conf.maxMedalLine * (conf.hoverableMedal ? 60 : 55) + 45; $(restrict); $(this).on("DiscuzAjaxGetFinished DiscuzAjaxPostFinished", restrict); $("head").append("") dlg("Appended Restrict Medal Line style"); } })();