// ==UserScript== // @name 简法主页功能增强 // @namespace http://tampermonkey.net/ // @version 0.6 // @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); } }; //创建设置列表 var SettingsFn = function(Options) { this.Options = { "EngineOnCurrentTab": true, //搜索引擎是否从当前标签页打开网页 "BookmarkOnCurrentTab": true, //点击书签是否从当前标签页打开网页 "AddNewSearchEngine": false, //是否添加新搜索引擎 "Engine": "", "Version": "v0.6" }; this.Options = { ...this.Options, ...Options }; } //为SettingsFn添加新方法 SettingsFn.prototype = { //get方法获取设置列表 get: function(key) { return this.Options[key]; }, //set方法为设置类别修改属性 set: function(key, value) { this.Options[key] = value; }, apply: function() { store.set("Options", this.Options); }, change: function(key) { Settings.set(key, !Settings.get(key)); Settings.apply(); }, display: function() { //增强设置项 var SettingsOptions = [{ "tittle0": "搜索引擎", "choice": [{ "tittle1": "打开方式", "value": "EngineOnCurrentTab", "option": ["当前标签页", "新标签页"] }, { "tittle1": "搜索引擎列表", "value": "AddNewSearchEngine", "option": ["添加新引擎", "保持原列表"] }] }, { "tittle0": "主页书签", "choice": [{ "tittle1": "打开方式", "value": "BookmarkOnCurrentTab", "option": ["当前标签页", "新标签页"] }] }, { "tittle0": "关于脚本", "choice": [{ "tittle1": "脚本版本", "value": "Version", "option": [Settings.get("Version")] }] }]; //增强设置保存按钮 var saveBox = document.createElement("div"); saveBox.id = "extra-save-box"; saveBox.style = "display:none;justify-content:end;align-items:center;user-select:none;"; var saveBtn = document.createElement("div"); saveBtn.id = "extra-save-btn"; saveBtn.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;"; saveBtn.onclick = function() { Settings.apply(); document.getElementById("extra-close-btn").click(); document.getElementById("msg-box").style = "opacity:0.8;margin-top:50px;display:inline-block;"; document.getElementById("msg-box").innerText = "增强设置保存成功"; setTimeout(function() { location.reload(); }, 500); }; saveBox.appendChild(saveBtn); var saveBtnImg = document.createElement("img"); saveBtnImg.src = "/static/home/images/console/saveicon.svg"; saveBtnImg.setAttribute("class", "console-save-icon"); saveBtn.appendChild(saveBtnImg); var saveBtnText = document.createElement("span"); saveBtnText.innerText = "保存并应用"; saveBtn.appendChild(saveBtnText); var closeBtn = document.createElement("div"); closeBtn.id = "extra-close-btn"; closeBtn.style = "display:none;width:18px;height:18px;background:url(/static/home/images/console/closeicon.svg);background-repeat:no-repeat;cursor:pointer;opacity:0.8;"; closeBtn.onclick = function() { var a = document.getElementById("console-wrap"); var b = document.getElementById("fixedBtnBox"); a.style.opacity = "1"; b.style.opacity = "0"; b.style.display = "block"; var index = 0; var indexmax = 20; var disappearTimer = setInterval(function() { if (index <= indexmax) { a.style.opacity = (1 - index / indexmax).toString(); b.style.opacity = (index / indexmax).toString(); if (index === indexmax) { a.style.display = "none"; b.style.display = "block"; a.style.opacity = ""; b.style.opacity = ""; } index += 1; } }, 10); setTimeout(function() { clearInterval(disappearTimer); if (index <= indexmax) { a.style.display = "none"; b.style.display = "block"; a.style.opacity = ""; b.style.opacity = ""; } }, 200); } document.getElementById("console-header").appendChild(saveBox); document.getElementById("console-header").appendChild(closeBtn); //增强设置页div var SettingsPage = document.createElement("div"); SettingsPage.id = "more-settings-page"; SettingsPage.style = "display:none;width:100%;height:100px;flex-grow:1;overflow:auto;box-sizing:border-box;padding:0 25px 0 0;margin:10px 0;"; document.getElementById("console-box").appendChild(SettingsPage); for (let i = 0; i < SettingsOptions.length; i++) { //分隔符 if (i !== 0) { var hrdiv = document.createElement("div"); hrdiv.style = "width:100%;height:0;border:none;border-top:1px solid #e6e6e6;background-color:#e6e6e6"; //noshade='noshade' SettingsPage.appendChild(hrdiv); } //大标题 var bigTitle = document.createElement("div"); bigTitle.setAttribute("class", "console-bigTitle"); if (i === 0) { bigTitle.style = "margin-top:10px" } bigTitle.innerText = SettingsOptions[i].tittle0 SettingsPage.appendChild(bigTitle); //设置选项 for (let j = 0; j < SettingsOptions[i].choice.length; j++) { //设置项value var OptVal = SettingsOptions[i].choice[j].value; //设置项顶层div var OptBox = document.createElement("div"); OptBox.setAttribute("class", "ui-adjust"); OptBox.style = "ine-height: 100%;padding:15px 10px;margin:20px 0;"; OptBox.onclick = function() { OptClickFn(SettingsOptions, i, j); } SettingsPage.appendChild(OptBox); //设置项容器div var TittleBox = document.createElement("div"); TittleBox.setAttribute("class", "ui-title-box"); TittleBox.style = "margin-top:0;"; OptBox.appendChild(TittleBox); //小标题 var Tittle = document.createElement("span"); Tittle.setAttribute("class", "ui-title"); Tittle.innerText = SettingsOptions[i].choice[j].tittle1; TittleBox.appendChild(Tittle); //设置项内容容器div var Params = document.createElement("span"); Params.setAttribute("class", "ui-params"); TittleBox.appendChild(Params); //设置项内容开括号 var Params0 = document.createElement("span"); Params0.style = "color:black"; Params0.innerText = "["; Params.appendChild(Params0); //设置项内容文字 var Params1 = document.createElement("span"); Params1.id = "extOptID-" + OptVal; if (Settings.get(OptVal)) { Params1.innerText = SettingsOptions[i].choice[j].option[0]; } else { Params1.innerText = SettingsOptions[i].choice[j].option[1]; } Params.appendChild(Params1); //设置项内容收括号 var Params2 = document.createElement("span"); Params2.style = "color:black"; Params2.innerText = "]"; Params.appendChild(Params2); } } }, create: function() { var newOption = document.createElement("div"); newOption.setAttribute("class", "console-menu-btn console-extraset-btn"); newOption.setAttribute("data-usertype", "1"); newOption.innerText = "增强设置"; newOption.onclick = function() { var displayPage = document.getElementById("more-settings-page"); if (displayPage !== null) { var PageTittle = document.getElementById("console-title-box"); PageTittle.children[0].src = "/static/home/images/console/set1.svg"; PageTittle.children[1].innerText = "增强设置"; document.getElementById("console-menu").style.display = "none"; document.getElementById("console-close-btn").style.display = "none"; document.getElementById("extra-close-btn").style.display = "block"; displayPage.style.display = "block"; } else { console.log("找不到增强设置"); } } document.getElementById("console-menu-main").appendChild(newOption); }, init: function() { Settings.create(); Settings.display(); var SettingsTimer = setInterval(function() { if (document.getElementById("console-wrap").style.display === "none") { document.getElementById("more-settings-page").style.display = "none"; document.getElementById("extra-save-box").style.display = "none"; SaveFlag = false; } }, 200) console.log("启动增强设置定时器(ID:" + SettingsTimer + ")"); } } //创建Settings var Settings = new SettingsFn(store.get("Options")); //创建新搜索引擎列表 var EnginesFn = function() { this.NewEngineList = [{ "Name": "夸克", "Url": "https://quark.sm.cn/s?q=", "Img": "https://gss3.bdstatic.com/84oSdTum2Q5BphGlnYG/timg?wapp&quality=80&size=b150_150&subsize=20480&cut_x=0&cut_w=0&cut_y=0&cut_h=0&sec=1369815402&srctrace&di=dfe458fc945b48a3ba59df62e2012e66&wh_rate=null&src=http%3A%2F%2Fimgsrc.baidu.com%2Fforum%2Fpic%2Fitem%2Ff7246b600c33874451939b645e0fd9f9d72aa050.jpg" }, { "Name": "手机百度", "Url": "https://m.baidu.com/s?word=", "Img": "/static/home/images/searchChoice/baidu.svg" }]; //格式:在[]内前一个{}后面加英文“,”,然后再按照下列格式在“,”后添加新搜索引擎:{“Name”:搜索引擎名字,"Url":搜索引擎URL,"Img":搜索引擎图标} } //为EnginesFn添加新方法 EnginesFn.prototype = { //get方法获得新搜索引擎列表 get: function() { return this.NewEngineList; }, //set方法可以为NewEngineList添加NewEngine set: function(Name, Url, Img) { var len = this.NewEngineList.length; var newEngine = { "Name": Name, "Url": Url, "Img": Img }; this.NewEngineList[len] = newEngine; }, //search方法从新搜索引擎列表中按key搜索出相应部分 search: function(key) { var len; if (typeof key === "string") { len = this.NewEngineList.length; var res = -1; if (len !== 0) { for (let i = 0; i < len; i++) { if (this.NewEngineList[i].Name === key) { res = i; } } } return res; } else if (typeof key === "number") { len = this.NewEngineList.length; if (key < len) { return this.NewEngineList[key]; } else { return this.NewEngineList[len - 1]; } } else { return -1; } }, //change方法能改变打开网页方式 change: function() { var SearchBtn = document.getElementById("search-btn"); var SearchBar = document.getElementById("search"); if ((SearchBtn.name !== "newSearchBtn") && (SearchBar.name !== "newSearchBar")) { SearchBtn.onclick = function() { var searchOBJ = document.getElementById("search"); var newURL = searchOBJ.getAttribute("data-engine-start") + searchOBJ.value; location.href = newURL; } SearchBar.onkeydown = function(event) { if (event.keyCode === 13) { document.getElementById("search-btn").click(); } } SearchBtn.name = "newSearchBtn"; SearchBar.name = "newSearchBar"; SearchBtn.type = "text"; console.log('改变搜索引擎打开方式(当前页)成功!'); } }, select: function(Name, Url, Img, Flag) { var SearchType = document.getElementById("search-type"); var Search = document.getElementById("search"); var SearchMenu = document.getElementById("search-menu"); if ((SearchType !== null) && (Search !== null) && (SearchMenu !== null)) { SearchType.style.backgroundImage = "url(" + Img + ")"; Search.setAttribute("data-engine-start", Url); SearchMenu.style.display = "none"; Settings.set("Engine", Name); Settings.apply(); localStorage.setItem("searchType", Flag); } }, //create方法创建新搜索引擎列表 create: function(Name, Url, Img) { var newEngine = document.createElement("div"); newEngine.setAttribute("class", "search-engine"); newEngine.setAttribute("data-engine-start", Url); newEngine.setAttribute("data-engine-end", ""); newEngine.innerHTML = "" + Name + ""; newEngine.onclick = function() { Engines.select(Name, Url, Img, "0"); }; return newEngine; }, //add方法能在原搜索引擎列表中添加新搜索引擎 add: function() { var MenuObj = document.getElementById("search-menu"); var List = Engines.get(); if (MenuObj !== null) { if (MenuObj.name !== "newEngine") { if (List.length !== 0) { for (let i = 0; i < List.length; i++) { var NewEngine = Engines.create(List[i].Name, List[i].Url, List[i].Img); MenuObj.appendChild(NewEngine); } MenuObj.name = "newEngine"; console.log('添加新搜索引擎成功!'); } } } }, //init方法初始化页面 init: function(L) { var MenuObj = document.getElementById("search-menu"); var Name; var Url; var Img; var nameList = []; var urlList = []; var imgList = []; if (MenuObj !== null) { for (let i = 0; i < L; i++) { var MenuChild = MenuObj.children[i]; nameList[i] = MenuChild.innerText; urlList[i] = MenuChild.getAttribute("data-engine-start"); imgList[i] = MenuChild.children[0].src; MenuChild.onclick = function() { console.log("i:" + i); var SearchType = document.getElementById("search-type"); var Search = document.getElementById("search"); var SearchMenu = document.getElementById("search-menu"); if ((SearchType !== null) && (Search !== null) && (SearchMenu !== null)) { SearchType.style.backgroundImage = "url(" + imgList[i] + ")"; Search.setAttribute("data-engine-start", urlList[i]); SearchMenu.style.display = "none"; Settings.set("Engine", nameList[i]); Settings.apply(); localStorage.setItem("searchType", i.toString()); } } } console.log('搜索引擎列表初始化成功!'); } var SelectEngine = Settings.get("Engine"); var SearchRes = Engines.search(SelectEngine); if (SearchRes !== -1) { var SearchType = document.getElementById("search-type"); var newEngineList = Engines.get(); Name = newEngineList[SearchRes].Name; Url = newEngineList[SearchRes].Url; Img = newEngineList[SearchRes].Img; Engines.select(Name, Url, Img, "0"); } } } //创建Engines var Engines = new EnginesFn(); //创建书签 var Bookmarks = { //为Bookmarks添加change方法,能改变书签打开方式 change: function() { var bookmarksOBJ = document.getElementsByClassName("site-wrap-a siteA siteAs"); if (bookmarksOBJ.name !== "newbook") { for (let i = 0; i < bookmarksOBJ.length; i++) { bookmarksOBJ[i].target = "_self"; if (i === (bookmarksOBJ.length - 1)) { bookmarksOBJ.name = "newbook"; console.log('改变主页书签打开方式(当前页)成功!'); } } } } } function OptClickFn(SettingsOptions, i, j) { var pastFlag = SaveFlag; var key = SettingsOptions[i].choice[j].value; if (key === "Version") { alert("Greasyfork:\nhttps://greasyfork.org/zh-CN/scripts/431279\n邮箱:\ngem_xl@petalmail.com"); } else { var val = Settings.get(key); if (val === true) { Settings.set(key, false); document.getElementById("extOptID-" + key).innerHTML = SettingsOptions[i].choice[j].option[1]; SaveFlag = true; } else if (val === false) { Settings.set(key, true); document.getElementById("extOptID-" + key).innerHTML = SettingsOptions[i].choice[j].option[0]; SaveFlag = true; } } if (SaveFlag !== pastFlag) { document.getElementById("console-title-box").style.display = "none"; document.getElementById("extra-save-box").style.display = "flex"; } } //mainFn方法为整个脚本的入口 function mainFn() { //初始化设置 Settings.init(); //通过定时器修改网页数据 TimerID = setInterval(function() { var bookmarksOBJ = document.getElementsByClassName("site-wrap-a siteA siteAs"); var searchType = document.getElementById("search-type"); var searchMenu = document.getElementById("search-menu"); var searchOBJ = document.getElementById("search"); var SearchBtn = document.getElementById("search-btn"); if (RunFlag) { if ((bookmarksOBJ.length !== 0) && (searchType !== null) && (searchMenu !== null) && ( searchOBJ !== null) && (SearchBtn !== null)) { RunFlag = false; console.log("开始执行主程序"); Engines.init(searchMenu.children.length); if (Settings.get("EngineOnCurrentTab")) { Engines.change(); } if (Settings.get("BookmarkOnCurrentTab")) { Bookmarks.change(); } if (Settings.get("AddNewSearchEngine")) { Engines.add(); } } } }, 200); console.log("启动主程序定时器(ID:" + TimerID + ")"); //2s超时结束定时 setTimeout(function() { clearInterval(TimerID); console.log("2s超时,释放主程序定时器(ID:" + TimerID + ")"); }, 2000); } var TimerID = -1; var RunFlag = true; var SaveFlag = false; //执行mainFn方法 mainFn(); })();