// ==UserScript== // @name 简法主页功能增强 // @namespace http://tampermonkey.net/ // @version 0.8 // @description 在简法主页上增加其他个性化设置 // @author 那年那兔那些事 // @match https://www.jianfast.com // @icon https://s3.bmp.ovh/imgs/2021/08/2a5feb8f5f886e70.png // @downloadURL none // ==/UserScript== (function() { //存储功能 var store = { set: function(key, val) { if (!val) { return; } try { var json = JSON.stringify(val); if (typeof JSON.parse(json) === "object") { // 验证一下是否为JSON字符串防止保存错误 localStorage.setItem(key, json); } } catch (e) { return false; } }, get: function(key) { if (this.has(key)) { return JSON.parse(localStorage.getItem(key)); } }, has: function(key) { if (localStorage.getItem(key)) { return true; } else { return false; } }, del: function(key) { localStorage.removeItem(key); } }; //settings对象为设置项 var settings = { settingsData: { searchEngine: true, //true:当前标签页打开搜索结果;false:新标签页打开搜索结果 bookMarks: true, //true:当前标签页打开书签网页;false:新标签页打开书签网页 }, //get方法获取settings对象属性 get: function(key) { return this.settingsData[key]; }, //get方法获取settings对象所有属性 getAll: function() { return this.settingsData; }, //set方法设置settings对象属性 set: function(key, value) { if (typeof value === "boolean") { this.settingsData[key] = value; } else { console.log("value错误"); } }, //initData方法初始化settings对象属性 initData: function() { var localData = store.get("settingsData"); var settingsData = this.settingsData; if (localData) { this.settingsData = { ...settingsData, ...localData }; } else { store.set("settingsData", this.settingsData); } }, //init方法初始化搜索引擎与书签的打开方式 init: function() { newSettingsPageFn.init(); if (this.settingsData.searchEngine) { searchEngine.init(); } if (this.settingsData.bookMarks) { bookMarks.init(); } console.log("简法主页功能增强:初始化完成"); }, //monitor方法用于检错、监控修改结果 monitor: function() { var Timer = setInterval(function() { if (settings.get("searchEngine")) { searchEngine.monitor(); } if (settings.get("bookMarks")) { bookMarks.monitor(); } }, 500); console.log("简法主页功能增强:检错程序启动(定时器ID:" + Timer + ")"); }, //on方法用于启动整个程序 on: function() { console.log("简法主页功能增强:主程序启动"); this.init(); this.monitor(); } } //searchEngine对象为搜索引擎项 var searchEngine = { //change方法用于改变搜索按钮类型,从而便于覆盖搜索打开方式 change: function() { var searchBtn = document.getElementById("search-btn"); searchBtn.type = "text"; }, //click方法用于覆盖原搜索按钮方法 click: function() { var searchBar = document.getElementById("search"); var url = searchBar.getAttribute("data-engine-start"); var val = searchBar.value; location.href = url + val; }, //enter方法用于覆盖原回车搜索方法 enter: function(event) { if (event.keyCode === 13) { var searchBtn = document.getElementById("search-btn"); searchBtn.click(); } }, //init方法用于初始化搜索引擎,覆盖新方法 init: function() { searchEngine.change(); var searchBtn = document.getElementById("search-btn"); searchBtn.onclick = searchEngine.click; var searchBar = document.getElementById("search"); searchBar.onkeydown = searchEngine.enter; }, //monitor方法用于检错、监控修改结果,若出错则调用init方法重新覆盖 monitor: function() { var searchBtn = document.getElementById("search-btn"); var searchBar = document.getElementById("search"); if (searchBtn.type !== "text" || searchBtn.onclick === null || searchBar.onkeydown === null) { this.init(); } } } //bookMarks对象为收藏书签项 var bookMarks = { //change方法用于改变书签打开方式 change: function(Obj) { if (Obj.target !== "") { Obj.target = ""; } }, //init方法用于遍历书签并调用change方法改变打开方式 init: function() { var siteBox = document.getElementById("site-box"); var aBox, aBoxLen; try { aBox = siteBox.children; aBoxLen = aBox.length; } catch (e) { aBox = null; aBoxLen = 0; } if (aBoxLen > 0) { for (let i = 0; i < aBoxLen; i++) { this.change(aBox[i]); } } }, //monitor方法用于检错程序 monitor: function() { this.init(); } } //newSettingsPageFn为增强设置页 var newSettingsPageFn = { optData: [{ tittle: "搜索结果打开方式", value: "searchEngine", choice: [{ t: "当前标签页", v: true }, { t: "新标签页", v: false }] }, { tittle: "收藏书签打开方式", value: "bookMarks", choice: [{ t: "当前标签页", v: true }, { t: "新标签页", v: false }] }], clickFn: function(id, key) { var Obj = document.getElementById(id); var setValue = settings.get(key); var optValue = Obj.value; if (setValue !== optValue) { settings.set(key, optValue); var newObj = Obj.parentElement.children; for (let i = 0; i < newObj.length; i++) { if (newObj[i].id === id) { newObj[i].style.border = "1px solid #2c7bf6"; newObj[i].style.color = "#2c7bf6"; } else { newObj[i].style.border = "1px solid rgba(0, 0, 0, 0.1)"; newObj[i].style.color = ""; } } saveFlag = true; var newSaveBox = document.getElementById("new-save-box"); if (newSaveBox && newSaveBox.style.display === "none") { newSaveBox.style.display = "flex"; } var tittleBox = document.getElementById("console-title-box"); if (tittleBox && tittleBox.style.display !== "none") { tittleBox.style.display = "none"; } } }, createTittle: function(val) { var Box = document.createElement("div"); Box.setAttribute("class", "console-bigTitle"); Box.innerText = val; return Box; }, createChoiceBtn: function(choice, id) { var Btn = document.createElement("div"); var BtnID = id + "-" + choice.v; var key = id.slice("moreSet-Opt-".length); Btn.style = "padding: 0 10px;width: 30%;margin: 5px;height: 25px;box-sizing: border-box;line-height: 23px;text-align: center;border-radius: 100px;font-size: 13px;border: 1px solid rgba(0, 0, 0, 0.1);cursor: pointer;user-select: none;transition: all .3s;"; Btn.innerText = choice.t; Btn.value = choice.v; Btn.id = BtnID; Btn.onclick = function() { newSettingsPageFn.clickFn(BtnID, key); }; if (settings.get(key) === choice.v) { Btn.style.border = "1px solid #2c7bf6"; Btn.style.color = "#2c7bf6"; } return Btn; }, createChoice: function(value, choice) { var Box = document.createElement("div"); var BoxID = "moreSet-Opt-" + value; Box.style = "width:100%;display:flex;justify-content:space-between;flex-flow:row wrap;margin-top:20px;"; Box.id = BoxID var Btn; if (Array.isArray(choice)) { for (let i = 0; i < choice.length; i++) { Btn = this.createChoiceBtn(choice[i], BoxID); Box.appendChild(Btn); } } else { Btn = this.createChoiceBtn(choice, BoxID); Box.appendChild(Btn); } return Box; }, createOpt: function(tittle, value, choice) { var ResObj = false; if (tittle && value && choice) { ResObj = document.createElement("div"); var newTittle = this.createTittle(tittle); var newChoice = this.createChoice(value, choice); ResObj.appendChild(newTittle); ResObj.appendChild(newChoice); } return ResObj; }, createPage: function(val) { var settingBox = document.createElement("div"); settingBox.id = "console-moreSet-content"; settingBox.style.display = "none"; var newOpt; for (let i = 0; i < val.length; i++) { newOpt = this.createOpt(val[i].tittle, val[i].value, val[i].choice); settingBox.appendChild(newOpt); } document.getElementById("console-box").appendChild(settingBox); }, createMenu: function() { var menuBtn = document.createElement("div"); menuBtn.setAttribute("class", "console-menu-btn"); menuBtn.id = "moreSetBtn"; menuBtn.innerText = "增强设置"; menuBtn.onclick = this.on; document.getElementById("console-menu-main").appendChild(menuBtn); }, createSaveBtn: function() { var oldSaveBox = document.getElementById("save-box"); var newSaveBox = document.createElement("div"); newSaveBox.style.display = "none"; newSaveBox.id = "new-save-box"; var newSaveBtn = document.createElement("div"); newSaveBtn.style = "font-size: 14px;display: flex;justify-content: center;align-items: center;background-color: #4486f6;color: white;height: 25px;width: 120px;border-radius: 100px;margin-right: 10px;cursor: pointer;"; var newSaveIcon = document.createElement("img"); newSaveIcon.style = "width: 13px;height: 13px;margin-right: 5px;"; newSaveIcon.setAttribute("src", "/static/home/images/console/saveicon.svg"); var newSaveTittle = document.createElement("span"); newSaveTittle.innerText = "保存并应用"; newSaveBtn.onclick = function() { if (saveFlag) { store.set("settingsData", settings.getAll()); saveFlag = false; console.log("保存增强设置"); setTimeout(function(){ var msgBox = document.getElementById("msg-box"); msgBox.style = "opacity:0.8;margin-top:50px;display:inline-block;"; msgBox.innerText = "增强设置保存成功"; setTimeout(function(){ location.reload(); },500); },300); } document.getElementById("console-close-btn").click(); }; newSaveBtn.appendChild(newSaveIcon); newSaveBtn.appendChild(newSaveTittle); newSaveBox.appendChild(newSaveBtn); oldSaveBox.parentElement.insertBefore(newSaveBox, oldSaveBox); }, on: function() { var moreSetPage = document.getElementById("console-moreSet-content"); if (moreSetPage) { document.getElementsByClassName("console-title-img")[0].src = "/static/home/images/console/set1.svg"; document.getElementsByClassName("console-title")[0].innerText = "增强设置"; document.getElementById("console-menu").style.display = "none"; moreSetPage.style.display = "block"; } else { console.log("增强设置页不存在"); } }, off: function() { var moreSetPage = document.getElementById("console-moreSet-content"); var newSaveBox = document.getElementById("new-save-box"); if (moreSetPage && moreSetPage.style.display !== "none") { moreSetPage.style.display = "none"; } if (newSaveBox.style.display !== "none") { newSaveBox.style.display = "none"; } }, init: function() { settings.initData(); var closeBtn = document.getElementById("console-close-btn"); if (closeBtn) { closeBtn.addEventListener("click", newSettingsPageFn.off); } this.createMenu(); this.createSaveBtn(); this.createPage(this.optData); } }; //启动主程序 var saveFlag = false; settings.on(); })();