简法主页功能增强

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

您需要先安装一个扩展,例如 篡改猴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.23
// @description  在简法主页上增加其他个性化设置
// @author       tutu辣么可爱
// @include      *://*.jianfast.*
// @icon         https://s3.bmp.ovh/imgs/2021/08/2a5feb8f5f886e70.png
// @grant	 GM_openInTab
// @grant        GM_info
// @license      MIT
// ==/UserScript==

(function() {
	//addLoadEvent方法用于添加window.onload方法且window.onload不会相互覆盖覆盖
	function addLoadEvent(newOnload) {
		var oldOnload = window.onload;
		if (typeof window.onload != 'function') {
			window.onload = newOnload;
		} else {
			window.onload = function() {
				oldOnload();
				newOnload();
			}
		}
	}
	//store为本地存储功能
	var store = {
		//set方法在localstorage中修改指定JSON数据
		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方法在localstorage中获取指定JSON数据
		get: function(key) {
			if (this.has(key)) {
				return JSON.parse(localStorage.getItem(key));
			}
		},
		//has方法在localstorage中查询指定JSON数据是否存在
		has: function(key) {
			if (localStorage.getItem(key)) {
				return true;
			} else {
				return false;
			}
		},
		//del方法在localstorage中删除指定JSON数据
		del: function(key) {
			localStorage.removeItem(key);
		}
	};
	//settings对象为设置项
	var settings = {
		settingsData: {
			searchBar: true, //true:显示搜索栏;false:隐藏搜索栏
			siteBar: true, //true:显示书签栏;false:隐藏书签栏
			searchEngine: true, //true:当前标签页打开搜索结果;false:新标签页打开搜索结果
			bookMarks: true, //true:当前标签页打开书签网页;false:新标签页打开书签网页
			settingsPurify: true, //true:开启广告拦截净化;false:关闭广告拦截净化
			hideRandBg: true, //true:开启主页随机背景入口隐藏;false:关闭主页随机背景入口隐藏
			serchForcast: true, //true:开启搜索栏联想词预测;false:关闭搜索栏联想词预测
			customJsCss: false, //true:开启自定义JS/CSS;false:关闭自定义JS/CSS
			customJsCssData: {}, //用于存储自定义JS/CSS
			bookmarksFolder: false, //true:添加入口;false:不添加入口
			bookmarksUrl: "chrome://bookmarks", //用于存储浏览器书签地址
			currentWeather: false, //true:添加天气;false:不添加天气
			weatherCity: "", //实况天气城市,若为空则自动ip定位到地级市
			weatherAppId: "", //实况天气AppId,若为空则使用默认AppId
			weatherAppSecret: "" //实况天气AppSecret,若为空则使用默认AppSecret
		},
		backupData: {}, //用于备份数据
		//get方法获取settings对象settingsData属性
		get: function(key) {
			return this.settingsData[key];
		},
		//get方法获取settings对象settingsData所有属性
		getAll: function() {
			return this.settingsData;
		},
		//getBackup方法获取settings对象backupData所有属性
		getBackup: function() {
			return this.backupData;
		},
		//set方法设置settings对象settingsData属性
		set: function(key, value) {
			if (typeof value === "boolean" || /^(customJsCssData|bookmarksUrl|weather)/i.test(key)) {
				this.settingsData[key] = value;
			} else {
				console.log("value错误");
			}
		},
		//save方法用于保存设置
		save: function() {
			store.set("settingsData", this.getAll());
		},
		//initData方法初始化settings对象属性
		initData: function() {
			this.backupData = this.settingsData;
			var localData = store.get("settingsData");
			var settingsData = this.settingsData;
			if (localData) {
				this.settingsData = {
					...settingsData,
					...localData
				};
			} else {
				store.set("settingsData", this.settingsData);
			}
		},
		//init方法初始化搜索引擎与书签的打开方式
		init: function() {
			this.initData();
			newSettingsPageFn.init();
			searchEngine.init();
			bookMarks.init();
			serchForcast.init();
			settingsPurify.init();
			hideRandBg.init();
			customJsCss.init();
			bookmarksFolder.init();
			currentWeather.init();
			console.log("简法主页功能增强:初始化完成");
		},
		//monitor方法用于检错、监控修改结果
		monitor: function() {
			var Timer = setInterval(function() {
				searchEngine.monitor();
				bookMarks.monitor();
				serchForcast.monitor();
				settingsPurify.monitor();
				hideRandBg.monitor();
				customJsCss.monitor();
				bookmarksFolder.monitor();
				currentWeather.monitor();
			}, 500);
			console.log("简法主页功能增强:检错程序启动(定时器ID:" + Timer + ")");
		},
		//on方法用于启动整个程序
		on: function() {
			if (location.hostname === 'www.jianfast.com' && (location.pathname === "/" || location
					.pathname === "/m")) {
				console.log("简法主页功能增强:主程序启动");
				this.init();
				this.monitor();
			}
		}
	}
	//newSettingsPageFn为增强设置页
	var newSettingsPageFn = {
		optData: [{
			tittle: "显示主页搜索栏",
			value: "searchBar",
			choice: [{
				t: "开启显示",
				v: true
			}, {
				t: "关闭显示",
				v: false
			}]
		}, {
			tittle: "显示主页书签栏",
			value: "siteBar",
			choice: [{
				t: "开启显示",
				v: true
			}, {
				t: "关闭显示",
				v: false
			}]
		}, {
			tittle: "搜索结果打开方式",
			value: "searchEngine",
			choice: [{
				t: "当前标签页",
				v: true
			}, {
				t: "新标签页",
				v: false
			}]
		}, {
			tittle: "主页书签打开方式",
			value: "bookMarks",
			choice: [{
				t: "当前标签页",
				v: true
			}, {
				t: "新标签页",
				v: false
			}]
		}, {
			tittle: "搜索栏联想词预测",
			value: "serchForcast",
			choice: [{
				t: "开启预测",
				v: true
			}, {
				t: "关闭预测",
				v: false
			}]
		}, {
			tittle: "广告拦截净化",
			value: "settingsPurify",
			choice: [{
				t: "开启净化",
				v: true
			}, {
				t: "关闭净化",
				v: false
			}]
		}, {
			tittle: "隐藏随机背景入口",
			value: "hideRandBg",
			choice: [{
				t: "开启隐藏",
				v: true
			}, {
				t: "关闭隐藏",
				v: false
			}]
		}, {
			tittle: "自定义JS/CSS",
			value: "customJsCss",
			choice: [{
				t: "开启自定义",
				v: true
			}, {
				t: "关闭自定义",
				v: false
			}]
		}, {
			tittle: "浏览器书签",
			value: "bookmarksFolder",
			choice: [{
				t: "添加入口",
				v: true
			}, {
				t: "关闭功能",
				v: false
			}]
		}, {
			tittle: "添加实况天气",
			value: "currentWeather",
			choice: [{
				t: "添加天气",
				v: true
			}, {
				t: "关闭功能",
				v: false
			}]
		}, {
			tittle: "关于脚本",
			type: "note",
			noteData: [{
				l: "当前版本",
				r: `<span id='versionBtn'>version${GM_info.script.version}</span>`
			}, {
				l: "版本更新",
				r: "<span id='updateBtn'>GreasyFork</span>"
			}, {
				l: "反馈建议",
				r: "<span id='contactBtn'>点此处反馈</span>"
			}, {
				l: "导入配置",
				r: "<span id='importSetBtn'>点此处导入</span>"
			}, {
				l: "导出配置",
				r: "<span id='exportSetBtn'>点此处导出</span>"
			}, {
				l: "重置配置",
				r: "<span id='recoverSetBtn'>点此处重置</span>"
			}, {
				l: "天气接口",
				r: "<span id='weatherApiBtn'>点此处前往</span>"
			}]
		}],
		//clickFn方法为设置选项按钮的点击功能
		clickFn: function(id, key) {
			var Obj = document.getElementById(id);
			var setValue = settings.get(key);
			var optValue = Obj.value;
			if (setValue !== optValue) {
				this.selectBtn(Obj, key, optValue);
				this.needSave();
			}
		},
		//selectBtn方法用于选择按钮
		selectBtn: function(target, key, value) {
			settings.set(key, value);
			var targetPar = target.parentElement.children;
			for (let i = 0; i < targetPar.length; i++) {
				if (targetPar[i].value === value) {
					targetPar[i].style.border = "1px solid #2c7bf6";
					targetPar[i].style.color = "#2c7bf6";
				} else {
					targetPar[i].style.border = "1px solid rgba(0, 0, 0, 0.1)";
					targetPar[i].style.color = "";
				}
			}
		},
		//needSave方法用于显示保存按钮
		needSave: function() {
			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方法创建一个盛放设置标题的元素对象
		createTittle: function(val) {
			var Box = document.createElement("div");
			Box.setAttribute("class", "console-bigTitle");
			Box.innerText = val;
			return Box;
		},
		//createChoiceBtn方法创建一个设置选项按钮对象
		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: 35%;margin: 5px 10px;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方法创建一个设置选项按钮对象的集合对象
		createChoice: function(value, choice) {
			var Box = document.createElement("div");
			var BoxID = "moreSet-Opt-" + value;
			Box.style =
				"width:100%;display:flex;justify-content:center;flex-flow:row wrap;margin-top:15px;";
			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方法创建一个完整的设置项对象
		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;
		},
		//createNoteText方法创建一个文字性(非选项)的提示对象
		createNoteText: function(data) {
			var textObj = document.createElement("div");
			textObj.style = "width:100%;margin:5px;";
			textObj.innerHTML = "<span>" + data.l + "</span>";
			if (data.r) {
				textObj.innerHTML += "<span> : </span><span style='color:black'>" + data.r + "</span>";
			}
			return textObj;
		},
		//createNoteData方法创建一个文字性的提示对象的集合对象
		createNoteData: function(noteData) {
			var newNoteBox = document.createElement("div");
			newNoteBox.style =
				"width: 60%;margin:20%;margin-top: 20px; text-align: center; line-height: 23px;";
			var newNoteText;
			if (Array.isArray(noteData)) {
				for (let i = 0; i < noteData.length; i++) {
					newNoteText = this.createNoteText(noteData[i]);
					newNoteBox.appendChild(newNoteText);
				}
			} else {
				newNoteText = this.createNoteText(noteData);
				newNoteBox.appendChild(newNoteText);
			}
			return newNoteBox;
		},
		//createNote方法创建一个文字性的完整的提示对象
		createNote: function(tittle, noteData) {
			var ResObj = false;
			if (tittle && noteData) {
				ResObj = document.createElement("div");
				var newTittle = this.createTittle(tittle);
				var newNote = this.createNoteData(noteData);
				ResObj.appendChild(newTittle);
				ResObj.appendChild(newNote);
			}
			return ResObj;
		},
		//createPage方法创建一个增强设置页
		createPage: function(val) {
			var settingBox = document.createElement("div");
			settingBox.id = "console-moreSet-content";
			settingBox.style =
				"width: 100%;height: 100px;flex-grow: 1;overflow: auto;box-sizing: border-box;padding: 0 25px 0 0;margin: 10px 0;display: none";
			var newOpt;
			for (let i = 0; i < val.length; i++) {
				if (val[i].type) {
					if (val[i].type === "note") {
						newOpt = this.createNote(val[i].tittle, val[i].noteData);
						settingBox.appendChild(newOpt);
					}
				} else {
					newOpt = this.createOpt(val[i].tittle, val[i].value, val[i].choice);
					settingBox.appendChild(newOpt);
				}
			}
			document.getElementById("console-box").appendChild(settingBox);
		},
		//createMenu方法在设置菜单中创建增强设置功能入口
		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方法创建一个保存按钮对象
		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) {
					settings.save();
					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方法是增强设置页面的启动方法
		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方法是增强设置页面的关闭/隐藏方法
		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";
			}
		},
		//addExtEvent方法用于增加一些额外的事件
		addExtEvent: function() {
			var target;
			//当前版本
			target = document.getElementById("versionBtn");
			if (target) {
				target.onclick = function() {
					var msg =
						`脚本名称:${GM_info.script.name}\n当前版本:${GM_info.script.version}\n本作作者:${GM_info.script.author}\n检查版本更新、使用帮助等功能,请点击"关于脚本"下方的"GreasyFork"文字`;
					console.log(msg);
					alert(msg);
				}
				target.onmouseover = function() {
					document.getElementById("versionBtn").style.color = "";
				}
				target.onmouseleave = function() {
					document.getElementById("versionBtn").style.color = "grey";
				}
				target.style.cursor = "pointer";
				target.style.color = "grey";
			}
			//版本更新
			target = document.getElementById("updateBtn");
			if (target) {
				target.onclick = function() {
					location.href = "https://greasyfork.org/zh-CN/scripts/431279";
				}
				target.onmouseover = function() {
					document.getElementById("updateBtn").style.color = "";
				}
				target.onmouseleave = function() {
					document.getElementById("updateBtn").style.color = "grey";
				}
				target.style.cursor = "pointer";
				target.style.color = "grey";
			}
			//反馈建议
			target = document.getElementById("contactBtn");
			if (target) {
				target.onclick = function() {
					location.href = "https://greasyfork.org/zh-CN/scripts/431279/feedback";
				}
				target.onmouseover = function() {
					document.getElementById("contactBtn").style.color = "";
				}
				target.onmouseleave = function() {
					document.getElementById("contactBtn").style.color = "grey";
				}
				target.style.cursor = "pointer";
				target.style.color = "grey";
			}
			//导入配置
			target = document.getElementById("importSetBtn");
			if (target) {
				target.onclick = function() {
					var data = prompt("在这粘贴需要导入的配置数据:");
					data = data.trim();
					try {
						if (data !== null && data !== "") {
							data = JSON.parse(data);
							store.set("settingsData", data.settingsData);
							alert("导入配置成功");
							location.reload();
						}
					} catch (e) {
						alert("配置数据错误,导入配置失败");
					}
				}
				target.onmouseover = function() {
					document.getElementById("importSetBtn").style.color = "";
				}
				target.onmouseleave = function() {
					document.getElementById("importSetBtn").style.color = "grey";
				}
				target.style.cursor = "pointer";
				target.style.color = "grey";
			}
			//导出配置
			target = document.getElementById("exportSetBtn");
			if (target) {
				target.onclick = function() {
					var exportBox = document.createElement("input");
					exportBox.value = "{\"settingsData\":" + JSON.stringify(settings.getAll()) + "}";
					document.body.appendChild(exportBox);
					exportBox.select();
					document.execCommand('copy');
					exportBox.remove();
					alert("配置数据已成功导出到剪贴板");
				}
				target.onmouseover = function() {
					document.getElementById("exportSetBtn").style.color = "";
				}
				target.onmouseleave = function() {
					document.getElementById("exportSetBtn").style.color = "grey";
				}
				target.style.cursor = "pointer";
				target.style.color = "grey";
			}
			//重置配置
			target = document.getElementById("recoverSetBtn");
			if (target) {
				target.onclick = function() {
					var msg = "即将重置配置数据\n点击确认开始重置";
					if (confirm(msg)) {
						var data = settings.getBackup();
						if (JSON.stringify(data).trim() !== "{}") {
							store.set("settingsData", data);
							alert("配置数据重置成功");
							location.reload();
						} else {
							msg = "重置配置功能错误,请联系脚本制作者\n点击确认前往反馈";
							if (confirm(msg)) {
								var btn = document.getElementById("contactBtn");
								if (btn) {
									btn.click();
								}
							}
						}
					}
				}
				target.onmouseover = function() {
					document.getElementById("recoverSetBtn").style.color = "";
				}
				target.onmouseleave = function() {
					document.getElementById("recoverSetBtn").style.color = "grey";
				}
				target.style.cursor = "pointer";
				target.style.color = "grey";
			}
			//天气接口
			target = document.getElementById("weatherApiBtn");
			if (target) {
				target.onclick = function() {
					alert("此API来源于网络,非本脚本开发者所有\n如有天气API方面的问题,请联系API开发者");
					open("https://yiketianqi.com/");
				}
				target.onmouseover = function() {
					this.style.color = "";
				}
				target.onmouseleave = function() {
					this.style.color = "grey";
				}
				target.style.cursor = "pointer";
				target.style.color = "grey";
			}
			//自定义JS/CSS
			target = document.getElementById("moreSet-Opt-customJsCss-true");
			if (target) {
				target.addEventListener("click", function() {
					customJsCss.clickFn();
				});
			}
			//浏览器书签
			target = document.getElementById("moreSet-Opt-bookmarksFolder-true");
			if (target) {
				target.addEventListener("click", function() {
					bookmarksFolder.clickFn();
				});
			}
			//实况天气
			target = document.getElementById("moreSet-Opt-currentWeather-true");
			if (target) {
				target.addEventListener("click", function() {
					currentWeather.clickFn();
				});
			}
		},
		//initPC方法是针对PC模式的增强设置初始化方法,是增强设置的启动方法
		initPC: function() {
			var consoleBox = document.getElementById("console-box");
			if (consoleBox) {
				var closeBtn = document.getElementById("console-close-btn");
				if (closeBtn) {
					closeBtn.addEventListener("click", newSettingsPageFn.off);
				}
				this.createMenu();
				this.createSaveBtn();
				this.createPage(this.optData);
				this.addExtEvent();
			}
		},
		//initMobile方法是针对Mobile模式的增强设置初始化方法,是增强设置的启动方法
		initMobile: function() {
			var menuWrap = document.getElementById("menu-wrap");
			if (menuWrap) {
				var menuObj = menuWrap.children[1];
				if (menuObj && menuObj.tagName === "UL") {
					var newOpt = document.createElement("li");
					newOpt.style = "cursor:pointer;"
					newOpt.innerHTML = "<img src='/static/home/images/console/set1.svg'/><span>增强设置</span>";
					newOpt.onclick = function() {
						var res = confirm("增强设置请前往电脑版操作,点击确认前往电脑版");
						if (res) {
							location.href = "https://www.jianfast.com/?pc=1";
						}
					}
					menuObj.appendChild(newOpt);
				}
				var menuNotice = document.getElementById("menu-notice");
				var newNotice = "<div>" + menuNotice.children[1].innerText +
					"</div><div>对增强设置进行修改请前往电脑版网页操作</div><div>增强设置-搜索结果打开方式仅对电脑版生效</div>";
				menuNotice.children[1].innerHTML = newNotice;
			}
		},
		//init方法调用initPC方法与initMobile方法初始化增强设置,是对外统一调用的初始化方法
		init: function() {
			this.initPC();
			this.initMobile();
		}
	};
	//searchEngine对象为搜索引擎项
	var searchEngine = {
		//change方法用于改变搜索按钮类型,从而便于覆盖搜索打开方式
		change: function() {
			var searchBtn = document.getElementById("search-btn");
			if (searchBtn) {
				searchBtn.type = "text";
			}
		},
		//click方法用于覆盖原搜索按钮点击方法
		click: function() {
			if (location.href.search("jianfast.com/m") === -1) {
				var searchBar = document.getElementById("search");
				var url = searchBar.getAttribute("data-engine-start");
				var val = searchBar.value;
				if (settings.get("searchEngine")) {
					location.href = url + val;
				} else {
					open(url + val);
				}
			}
		},
		//enter方法用于覆盖原回车搜索方法
		enter: function(event) {
			if (event.keyCode === 13) {
				searchEngine.click();
			}
		},
		//display方法用于显示或隐藏搜索栏
		display: function() {
			var searchBar = document.getElementById("search-wrap");
			if (searchBar) {
				if (settings.get("searchBar") && searchBar.style.display === "none") {
					searchBar.style.display = "flex";
				} else if (!settings.get("searchBar") && searchBar.style.display !== "none") {
					searchBar.style.display = "none";
				}
			}
		},
		//init方法用于初始化搜索引擎,覆盖新方法
		init: function() {
			searchEngine.change();
			this.display();
			var searchBtn = document.getElementById("search-btn");
			if (searchBtn) {
				searchBtn.onclick = this.click;
			}
			var searchBar = document.getElementById("search");
			if (searchBar) {
				searchBar.onkeydown = this.enter;
			}
		},
		//monitor方法用于检错、监控修改结果,若出错则调用init方法重新覆盖
		monitor: function() {
			this.display();
			var searchForm = document.getElementById("search-form");
			var searchBar = document.getElementById("search");
			var searchBtn = document.getElementById("search-btn");
			if ((searchBar && searchBar.onkeydown === null) || (searchBtn && searchBtn.type !== "text") || (
					searchBtn && searchBtn.onclick === null)) {
				this.init();
			}
		}
	}
	//bookMarks对象为主页书签项
	var bookMarks = {
		//change方法用于改变书签打开方式
		change: function(Obj) {
			if (Obj.tagName === "A") {
				if (settings.get("bookMarks") && Obj.target !== "") {
					Obj.target = "";
				} else if (!settings.get("bookMarks") && Obj.target !== "_blank") {
					Obj.target = "_blank";
				}
			}
		},
		//display方法用于显示或隐藏书签栏
		display: function() {
			var siteBar = document.getElementById("site-wrap");
			if (siteBar) {
				if (settings.get("siteBar") && siteBar.style.display === "none") {
					siteBar.style.display = "flex";
				} else if (!settings.get("siteBar") && siteBar.style.display !== "none") {
					siteBar.style.display = "none";
				}
			}
		},
		//init方法用于遍历书签并调用change方法改变打开方式
		init: function() {
			this.display();
			var siteBox, aBox, aBoxLen;
			var idArray = ["site-box", "site-wrap"];
			for (let i = 0; i < idArray.length; i++) {
				siteBox = document.getElementById(idArray[i])
				if (siteBox) {
					break;
				}
			}
			if (siteBox && siteBox.childElementCount > 0) {
				for (let i = 0; i < siteBox.childElementCount; i++) {
					this.change(siteBox.children[i]);
				}
			}
		},
		//monitor方法用于检错程序
		monitor: function() {
			this.init();
		}
	}
	//serchForcast搜索栏联想词预测相关功能
	var serchForcast = {
		display: function() {
			var keywordBox = document.getElementById("search-keyword-box");
			if (keywordBox && !settings.get("serchForcast")) {
				keywordBox.remove();
			}
		},
		//click方法用于覆盖原联想词点击方法
		click: function(target) {
			var searchBar = document.getElementById("search");
			searchBar.value = target.innerText;
			searchEngine.click();
		},
		//mouseOver方法用于覆盖原联想词鼠标事件(置于上方)方法
		mouseOver: function(target) {
			var targetPare = target.parentElement;
			if (targetPare && targetPare.childElementCount > 0) {
				for (let i = 0; i < targetPare.childElementCount; i++) {
					this.mouseLeave(targetPare.children[i]);
				}
			}
			target.style = "background-color: rgb(241, 241, 241);";
		},
		//mouseLeave方法用于覆盖原联想词鼠标事件(离开)方法
		mouseLeave: function(target) {
			target.style = "background-color: rgba(255, 255, 255, 0.3);";
		},
		//change方法用于改变搜索栏联想词相关功能
		change: function(keywordBox) {
			if (keywordBox) {
				keywordBox.innerHTML = keywordBox.innerHTML; //整体覆盖删除原方法
				var keyword = keywordBox.children;
				if (keyword.length > 0) {
					for (let i = 0; i < keyword.length; i++) { //增加新方法
						keyword[i].onmouseover = function() {
							serchForcast.mouseOver(keyword[i]);
						};
						keyword[i].onmouseleave = function() {
							serchForcast.mouseLeave(keyword[i]);
						};
						keyword[i].onclick = function() {
							serchForcast.click(keyword[i]);
						};
					}
				}
			}
		},
		//close方法用于关闭设置时若未保存重置按键值
		close: function() {
			var localData = store.get("settingsData");
			var localValue = localData.serchForcast;
			var settingValue = settings.get("serchForcast");
			if (typeof localValue === "boolean" && typeof settingValue === "boolean" && localValue !==
				settingValue) {
				var targetBtn = document.getElementById("moreSet-Opt-serchForcast-" + localValue);
				if (targetBtn) {
					targetBtn.click();
				}
				targetBtn = document.getElementById("new-save-box");
				if (targetBtn && targetBtn.style.display !== "none") {
					targetBtn.style.display = "none";
				}
			}
		},
		//init方法用于初始化相关功能
		init: function() {
			addLoadEvent(this.display);
			this.change();
			var closeBtn = document.getElementById("console-close-btn");
			if (closeBtn) {
				closeBtn.addEventListener("click", serchForcast.close);
			}
		},
		//monitor方法用于检错程序
		monitor: function() {
			var keywordBox = document.getElementById("search-keyword-box");
			if (keywordBox && keywordBox.childElementCount > 0) {
				var keywordInitFlag = false;
				var keyword = keywordBox.children;
				for (let i = 0; i < keyword.length; i++) {
					if (keyword[i].onmouseover === null || keyword[i].onmouseleave === null || keyword[i]
						.onclick === null) {
						keywordInitFlag = true;
						break;
					}
				}
				if (keywordInitFlag) {
					this.change(keywordBox);
				}
			}
		}
	};
	//settingsPurify为广告拦截净化功能
	var settingsPurify = {
		//init方法用于初始化净化广告
		init: function() {
			var adObj = document.getElementsByClassName("console-bottom-ad");
			if (adObj && adObj.length > 0) {
				for (let i = 0; i < adObj.length; i++) {
					if (settings.get("settingsPurify") && adObj[i].style.display !== "none") {
						adObj[i].style.display = "none";
					} else if (!settings.get("settingsPurify") && adObj[i].style.display === "none") {
						adObj[i].style.display = "";
					}
				}
			}
			adObj = document.getElementById("hongbao-btn");
			if (adObj) {
				if (settings.get("settingsPurify") && adObj.style.display !== "none") {
					adObj.style.display = "none";
				} else if (!settings.get("settingsPurify") && adObj.style.display === "none") {
					adObj.style.display = "";
				}
			}
			var bottomBtnBox = document.getElementById("console-bottom-btn-box");
			if (bottomBtnBox.childElementCount > 0) {
				bottomBtnBox = bottomBtnBox.children;
				var bottomBtn;
				for (let i = 0; i < bottomBtnBox.length; i++) {
					bottomBtn = bottomBtnBox[i];
					if (bottomBtn) {
						if (settings.get("settingsPurify")) {
							if (bottomBtn.innerText === "设为主页") {
								bottomBtn.innerText = "移动版";
								bottomBtn.href = "/m";
								bottomBtn.target = "";
							} else if (bottomBtn.innerText === "关于") {
								bottomBtn.innerText = "问题反馈";
								bottomBtn.href = "/contact";
								bottomBtn.target = "_blank";
							}
						} else if (!settings.get("settingsPurify")) {
							if (bottomBtn.innerText === "设为主页") {
								bottomBtn.innerText = "设为主页";
								bottomBtn.href = "/zhuye";
								bottomBtn.target = "_blank";
							} else if (bottomBtn.innerText === "关于") {
								bottomBtn.innerText = "关于";
								bottomBtn.href = "/about";
								bottomBtn.target = "_blank";
							}
						}
					}
				}
			}
		},
		//monitor方法用于检错程序
		monitor: function() {
			this.init();
		}
	}
	//hideRandBg为主页随机背景入口隐藏功能
	var hideRandBg = {
		//init方法用于初始化入口隐藏
		init: function() {
			var randBgBtn = document.getElementById("rand-bg-btn");
			if (randBgBtn) {
				if (settings.get("hideRandBg") && randBgBtn.style.display !== "none") {
					randBgBtn.style.display = "none";
				} else if (!settings.get("hideRandBg") && randBgBtn.style.display === "none") {
					randBgBtn.style.display = "";
				}
			}
		},
		//monitor方法用于检错程序
		monitor: function() {
			this.init();
		}
	}
	//自定义JS/CSS
	var customJsCss = {
		getData: function(type, originData, extraMsg) {
			var data, res;
			var msg = "请输入自定义" + type + "\n点击确定,保存自定义" + type + "; 点击取消,删除自定义" + type;
			if (extraMsg) {
				msg = msg + "\n\n" + extraMsg;
			}
			if (!originData) {
				originData = "";
			}
			data = prompt(msg, originData);
			if (typeof data === "string") {
				data = data.trim();
			}
			if (data) {
				res = data;
			} else {
				res = "";
			}
			console.log("自定义" + type + ":" + res);
			return res;
		},
		clickFn: function() {
			var data = settings.get("customJsCssData");
			data.js = this.getData("JS", data.js, "注意:extraCustomJS()为自定义JS的入口方法,请避免将方法名命名为extraCustomJS");
			data.css = this.getData("CSS", data.css);
			settings.set("customJsCssData", data);
			if (!data.js && !data.css) {
				alert("自定义JS/CSS已删除,将自动选择关闭自定义");
				var falseBtn = document.getElementById("moreSet-Opt-customJsCss-false");
				if (falseBtn) {
					falseBtn.click();
				}
			}
			newSettingsPageFn.needSave();
		},
		on: function() {
			var data = settings.get("customJsCssData");
			var eleBox = document.createElement("div");
			eleBox.id = "customJsCssBox";
			if (data.js) {
				var JSele = document.createElement("script");
				JSele.id = "customJS";
				JSele.innerHTML = "function extraCustomJS(){\r\n\ttry{\r\n\t" + data.js +
					"\r\n\t}catch(e){\r\n\tvar msg='自定义JS错误';\r\n\tconsole.log(msg);\r\n\talert(msg);\r\n\t}\r\n\t}\r\n\textraCustomJS();";
				eleBox.appendChild(JSele);
			}
			if (data.js) {
				var CSSele = document.createElement("style");
				CSSele.id = "customCSS";
				CSSele.innerHTML = data.css;
				eleBox.appendChild(CSSele);
			}
			var bodyFirstEle = document.body.children[0];
			document.body.insertBefore(eleBox, bodyFirstEle);
		},
		off: function() {
			var eleBox = document.getElementById("customJsCssBox");
			if (eleBox) {
				eleBox.remove();
			}
		},
		init: function() {
			if (settings.get("customJsCss")) {
				this.on();
			}
		},
		monitor: function() {
			var eleBox = document.getElementById("customJsCssBox");
			if (settings.get("customJsCss") && !eleBox) {
				this.on();
			} else if (!settings.get("customJsCss") && eleBox) {
				this.off();
			}
		}
	};
	//bookmarksFolder浏览器书签
	var bookmarksFolder = {
		//on方法用于启动
		on: function() {
			let bookmarksContainer = document.getElementById("site-box");
			if (bookmarksContainer && bookmarksContainer.firstElementChild) {
				let newSite = bookmarksContainer.querySelector("#open_bookmarks_folder_btn");
				if (newSite) {
					return false;
				}
				newSite = bookmarksContainer.firstElementChild.cloneNode(true);
				newSite.id = "open_bookmarks_folder_btn";
				bookmarksContainer.appendChild(newSite);
				newSite.href = "javascript:void(0);";
				console.log(bookmarksContainer.firstChild)
				newSite.getElementsByTagName("img")[0].src = "static/home/images/defaultsicon/9.png";
				newSite.getElementsByClassName("site-title")[0].innerText = "浏览器书签";
				newSite.onclick = function() {
					let url = settings.get("bookmarksUrl");
					url = url ? url : "chrome://bookmarks";
					GM_openInTab(url, false);
				}
			}
		},
		//off方法用于关闭
		off: function() {
			let target = document.getElementById("open_bookmarks_folder_btn");
			if (target) {
				target.remove();
			}
		},
		//clickFn方法为设置点击功能
		clickFn: function() {
			let url = settings.get("bookmarksUrl");
			url = url ? url : "chrome://bookmarks";
			url = prompt("请输入浏览器书签地址", url);
			if (url && typeof url === "string") {
				settings.set("bookmarksUrl", url);
				newSettingsPageFn.needSave();
			}
		},
		//init方法用于初始化添加一个书签按钮
		init: function() {
			if (settings.get("bookmarksFolder")) {
				this.on();
			}
		},
		//monitor方法用于检错程序
		monitor: function() {
			this.init();
		}
	}
	//currentWeather实况天气
	var currentWeather = {
		num: 0,
		ajax: function() {
			var id = settings.get("weatherAppId"),
				secret = settings.get("weatherAppSecret"),
				city = settings.get("weatherCity");
			id = id ? id : "23035354", secret = secret ? secret : "8YvlPNrz", city = city ?
				`&city${(/^\d+$/.test(city)?"id":"")}=${city}` : ""
			var url =
				`https://yiketianqi.com/api?unescape=1&version=v1&appid=${id}&appsecret=${secret}${city}`;
			console.log(url);
			$.ajax({
				url: url,
				type: "get",
				dataType: "json",
				success: function(res) {
					var data = res.data[0];
					var weather =
						`${res.city}-${data.wea}-${data.air_level.length>1?data.air_level:"空气"+data.air_level}-气温${data.tem}(${data.tem1}/${data.tem2})`
						.replaceAll("℃", "°C");
					var time = new Date().toLocaleString();
					$("#search").attr("placeholder", weather);
					localStorage.setItem("currentWeatherCache", JSON.stringify({
						"t": time,
						"w": weather
					}))
				}
			})
		},
		//on方法用于启动
		on: function() {
			if (this.num === 0) {
				var data = localStorage.getItem("currentWeatherCache");
				if (data) {
					data = JSON.parse(data);
					var pT = new Date(data.t),
						cT = new Date();
					var gap = cT.getTime() - pT.getTime();
					if (gap > 3 * 3600 * 1000 || cT.toLocaleDateString() !== pT.toLocaleDateString()) {
						this.ajax();
					} else if ($("#search").attr("placeholder") !== data.w) {
						$("#search").attr("placeholder", data.w);
					}
				} else {
					this.ajax();
				}
			}
			this.num = (this.num < 1200) ? (this.num + 1) : 0; //10min检查一次cache
		},
		//off方法用于关闭
		off: function() {
			$("#search").attr("placeholder", "");
		},
		// userInput方法为用户输入保存相关信息
		userInput: function(data, key, msg) {
			data = prompt(msg, data);
			if (data && typeof data === "string") {
				settings.set(key, data);
				newSettingsPageFn.needSave();
			}
		},
		//clickFn方法为设置点击功能
		clickFn: function() {
			let city = settings.get("weatherCity"),
				id = settings.get("weatherAppId"),
				secret = settings.get("weatherAppSecret"),
				msg;
			city = city ? city : "", id = id ? id : "", secret = secret ? secret : "";
			msg = "请输入实况天气城市名(可精确到区县一级,例如:浦东新区、崇明、朝阳)或城市id。若为空,则自动使用ip定位到地级市一级\n城市id请点击“关于脚本-天气接口”获取";
			this.userInput(city, "weatherCity", msg);
			msg = "请输入实况天气API的AppId。若为空,自动使用公共AppId\n个人AppId请点击“关于脚本-天气接口”获取";
			this.userInput(id, "weatherAppId", msg);
			msg = "请输入实况天气API的AppSecret。若为空,自动使用公共AppSecret\n个人AppSecret请点击“关于脚本-天气接口”获取";
			this.userInput(id, "weatherAppSecret", msg);
			localStorage.setItem("currentWeatherCache", "");
			this.num = 0;
		},
		//init方法用于初始化添加一个书签按钮
		init: function() {
			if (settings.get("currentWeather")) {
				this.on();
			}
		},
		//monitor方法用于检错程序
		monitor: function() {
			this.init();
		}
	}
	//全局变量配置
	var saveFlag = false; //saveFlag用于判断是否需要保存增强设置
	//启动主程序
	settings.on();
})();