Greasy Fork

Greasy Fork is available in English.

简法主页功能增强

在简法主页上增加其他个性化设置

当前为 2021-10-17 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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
// ==/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();
})();