Greasy Fork

百度搜索 - 优化 - v4

1、屏蔽百度推广 2、关闭百度广告联盟信息收集 3、绑定快捷键 4、布局调整 5、居中单列(可选) 6、居中双列(可选)

// ==UserScript==
// @name         百度搜索 - 优化 - v4
// @namespace    http://tampermonkey.net/
// @description  1、屏蔽百度推广 2、关闭百度广告联盟信息收集 3、绑定快捷键 4、布局调整 5、居中单列(可选) 6、居中双列(可选)
// @version      4.5.7
// @author       浮生未歇
// @run-at       document-start

// @include      http://www.baidu.com/
// @include      http://www.baidu.com/s?*
// @incluce      http://www.baidu.com/#*
// @include      http://www.baidu.com/baidu?*
// @include      https://www.baidu.com/
// @include      https://www.baidu.com/s?*
// @incluce      https://www.baidu.com/#*
// @include      https://www.baidu.com/baidu?*
// @exclude      https://www.baidu.com/home*
// @exclude      https://www.baidu.com/sf*
// @exclude      https://www.baidu.com/search*
// @exclude      https://www.baidu.com/link*
// @exclude      https://www.baidu.com/s*tn=news*
// @resource     baiduIndexStyle   https://fastly.jsdelivr.net/gh/sinlin/[email protected]/v1.1.5/indexStyle.css
// @resource     baiduCommonStyle  https://fastly.jsdelivr.net/gh/sinlin/[email protected]/v1.1.5/commonStyle.css
// @resource     baiduMenu         https://fastly.jsdelivr.net/gh/sinlin/[email protected]/v1.1.5/menu.css
// @resource     baiduOne          https://fastly.jsdelivr.net/gh/sinlin/[email protected]/v1.1.5/one.css
// @resource     baiduTwo          https://fastly.jsdelivr.net/gh/sinlin/[email protected]/v1.1.5/two.css
// @resource     baiduThree        https://fastly.jsdelivr.net/gh/sinlin/[email protected]/v1.1.5/three.css
// @connect      *
// @grant        GM_addStyle
// @grant        GM_getResourceText
// @grant        GM_getResourceURL
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_deleteValue
// @grant        GM_xmlhttpRequest
// ==/UserScript==



//backup
//baiduIndexStyle   https://cdn.jsdelivr.net/gh/sinlin/[email protected]/2018-10-30/indexStyle.css
//baiduCommonStyle  https://cdn.jsdelivr.net/gh/sinlin/[email protected]/2018-10-30/commonStyle.css
//baiduMenu         https://cdn.jsdelivr.net/gh/sinlin/[email protected]/2018-10-30/menu.css
//baiduOne          https://cdn.jsdelivr.net/gh/sinlin/[email protected]/2018-10-30/one.css
//baiduTwo          https://cdn.jsdelivr.net/gh/sinlin/[email protected]/2018-10-30/two.css
//baiduThree        https://cdn.jsdelivr.net/gh/sinlin/[email protected]/2018-10-30/three.css

//baiduIndexStyle   https://sshin.gitee.io/baidu-style/v1.1.4/indexStyle.css
//baiduCommonStyle  https://sshin.gitee.io/baidu-style/v1.1.4/commonStyle.css
//baiduMenu         https://sshin.gitee.io/baidu-style/v1.1.4/menu.css
//baiduOne          https://sshin.gitee.io/baidu-style/v1.1.4/one.css
//baiduTwo          https://sshin.gitee.io/baidu-style/v1.1.4/two.css
//baiduThree        https://sshin.gitee.io/baidu-style/v1.1.4/three.css


// @resource     baiduIndexStyle   https://www.wulihub.com.cn/gc/JM0LaB/v1.1.4/indexStyle.css
// @resource     baiduCommonStyle  https://www.wulihub.com.cn/gc/JM0LaB/v1.1.4/commonStyle.css
// @resource     baiduMenu         https://www.wulihub.com.cn/gc/JM0LaB/v1.1.4/menu.css
// @resource     baiduOne          https://www.wulihub.com.cn/gc/JM0LaB/v1.1.4/one.css
// @resource     baiduTwo          https://www.wulihub.com.cn/gc/JM0LaB/v1.1.4/two.css
// @resource     baiduThree        https://www.wulihub.com.cn/gc/JM0LaB/v1.1.4/three.css
(()=>{
	//http 跳转 https
	let baiduRUL = location.href;
	let url = new URL(baiduRUL);
	if (url.protocol === "http:"){
		location.href = baiduRUL.replace("http:", "https:");
	}
})();

(() => {
	//初始化配置
	const Configs = {
		//是否调试
		IS_DEBUG: false,
		//壁纸地址
		BACKGROUND_URL: "https://ss2.bdstatic.com/lfoZeXSm1A5BphGlnYG/skin/37.jpg",
		//自定义按钮 ID
		CUSTOM_BUTTON_ID: "CustomMenu",
		//菜单功能页 ID
		MENU_ITEMS_ID: "menulist",
		//菜单保存按钮 ID
		MENU_SAVA_ID: "menusava",
		//自定义背景
		CUSTOM_BG: [{
			name: "CUSTOM_BG_URL",
			value: ""
		}],
		//功能配置
		OPTIONS: [
			//页面布局:1:普通页面,2:单列居中,3:双列居中,4:三列居中
			{
				name: "SELECT_PAGE",
				value: 1
			},
			//重定向
			{
				name: "SWITCH_IS_REDIRECT",
				value: false
			},
			//加载下一页
			{
				name: "SWITCH_IS_LOADPAGE",
				value: false
			},
			//固定侧边栏
			{
				name: "SWITCH_IS_FIXEDSILDER",
				value: false
			},
			//加载背景
			{
				name: "SWITCH_IS_BACKGOUND",
				value: false
			},
			//百家号
			{
				name: "SWITCH_IS_BAIJIAHAO",
				value: false
			}
		],
		//百度样式
		BAIDU_STYLES: [{
			//百度首页
			INDEX: GM_getResourceText("baiduIndexStyle"),
			//普通页
			COMMON: GM_getResourceText("baiduCommonStyle"),
			//菜单
			MENU: GM_getResourceText("baiduMenu"),
			//单页
			ONE: GM_getResourceText("baiduOne"),
			//双页
			TWO: GM_getResourceText("baiduTwo"),
			//三页
			THREE: GM_getResourceText("baiduThree")
		}],
		//过滤功能 ,不能设置 G(已被 Google搜索 占用)
		FILTERS: [{
				name: "B",
				value: "-baijiahao"
			},
			{
				name: "T",
				value: "site:tieba.baidu.com"
			},
			{
				name: "J",
				value: "site:juejin.im"
			},
			{
				name: "S",
				value: "site:segmentfault.com"
			},
			{
				name: "V",
				value: "site:v2ex.com"
			},
			{
				name: "Z",
				value: "site:zhihu.com"
			}
		]
	};
	//打包
	const BaiduConfig = {
		window,
		document,
		location,
		Configs
	};
	//Baidu
	const Baidu = (({
		window,
		document,
		location,
		Configs
	}, undefined) => {
		//创建空对象
		const Baidu = Object.create(null);
		/**
		 * 实现 ready 功能, 文档完成后即执行
		 * 举例 : Baidu.ready = function(){}
		 */
		Reflect.defineProperty(Baidu, "ready", {
			set: fn => {
				if (document.readyState === "complete") {
					fn();
				} else if (!!document.addEventListener) {
					document.addEventListener("DOMContentLoaded", () => {
						fn();
					}, true);
				} else {
					throw new Error("Baidu.ready can't use");
				}
			}
		});
		/**
		 * 延时执行
		 * count 1 = 16.7ms
		 */
		Baidu.delayRun = (callback, count = 0) => {
			if (count === 0) {
				window.requestAnimationFrame(() => {
					return callback();
				});
			} else {
				window.requestAnimationFrame(() => {
					Baidu.delayRun(callback, --count);
				});
			}
		};
		/**
		 * GM数据类
		 * @class GM
		 */
		let GM = class {
			getValue(selection) {
				try {
					return GM_getValue(selection.name, selection.value);
				} catch (msg) {
					console.error(msg);
				}
			}
			setValue(name, value) {
				try {
					GM_setValue(name, value);
				} catch (msg) {
					console.error(msg);
				}
			}
			addStyle(style) {
				try {
					GM_addStyle(style);
				} catch (msg) {
					console.error(msg);
				}
			}
			xmlhttpRequest(object) {
				try {
					GM_xmlhttpRequest(object);
				} catch (msg) {
					console.error(msg);
				}
			}
		};
		/**
		 * 助手类
		 * 用于与底层交互
		 */
		class Base extends GM {
			constructor() {
				super();
				this.Configs = Configs;
				this.PAGE_LAYOUT = Configs.OPTIONS[0];
				this.USE_REDIRECT = Configs.OPTIONS[1];
				this.USE_AUTO_NEXT_PAGE = Configs.OPTIONS[2];
				this.USE_FIXED_SILDER = Configs.OPTIONS[3];
				this.USE_BACKGROUND = Configs.OPTIONS[4];
				this.USE_HIDE_BAIJIAHAO = Configs.OPTIONS[5];
				this.CURRENT_BACKGROUND_URL = Configs.BACKGROUND_URL;
			}
			getCustomBgName() {
				return Configs.CUSTOM_BG[0]["name"];
			}
			getCustonBgURL() {
				return super.getValue(Configs.CUSTOM_BG[0]) || "";
			}
			getCustomButtonIdName() {
				return Configs.CUSTOM_BUTTON_ID;
			}
			getMenuItemsIdName() {
				return Configs.MENU_ITEMS_ID;
			}
			getMenuSaveIdname() {
				return Configs.MENU_SAVA_ID;
			}
			getCurrentBackgroundURL() {
				return this.CURRENT_BACKGROUND_URL || "";
			}
			getCurrentPageLayoutType() {
				return Number(super.getValue(this.PAGE_LAYOUT));
			}
			getPageLayoutName() {
				return this.PAGE_LAYOUT["name"];
			}
			getUseRedirectName() {
				return this.USE_REDIRECT["name"];
			}
			getUseAuoLoadNextPageName() {
				return this.USE_AUTO_NEXT_PAGE["name"];
			}
			getUseFixedSilderName() {
				return this.USE_FIXED_SILDER["name"];
			}
			getUseBackgroundName() {
				return this.USE_BACKGROUND["name"];
			}
			getUseHideBaiJiaHaoName() {
				return this.USE_HIDE_BAIJIAHAO["name"];
			}
			isUseRedirect() {
				return !!super.getValue(this.USE_REDIRECT);
			}
			isUseAuoLoadNextPage() {
				return !!super.getValue(this.USE_AUTO_NEXT_PAGE);
			}
			isUseFixedSilder() {
				return !!super.getValue(this.USE_FIXED_SILDER);
			}
			isUseBackground() {
				return !!super.getValue(this.USE_BACKGROUND);
			}
			isUseHideBaiJiaHao() {
				return !!super.getValue(this.USE_HIDE_BAIJIAHAO);
			}
			getStyleContentForCommon() {
				return Configs.BAIDU_STYLES[0]["COMMON"] || "";
			}
			getStyleContentForIndex() {
				return Configs.BAIDU_STYLES[0]["INDEX"] || "";
			}
			getStyleContentForMenu() {
				return Configs.BAIDU_STYLES[0]["MENU"] || "";
			}
			getStyleContentForOne() {
				return Configs.BAIDU_STYLES[0]["ONE"] || "";
			}
			getStyleContentForTwo() {
				return Configs.BAIDU_STYLES[0]["TWO"] || "";
			}
			getStyleContentForThree() {
				return Configs.BAIDU_STYLES[0]["THREE"] || "";
			}
			removeElementForID(idName = "") {
				let element = document.getElementById(idName);
				if (!!element) {
					element.parentNode.removeChild(element);
				}
			}
		}
		/**
		 * 缓存类
		 * 用于对数据的缓存
		 * @class Cache
		 *
		 */
		class Cache extends Base {
			constructor() {
				super();
				this.cache = "";
			}
			/**
			 * 删除缓存
			 */
			delCache() {
				this.cache = "";
			}
			/**
			 * 添加缓存
			 * @param Content {string} 缓存内容
			 */
			addCache(Content) {
				this.cache += Content;
			}
			/**
			 * 获取缓存内容
			 */
			getCache() {
				return this.cache;
			}
		}
		/**
		 * 样式
		 * @class Style
		 * @extends Cache
		 */
		class Style extends Cache {
			constructor() {
				super();
			}
			/**
			 * 删除样式缓存
			 */
			deleteStyleCache() {
				super.delCache();
			}
			/**
			 * 获取样式缓存内容
			 */
			getStyleCache() {
				return super.getCache();
			}
			/**
			 * 添加样式到缓存
			 * @param styleContent
			 */
			addStyleCache(styleContent) {
				super.addCache(styleContent);
			}
			/**
			 * 向网页导入样式
			 * @method importStyle
			 *
			 */
			importStyle() {
				let styleContnet = this.getStyleCache();
				super.addStyle(styleContnet);
			}
			/**
			 * 将样式加入缓存
			 * @param {stirng} styleContent 样式内容
			 * @return {Style} this 该实例
			 */
			add(styleContent) {
				this.addStyleCache(styleContent);
				return this;
			}
			/**
			 * 结束
			 * 开始将缓存样式导入,并清空缓存
			 */
			end() {
				this.importStyle();
				this.deleteStyleCache();
			}
		}
		/**
		 * 函数执行器 - 组合执行
		 */
		class Commond {
			constructor() {
				this.commondList = [];
			}
			/**
			 * 添加数组缓存中
			 * @param {object} command 对象实例
			 */
			add(command) {
				this.commondList.push(command);
			}
			/**
			 * 执行数值缓存中的实例
			 */
			execute() {
				for (let i = 0, command;
					(command = this.commondList[i++]);) {
					command.execute();
				}
			}
		}
		/**
		 * 检测功能 - 避免代码多次执行
		 * @class AvoidMulExecute
		 */
		class AvoidMulExecute {
			constructor() {
				//标志名称
				this.SING_NAME = "IsRunBaidu";
			}
			/**
			 * 获取需要标志的元素
			 */
			getSignElement() {
				return document.getElementById("content_left") || {};
			}
			/**
			 * 增加标志位
			 */
			setSign() {
				let container = this.getSignElement();
				container.setAttribute(this.SING_NAME, true);
			}
			/**
			 * 判断是否存在标志位
			 */
			hasSign() {
				let container = this.getSignElement();
				return !!container.hasAttribute(this.SING_NAME);
			}
		}
		/**
		 * 导入首页样式
		 * @class IMportIndexStyle
		 */
		class ImportIndexStyle extends Style {
			constructor() {
				super();
			}
			/**
			 * 获取首页的样式
			 */
			getStyleForIndex() {
				return super.getStyleContentForIndex();
			}
			/**
			 * 导入样式
			 * @method import
			 */
			import() {
				super.add(this.getStyleForIndex())
					.end();
			}
			/**
			 * 初始化
			 * @method init
			 */
			init() {
				this.import();
			}
			/**
			 * 执行
			 * @method execute
			 */
			execute() {
				this.init();
			}
		}
		/**
		 * 导入普通结果页样式
		 * @class ImportCommonStyle
		 */
		class ImportCommonStyle extends Style {
			constructor() {
				super();
			}
			/**
			 * 样式 - 背景
			 * @method styleForBackground
			 * @returns {string} 样式
			 */
			styleForBackground() {
				let currentBackgroundURL = super.getCustonBgURL() || super.getCurrentBackgroundURL();
				if (super.isUseBackground()) {
					return `body{background-color:transparent!important}body:after{content:"";position:fixed;top:0;bottom:0;left:0;right:0;background-image:url(${currentBackgroundURL})!important;background-size:cover!important;z-index:-1}#head{background-color:hsla(0, 0%, 100%, 0.65)!important;border-bottom-color:hsla(0, 0%, 52%, 0.3)!important}#content_left .c-container,#rs{border:none!important;background: hsla(0, 0%, 100%, 0.85)!important}#form>.s_ipt_wr.bg{background:#fff!important}#u>a{color: hsl(216, 80%, 63%)!important}#u>a:after{background:transparent!important;border:1px solid!important;}`;
				} else {
					return "";
				}
			}
			/**
			 * 样式 - 固定侧边栏
			 * @method styleForFixedSilder
			 * @returns {string} 样式
			 */
			styleForFixedSilder() {
				if (super.isUseFixedSilder()) {
					return "#s_tab{left:0!important;opacity:1!important;}";
				} else {
					return "";
				}
			}
			/**
			 * 样式  - 页面布局
			 * @method styleForPageLayout
			 * @returns {string} 样式
			 */
			styleForPageLayout() {
				let currentPageLayoutType = super.getCurrentPageLayoutType();
				switch (currentPageLayoutType) {
					case 1:
						return "";
					case 2:
						return super.getStyleContentForOne();
					case 3:
						return super.getStyleContentForTwo();
					case 4:
						return super.getStyleContentForThree();
				}
			}
			/**
			 * 样式 - 菜单
			 * @method styleForMenu
			 * @returns {string} 样式
			 */
			styleForMenu() {
				return super.getStyleContentForMenu();
			}
			/**
			 * 样式 - 结果页
			 * @method styleForCommand
			 * @returns {string} 样式
			 */
			styleForCommand() {
				return super.getStyleContentForCommon();
			}
			/**
			 * 导入样式
			 * @method import
			 */
			import() {
				super.add(this.styleForCommand())
					.add(this.styleForMenu())
					.add(this.styleForPageLayout())
					.add(this.styleForFixedSilder())
					.add(this.styleForBackground())
					.end();
			}
			/**
			 * 初始化
			 * @method init
			 */
			init() {
				this.import();
			}
			/**
			 * 执行
			 * @method execute
			 */
			execute() {
				this.init();
			}
		}
		/**
		 * 百家号
		 */
		class HideBaijiahao extends Base {
			constructor() {
				super();
				this.ELEMNET_ID = "mybaijiahao";
				this.FILTER_VALUE = "baijiahao";
				this.BAIDU_SEARCH_PATH = "https://www.baidu.com/s?ie=utf-8&wd=";
			}
			/**
			 * 根据关键字搜索
			 * @param url 部分url 如?wd=1&test=2
			 * @param keyworld 有搜索的关键词
			 */
			getKeyValue(url, keyworld) {
				//移除首字母
				if (url.startsWith("?")) {
					url = url.substr(1);
				}
				//转化为数组
				let arr = url.split("&").map(value => {
					return value.split("=");
				});
				//获取关键值
				for (let [name, value] of arr) {
					if (name === keyworld) {
						return value;
					}
				}
			}
			/**
			 * 获取关键词
			 * @param url 部分url 如?wd=1&test=2
			 */
			getSearchKeyword(url) {
				let name = "wd";
				return this.getKeyValue(url, name);
			}
			/**
			 * 重定向
			 */
			redirect() {
				let filterValue = this.FILTER_VALUE;
				let templateURL = this.BAIDU_SEARCH_PATH;
				let keyValue = this.getSearchKeyword(location.search);
				if (!keyValue.includes(filterValue)) {
					location.href = templateURL + keyValue + " -" + filterValue;
				}
			}
			/**
			 * 隐藏过滤值
			 */
			hidefilterValue() {
				let keyValue = " -" + this.FILTER_VALUE;
				let reg = RegExp(keyValue);
				let input = document.getElementById("kw");
				input.value = input.value.replace(reg, "");
			}
			/**
			 * 显示输入值
			 */
			showInputValue() {
				let input = document.getElementById("kw");
				input.style.visibility = "visible";
			}
			/**
			 * 隐藏输入值
			 */
			hideinputValue() {
				let style = new Style();
				style.add("#kw{visibility:hidden}");
				style.end();
			}
			/**
			 * 判断是否存在新的输入框
			 */
			hasNewInput() {
				return !!document.getElementById(this.ELEMNET_ID);
			}
			/**
			 * 是新的input和旧的input内容保持
			 */
			replaceInputContent() {
				let input = document.getElementById(this.ELEMNET_ID);
				let oldInput = document.getElementById("kw");
				input.value = oldInput.value.trim().replace(/\s-baijiahao/, "");
			}
			/**
			 * 插入新的输入框:用于映射数据
			 */
			insertNewInput() {
				let container = document.getElementsByClassName("s_ipt_wr")[0];
				let oldInput = document.getElementById("kw");
				let input = document.createElement("input");
				input.id = this.ELEMNET_ID;
				input.type = "text";
				// input.autofocus = true;
				input.autocomplete = "off";
				input.value = oldInput.value.trim().replace(/\s-baijiahao/, "");
				input.setAttribute("maxlength", "255");
				container.appendChild(input);
				Promise.resolve().then(() => {
					input.blur();
				});
			}
			/**
			 * 对新的输入框绑定事件
			 */
			bindNewInputEvent() {
				let input = document.getElementById(this.ELEMNET_ID);
				let oldInput = document.getElementById("kw");
				input.addEventListener("keyup", () => {
					if (input.value.trim() !== "") {
						oldInput.value =
							input.value.replace(/\s-baijiahao/, "") +
							" -" +
							this.FILTER_VALUE;
					}
				}, false);
				input.blur();
				oldInput.blur();
			}
			/**
			 * 初始化
			 */
			init() {
				//重定向
				this.redirect();
				//隐藏值
				this.hideinputValue();
				Baidu.ready = () => {
					if (!this.hasNewInput()) {
						this.insertNewInput();
						this.bindNewInputEvent();
					} else {
						this.replaceInputContent();
					}
					//    this.showInputValue();
				};
			}
			/**
			 * 执行
			 */
			execute() {
				if (super.isUseHideBaiJiaHao()) {
					//this.init();
				}
			}
		}
		/**
		 * 菜单功能页
		 * @class MenuItemsOptions
		 * @extends Base
		 * @implements Template
		 */
		class MenuItemsOptions extends Base {
			constructor() {
				super();
				this.CUSTOM_LAYOUT_TAG_NAME = "baidupage";
				this.CUSTOM_SWITCH_TAG_NAME = "baiduswitch";
				this.UPDATE_BACKGROUND_ID_NAME = "baiduupdatebackground";
			}
			/**
			 * 获取菜单列表元素 ID 名称
			 */
			getMenuItemsIdName() {
				return super.getMenuItemsIdName();
			}
			/**
			 * 获取菜单保存按钮 ID 名称
			 */
			getMenuSaveIdName() {
				return super.getMenuSaveIdname();
			}
			/**
			 * 获得 HTML - 页面布局选项
			 * @param content 显示的内容
			 * @param layoutType 页面布局类型
			 */
			getContentPageSelect(content, layoutType) {
				let checked = super.getCurrentPageLayoutType() === layoutType ? "checked" : "";
				return `<li><input type="radio" name="${this.CUSTOM_LAYOUT_TAG_NAME}" value="${layoutType}" ${checked}>${content}</li>`;
			}
			/**
			 * 获得 HTML - 功能选项选项
			 * @param content 显示的内容
			 * @param selection 功能配置
			 */
			getContentFunSelect(content, name, isChecked) {
				let checked = !!isChecked ? "checked" : "";
				return `<li><input type="checkbox" name="${this.CUSTOM_SWITCH_TAG_NAME}" value="${name}" ${checked}>${content}</li>`;
			}
			/**
			 * 获得 HTML - 保存
			 * @param content 显示的内容
			 */
			getContentSava(content) {
				let menuSaveIdName = this.getMenuSaveIdName();
				return `<input id='${menuSaveIdName}' type='button' style='margin-top:3px;display:block;width:100%' value='${content}'>`;
			}
			/**
			 *
			 */
			getContentCustomBackground(content) {
				let updateBgIdName = this.UPDATE_BACKGROUND_ID_NAME;
				return `<input id='${updateBgIdName}' type='button' style='margin-top:3px;display:block;width:100%' value='${content}'>`;
			}
			//获取整体 HTML
			getContent() {
				let content = "";
				content += "<ol>页面选择";
				content += this.getContentPageSelect("普通页面", 1);
				content += this.getContentPageSelect("单页居中", 2);
				content += this.getContentPageSelect("双页居中", 3);
				content += this.getContentPageSelect("三页居中", 4);
				content += "</ol>";
				content += "<ol>功能选择";
				content += this.getContentFunSelect("去除重定向", super.getUseRedirectName(), super.isUseRedirect());
				content += this.getContentFunSelect("自动下一页", super.getUseAuoLoadNextPageName(), super.isUseAuoLoadNextPage());
				content += this.getContentFunSelect("固定侧边栏", super.getUseFixedSilderName(), super.isUseFixedSilder());
				content += this.getContentFunSelect("加载背景", super.getUseBackgroundName(), super.isUseBackground());
				// content += this.getContentFunSelect("屏蔽百家号", super.getUseHideBaiJiaHaoName(), super.isUseHideBaiJiaHao());
				content += "</ol>";
				content += this.getContentCustomBackground("修改背景");
				content += this.getContentSava("保存");
				return content;
			}
			/**
			 * 更新背景6图片地址
			 */
			updateBgURL() {
				let backgroundURL = prompt("请输入自定义的壁纸链接:");
				let reg = /^https?\:.+\.[(jpg)|(png)|(jpeg)|(gif)|(bmp)$]/;
				if (!!reg.test(backgroundURL)) {
					super.setValue(super.getCustomBgName(), backgroundURL);
					location.href = location.href;
				}
			}
			/**
			 * 绑定保存事件
			 */
			bindSavaClick() {
				let sava = document.getElementById(Configs.MENU_SAVA_ID);
				sava.onclick = event => {
					let e = event || window.event;
					//页面布局选项
					let radios = document.getElementsByName(this.CUSTOM_LAYOUT_TAG_NAME);
					for (let i = 0, radio;
						(radio = radios[i++]);) {
						if (!!radio.checked) {
							let name = super.getPageLayoutName();
							let value = radio.value;
							super.setValue(name, value);
							break;
						}
					}
					//功能选项
					let checkboxs = document.getElementsByName(this.CUSTOM_SWITCH_TAG_NAME);
					for (let i = 0, checkbox;
						(checkbox = checkboxs[i++]);) {
						let name = checkbox.value;
						if (!!checkbox.checked) {
							super.setValue(name, true);
						} else {
							super.setValue(name, false);
						}
					}
					e.stopPropagation();
					location.href = location.href;
				};
			}
			bindUpdateBackgroundEvent() {
				let element = document.getElementById(this.UPDATE_BACKGROUND_ID_NAME);
				element.onclick = () => {
					this.updateBgURL();
				};
			}
			/**
			 * 插入节点
			 */
			insertMenuItemsElement() {
				let container = document.getElementById("u"),
					content = this.getContent(),
					div = document.createElement("div");
				div.id = this.getMenuItemsIdName();
				div.style.display = "none";
				div.innerHTML = `<div>${content}</div>`;
				container.insertBefore(div, container.firstChild);
			}
			isExistMenuItemsElement() {
				return !!document.getElementById(this.getMenuItemsIdName());
			}
			/**
			 * 初始化
			 */
			init() {
				if (!this.isExistMenuItemsElement()) {
					this.insertMenuItemsElement();
					//异步执行绑定事件
					Baidu.delayRun(() => {
						this.bindSavaClick();
						this.bindUpdateBackgroundEvent();
					}, 10);
				}
			}
			/**
			 * 执行
			 */
			execute() {
				Baidu.ready = () => {
					try {
						this.init();
					} catch (e) {
						throw new Error(e);
					}
				};
			}
		}
		/**
		 * 菜单按钮
		 * @class CustomButton
		 *
		 */
		class CustomMenuButton extends Base {
			constructor() {
				super();
				this.MenuItemsOptions = new MenuItemsOptions();
			}
			/**
			 * 第二次单击隐藏
			 */
			bindClickHide() {
				document.onclick = event => {
					let e = event || window.event;
					let container = document.getElementById("container");
					let items = document.getElementById(Configs.MENU_ITEMS_ID);
					let isScreenClick = e.target ?
						e.target == container :
						e.srcElement == container;
					if (isScreenClick) {
						items.style.display = "none";
					}
				};
			}
			/**
			 * 单击打开功能选项页
			 */
			bindClick() {
				let container = document.getElementById(Configs.CUSTOM_BUTTON_ID);
				container.onclick = event => {
					let e = event || window.event;
					let items = document.getElementById(Configs.MENU_ITEMS_ID);
					let style = items.style;
					let isShow = style.display === "block";
					if (isShow) {
						style.display = "none";
					} else {
						style.display = "block";
					}
					//阻止冒泡
					e.stopPropagation();
				};
			}
			/**
			 * 获取自定义按钮的名称
			 */
			getCustomButtonIdName() {
				return super.getCustomButtonIdName();
			}
			/**
			 * 插入节点
			 */
			insertCustomButtonElement() {
				let container = document.getElementById("u");
				let div = document.createElement("a");
				div.id = this.getCustomButtonIdName();
				div.innerHTML = "自定义";
				container.insertBefore(div, container.firstChild);
			}
			/**
			 * 是否存在自定义按钮
			 */
			isExistCustomButtonElement() {
				return !!document.getElementById(this.getCustomButtonIdName());
			}
			/**
			 * 初始化
			 */
			init() {
				if (!this.isExistCustomButtonElement()) {
					this.insertCustomButtonElement();
					//异步绑定事件
					Baidu.delayRun(() => {
						this.bindClick();
						this.bindClickHide();
					}, 10);
				}
			}
			/**
			 * 执行
			 */
			execute() {
				Baidu.ready = () => {
					this.init();
				};
				//执行菜单功能面板
				Promise.resolve().then(() => {
					this.MenuItemsOptions.execute();
				});
			}
		}
		
		/**
		 * 过滤内容
		 */
		class FilterContent extends Base{
			removeAds(item){
				let styleContent = item.getAttribute("style");
				// console.log(styleContent);
				if (styleContent !== null ) {
					// item.parentNode.removeChild(item);
					item.removeAttribute("style");
					return true;
				}
				return false;
			}
			
			removeDryTpl(item){
				let tplBlackLists = [
					//"wenda_abstract_pc",
					"med_qa",
					"b2b_straight",
					"recommend_list",
					"ads_b2c_universal_card",
					"b2b_factory2",
					"vmp_zxenterprise_new",
					"short_video",
				];
				let tplCurrentContent = item.getAttribute("tpl");
				// console.log(tplCurrentContent);
				for (let tplBlackContent of tplBlackLists) {
					if (tplBlackContent === tplCurrentContent) {
						// item.parentNode.removeChild(item);
						// alert(tplCurrentContent);
						return true;
					}
				}
				return false;
			}
			
			
			removeRepeatElement(item){
					if (item.id === "1" ){
						let selectors = item.querySelectorAll("a.m.c-gap-left");
						for (let selector of selectors){
					        let content = selector.textContent || selector.innerText;
							if (content == "广告" ){
								return true;
							}
						}
					}
				return false;
			}
			
			//移除不相关数据
			isDryElement(item) {
				let isDry = false;
				
				if (!isDry) {
					isDry = this.removeAds(item);
				}
				
				if (!isDry) {
					isDry = this.removeDryTpl(item);
				}
				
				if (!isDry){
					isDry = this.removeRepeatElement(item);
				}
				
				return isDry;
			}
		}
		
		/**
		 * 过滤内容
		 */
		class FirstFilter extends FilterContent{
			
			getItems(){
				return document.getElementById("container").querySelectorAll("#content_left>.c-container,#content_left>.result-op:not([class*='c-container'])")
			}
			
			removeItem(item){
				// console.log(item);
				item.classList.add("bd_none");
				item.parentNode.removeChild(item);
			}
			
			clearUselessItem(){
				let items = this.getItems();
				for(let item of items){
					let isDry = super.isDryElement(item);
					if (isDry){
						this.removeItem(item);
					}
				}
			}
			
			/**
			 * 初始化
			 */
			init() {
				this.clearUselessItem();
			}
			/**
			 * 执行
			 */
			execute() {
				Baidu.ready = () => {
					this.init();
				};
			}
		}
		
		
		
		/**
		 * 多页布局
		 * @class MUlPageLayout
		 */
		class MulPageLayout extends FilterContent {
			constructor() {
				super();
				this.container = null;
				this.lists = null;
				//多列布局值集合
				this.layoutTypes = [3, 4];
				//当前布局类型
				this.layoutType = super.getCurrentPageLayoutType();
				//根据 类名 模拟高度
				this.VIRTUAL_HEIGHTS_BY_CLASSNAE = [{
						name: ".c-container>.op-b2b-straight",
						value: 420
					},
					{
						name: ".c-container>.c-offset",
						value: 320
					},
					{
						name: ".c-container>.c-border",
						value: 270
					},
					{
						name: ".c-container>.op-tieba-general-lookmore",
						value: 260
					},
					{
						name: ".c-container>.op-img-address-desktop-cont",
						value: 210
					},
					{
						name: ".c-container>.c-gap-top-small",
						value: 130
					}
				];
				//根据 srcid 属性值 模拟高度
				this.VIRTUAL_HEIGHTS_BY_SRCID = [{
						name: 1599,
						value: 128
					},
					{
						name: 1508,
						value: 170
					},
					{
						name: 1527,
						value: 170
					},
					{
						name: 1528,
						value: 220
					},
					{
						name: 1529,
						value: 220
					},
					{
						name: 1537,
						value: 510
					},
					{
						name: 1539,
						value: 280
					},
					{
						name: 1545,
						value: 230
					},
					{
						name: 1547,
						value: 230
					},
					{
						name: 4515,
						value: 540
					},
					{
						name: 5103,
						value: 400
					},
					{
						name: 8041,
						value: 260
					},
					{
						name: 8191,
						value: 200
					},
					{
						name: 10,
						value: 260
					},
					{
						name: 13,
						value: 220
					},
					{
						name: 19,
						value: 200
					}
				];
			}
			/**
			 * 是否为多列布局
			 * @return {boolean}
			 */
			isMulLayout() {
				let layoutType = this.layoutType;
				let layoutTypes = this.layoutTypes;
				return layoutTypes.includes(layoutType);
			}
			/**
			 * 初始化
			 */
			resetDOM() {
				this.container = null;
				this.lists = null;
			}
			/**
			 * 获取 #content_left 节点
			 */
			getDomForContainer() {
				if (!this.container) {
					this.container = document.getElementById("content_left");
				}
				return this.container;
			}
			getDomForSearchResult() {
				// let container = this.getDomForContainer();
				// return container.getElementsByClassName("c-container");
				return document.querySelectorAll("#content_left>.c-container");
			}
			/**
			 * 获取 list 节点
			 */
			getDomForLists() {
				if (!this.lists) {
					let container = this.getDomForContainer();
					this.lists = container.getElementsByClassName("list");
				}
				return this.lists;
			}
			//获取list高度合集
			getListsHeight() {
				let lists = this.getDomForLists();
				let heights = [];
				for (let i = 0, list;
					(list = lists[i++]);) {
					heights.push(list.clientHeight);
				}
				return heights;
			}
			/**
			 * 模拟高度
			 * 防止获取真实高度导致性能问题
			 * @param item
			 */
			getItemVirtualHeight(item) {
				// 获取虚拟高度合集
				let VIRTUAL_DATAS = this.VIRTUAL_HEIGHTS_BY_SRCID;
				//默认高度
				let height = 122;
				//匹配 srcid 正则
				let reg = /srcid="\d+"/;
				//获取srcid
				let srcid = Number(/\d+/.exec(reg.exec(item.outerHTML)));
				//根据srcid值获取虚拟高度
				for (let i = 0, data;
					(data = VIRTUAL_DATAS[i++]);) {
					//大于 10000 直接赋予新高度
					if (srcid > 10000) {
						height = 310;
						break;
					} else if (srcid === data["name"]) {
						height = data["value"];
						break;
					}
				}
				return height;
			}
			/**
			 * 01 - 添加内容到lists
			 * 使用 DOM 到 DOM, 即将 #content_left 下的子元素移动到 lists
			 * 注意:需要提前将 DOM片段 添加到 #content_left下
			 */
			addWebUseDomToDom_NoUserful() {
				let container = this.getDomForContainer();
				let lists = this.getDomForLists();

				let blackLists = [
					`not([tpl='wenda_abstract_pc'])`,
					`not([tpl='med_qa'])`,
					`not([tpl='b2b_straight'])`,
				]
				let selector = "#content_left>.c-container" + ":" + blackLists.join(":");
				let oldElements = container.querySelectorAll(selector);
				// let olditems = container.querySelectorAll(selector);
				let heights = this.getListsHeight();
				let frames = [];
				let items = oldElements;

				//获取旧元素的高度
				let oldElementsHeights = [];
				for (let item of oldElements) {
					oldElementsHeights.push(item.clientHeight);
				}

				//初始化
				for (let i = 0, length = lists.length; i < length; i++) {
					//缓存
					frames.push(document.createDocumentFragment());
				}

				//将 item 添加到虚拟DOM中
				for (let i = 0, item;
					(item = items[i++]);) {
					//获取最小的高度值
					let minHeight = Reflect.apply(Math.min, null, heights);
					//获取最小的高度的索引值
					let index = heights.indexOf(minHeight);
					//添加到高度
					//heights[index] += item.clientHeight;
					heights[index] += oldElementsHeights[i - 1];
					//缓存
					frames[index].appendChild(item);

				}

				//隐藏旧节点
				let needRemoveElements = container.querySelectorAll("#content_left>.c-container");
				for (let item of needRemoveElements) {
					//1.隐藏元素
					item.style.display = 'none';
					//2.延迟删除
					Promise.resolve().then(() => {
						item.parentNode.removeChild(item);
					});
				}

				//添加到真实DOM
				for (let i = 0, length = lists.length; i < length; i++) {
					lists[i].appendChild(frames[i]);
				}

				//删除节点
				// for(let item of needRemoveElements){
				//     item.parentNode.removeChild(item);
				// }

			}
			
			removeAds(item){
				return super.removeAds(item);
			}
			
			removeDryTpl(item){
				return super.removeDryTpl(item);
			}
			
			
			removeRepeatElement(item){
				return super.removeRepeatElement(item);
			}
			
			

			//移除不相关数据
			removeDryElement(items) {
				
				for (let i = 0, item; item = items[i++];) {
					
					let isRemove = false;
					
					if (!isRemove) {
						isRemove = this.removeAds(item);
					}
					
					if (!isRemove) {
						isRemove = this.removeDryTpl(item);
					}
					
					if (!isRemove){
						isRemove= this.removeRepeatElement(item);
					}
					
					if (isRemove){
						item.classList.add("baidu_remove")
						item.setAttribute("style","display:none!important;");
						item.innerHTML= "";
						// i--;
					}
					
					
				}
				return items;
			}
			
			//移除不相关数据
			isDryElement(item) {
				let isDry = false;
				
				if (!isDry) {
					isDry = this.removeAds(item);
				}
				
				if (!isDry) {
					isDry = this.removeDryTpl(item);
				}
				
				if (!isDry){
					isDry = this.removeRepeatElement(item);
				}
				
				return isDry;
			}
			
			/**
			 * 00 - 添加内容到lists
			 * 使用 DOM 到 DOM, 即将 #content_left 下的子元素按顺序移动到 lists
			 */
			addWebUseDomToDomWithOder() {
				let content_left = document.getElementById("content_left");
				content_left.classList.add("bd-hide");
				
				//获取所有元素
				let items = this.getDomForSearchResult();
				// let oldItems = document.getElementById("content_left").cloneNode(true).querySelectorAll(".c-container");
				let lists = this.getDomForLists();
				let listsLength = lists.length;
				
				//获取高度合集
				let itemHeights = [];
				let sumItemHeight = 0;
				let averageItemHeight = 0;
				for (let i = 0, length = items.length; i < length; i++){
					let item = items[i];
					let clientHeight = Number(item.clientHeight);
					let isDry = this.isDryElement(item);
					if (isDry){
						item.classList.add("bd-none");
						itemHeights[i] = 0 ;
						sumItemHeight += 0;
					}else{
						itemHeights[i] = clientHeight;
						sumItemHeight += clientHeight;
					}
					
				}
				
				averageItemHeight = sumItemHeight > 300 ? (sumItemHeight-100)/listsLength : 0;
				
				// console.log("itemHeights:",itemHeights);
				// console.log("sumItemHeight:", sumItemHeight);
				// console.log("averageItemHeight", averageItemHeight);
				
				//隐藏元素
				
				content_left.classList.add("bd-none");
				
				//移动元素
				let listIndex = 0;
				let virtualHeight = 0;
				let targetHeight = averageItemHeight;
				for(let i = 0, length = itemHeights.length; i < length; i++){
					let itemHeight = itemHeights[i];
					let item = items[i];
					
					if (listIndex >= listsLength){
						break;
					}
					
					if (targetHeight === 0){
						break;
					}
					
					if (itemHeight === 0){
						continue;
					}
					
					if (!item){
						continue;
					}
					
					
					
					virtualHeight += itemHeight;
					// console.log(virtualHeight);
					if(virtualHeight < targetHeight){
						lists[listIndex].appendChild(item);
					}else{
						targetHeight += targetHeight;
						listIndex ++;
					}
					
				}
				
				//屏蔽非必须元素
				let sytleContent = `#content_left>.c-container{display:none!important;}`;
				
				super.addStyle(sytleContent);
				
				//开启显示
				content_left.classList.remove("bd-none","bd-hide");
				
				return;
				
				
				
				
				
			
			}

			/**
			 * 01 - 添加内容到lists
			 * 使用 DOM 到 DOM, 即将 #content_left 下的子元素移动到 lists
			 * 注意:需要提前将 DOM片段 添加到 #content_left下
			 */
			addWebUseDomToDom() {
				let items = this.getDomForSearchResult();
				let lists = this.getDomForLists();
				let heights = this.getListsHeight();
				let itemHeighs = [];
				for (let i = 0, item; item = items[i++];){
					itemHeighs[i] = item.clientHeight;
				}
				
				//删除非必须结果列表
				items = this.removeDryElement(items);
				
				//插入元素
				for (let i = 0, item;(item = items[i++]);) {
					if (item.classList.contains("baidu_remove")){
						item.removeAttribute("id");
						continue;
					}
					//获取最小的高度值
					let minHeight = Reflect.apply(Math.min, null, heights);
					//获取最小的高度的索引值
					let index = heights.indexOf(minHeight);
					//添加到高度到高度数组中,以便获取最小的高度
					
					// heights[index] += item.clientHeight;
					heights[index] += itemHeighs[i];

					//插入元素
					lists[index].appendChild(item);
				}
				
				
				

			}
			/**
			 * 02 - 添加内容到lists
			 *
			 *
			 * @param frame DOM片段
			 */
			addWebUseFrameToDom(frame) {
				//获取lists
				let lists = this.getDomForLists();
				//获取列表合集
				let items = frame.getElementsByClassName("c-container");
				//获取初始化高度集合
				let heights = this.getListsHeight();
				//将 item 添加到list中
				for (let i = 0, item;
					(item = items[i]);) {
					//获取高度合集
					//获取最小的高度值
					let minHeight = Reflect.apply(Math.min, null, heights);
					//获取最小的高度的索引值
					let index = heights.indexOf(minHeight);
					//添加到list中
					lists[index].appendChild(item);
					//更新高度
					heights = this.getListsHeight();

					item.parentNode.removeChild(item);
				}
			}
			/**
			 * 03 - 添加内容到 lists
			 * 使用"模拟高度"进行添加
			 *
			 * @param frame DOM片段
			 */
			addWebUseVirtualToDom(frame) {
				let lists = this.getDomForLists();
				let frames = [];
				//获取列表合集
				let items = frame.getElementsByClassName("c-container");

				if (items.length <= 0) {
					return;
				}
				//获取初始化高度集合
				let heights = this.getListsHeight();
				//初始化
				for (let i = 0, length = lists.length; i < length; i++) {
					frames[i] = document.createDocumentFragment();
				}
				//将 item 添加到list中
				for (let i = 0, item;
					(item = items[i]);) {
					//获取最小的高度值
					let minHeight = Reflect.apply(Math.min, null, heights);
					//获取最小的高度的索引值
					let index = heights.indexOf(minHeight);
					//获取模拟高度
					heights[index] += this.getItemVirtualHeight(item);
					//添加到list中
					frames[index].appendChild(item);
				}
				Baidu.delayRun(() => {
					//插入内容到list
					for (let i = 0, length = lists.length; i < length; i++) {
						lists[i].appendChild(frames[i]);
					}
				}, 1);
			}
			/**
			 * 是否存在list节点
			 */
			hasListNode() {
				let lists = this.getDomForLists();
				return lists.length > 0;
			}
			/**
			 * 向网页添加列表
			 */
			insertListNode() {
				let layoutType = this.layoutType;
				let container = this.getDomForContainer();
				let frame = document.createDocumentFragment();
				//创建list节点
				for (let i = 1, div, length = layoutType; i < length; i++) {
					div = document.createElement("div");
					div.id = "list" + i;
					div.className = "list";
					frame.appendChild(div);
				}
				//将节点插入到文档中
				container.insertBefore(frame, container.firstChild);
				return this;
			}
			/**
			 * 添加内容到 lists
			 */
			addListContent(frame) {
				this.resetDOM();
				Baidu.delayRun(() => {
					this.addWebUseVirtualToDom(frame);
				}, 0);
			}

			/**
			 * 初始化
			 */
			init() {
				try {
					this.resetDOM();
					if (!this.hasListNode()) {
						//插入list节点并刷新节点
						this.insertListNode();
					}
					this.addWebUseDomToDomWithOder();

				} catch (error) {
					console.error(error);
				}
			}

			isExistContentLeft() {
				let container = document.getElementById("content_left");
				return container.length > 0 ? true : false;
			}




			/**
			 * 执行
			 */
			execute() {
				if (this.isMulLayout()) {
					Baidu.ready = () => {
						this.init();
					};
				}
			}
		}
		/**
		 * 自动加载下一页
		 * @class AutoLoadNextPage
		 */
		class UseAutoLoadNextPage extends Base {
			/**
			 * 构造函数
			 */
			constructor() {
				super();
				//实例化 - 多页布局
				this.MulpageLayout = new MulPageLayout();
				//实例化 - 重定向
				this.Redirect = new Redirect();
				//实例化 -
				this.Parser = new DOMParser();
			}
			/**
			 * 重置
			 */
			reset() {
				//是否第一次执行
				this.isFirstRun = true;
				//是否导入过
				(this.isImport = false),
				//下一页真实地址
				(this.realNextURL = null);
				//模板地址
				this.templateURL = null;
				//步进值(默认值)
				this.step = 0;
				//每页起始值
				this.count = 0;
				//偏移高度
				this.offsetHight = 1000;
				//缓存
				this.cache = [];
				//缓存量
				this.cacheSize = 1;
				//节点缓存
				this.container = document.getElementById("content_left");
			}
			/**
			 * 获取真实下一个的地址
			 * @returns {string} 下一页地址
			 */
			getNextPageRealURL() {
				if (!this.realNextURL) {
					let page = document.getElementById("page");
					this.realNextURL = page
						.getElementsByClassName("n")[0]
						.getAttribute("href");
				}
				return this.realNextURL;
			}
			/**
			 * 获取步进值
			 * @returns {number} 步进值
			 */
			getNextPageStepValue() {
				if (!this.step) {
					//提取 &pn=20 中的20
					let regParam = /(&pn=\d+)/;
					let regValue = /\d+/;
					let result = regParam.exec(this.getNextPageRealURL());
					this.step = Number(regValue.exec(result));
				}
				return this.step;
			}
			/**
			 * 获取模板地址
			 * @returns {string} this.templateURL: 模板地址
			 */
			getTempletURL() {
				this.templateURL =
					this.templateURL ||
					this.getNextPageRealURL().replace(/&pn=\d+/, "");
				return this.templateURL;
			}
			/**
			 * 获取下一页合成地址
			 * @returns {sting} 下一页的地址
			 */
			getNextPageComposeURL() {
				this.count += this.getNextPageStepValue();
				return this.getTempletURL() + `&pn=${this.count}`;
			}
			/**
			 * 判断是否存在缓存
			 * @returns {boolean} 存在: true
			 * @returns {boolean} 不存在:false
			 */
			hasCache() {
				return this.cache.length >= this.cacheSize;
			}
			/**
			 * 将响应文本添加到缓存中
			 * @param responseText 响应文本
			 */
			addCache(responseText) {
				//转化为DOM对象
				let reg = /<body[\s\S.]+<\/body>/;
				let parser = this.Parser;
				let htmlDoc = parser.parseFromString(reg.exec(responseText)[0], "text/html");
				//获取Items
				let items = htmlDoc
					.getElementById("content_left")
					.getElementsByClassName("c-container");
				//添加到缓存
				let frame = document.createElement("div");
				//appendchild 自动执行迭代器 导致 i++ (小心);
				for (let i = 0, item;
					(item = items[i]);) {
					frame.appendChild(item);
				}
				//加入缓存
				this.cache.push(frame);
			}
			/**
			 * 监测滚动位置
			 */
			checkScrollPosition() {
				let element = document.documentElement,
					clientHeight = element.clientHeight,
					scrollTop = element.scrollTop ||
					window.pageYOffset ||
					document.body.scrollTop ||
					0,
					scrollHeight = Number(element.scrollHeight);
				//判断
				if (clientHeight + scrollTop + this.offsetHight >
					scrollHeight) {
					this.removeScrollEvent();
					this.task();
				}
			}
			/**
			 * 移除滚动事件
			 */
			removeScrollEvent() {
				document.onscroll = event => {
					let e = event || window.event;
					e.preventDefault();
				};
				return this;
			}
			/**
			 * 绑定滚动触发事件
			 */
			bindScrollEvent() {
				document.onscroll = () => {
					this.checkScrollPosition();
				};
			}
			/**
			 * 将 DOM 插入到相应的位置
			 */
			addItemsToWeb() {
				//插入内容到DOM节点
				if (this.MulpageLayout.isMulLayout()) {
					this.MulpageLayout.addListContent(this.cache.shift());
				} else {
					//this.container.innerHTML += this.cache.shift().innerHTML;
					let div = document.createElement("div");
					div.id = String("Baidu-" + String(new Date().getTime()));
					div.innerHTML = this.cache.shift().outerHTML;
					this.container.appendChild(div);
				}
			}
			/**n
			 * 发送请求
			 */
			requireNextPageContent() {
				super.xmlhttpRequest({
					method: "GET",
					url: this.getNextPageComposeURL(),
					timeout: 3000,
					responseType: "text",
					onload: response => {
						if (response.status === 200 ||
							response.status === 304) {
							//如果不存在缓存,再发一次
							if (!this.hasCache()) {
								this.requireNextPageContent();
							}
							//添加响应文本到缓存
							this.addCache(response.responseText);
							//开始导入数据到网页
							if (!this.isImport) {
								this.import();
							}
						}
					},
					onerror: response => {
						console.error(response);
					}
				});
			}
			/**
			 * 导入数据到网页
			 */
			import() {
				this.isImport = true;
				//添加内容到网页
				this.addItemsToWeb();
				//重定向
				this.Redirect.execute();
				//绑定滚动事件
				Baidu.delayRun(() => {
					this.removeScrollEvent().bindScrollEvent();
				}, 3);
			}
			/**
			 * 任务调度
			 * @param URL
			 */
			task() {
				//设置有导入过
				this.isImport = false;
				//发送请求
				this.requireNextPageContent(); //如果有缓存
				//如果存在缓存
				if (this.hasCache()) {
					this.import();
				}
			}
			/**
			 * 隐藏元素
			 */
			hideElement() {
				let rs = document.getElementById("rs_new");
				let page = document.getElementById("page");
				rs.style.visibility = "hidden";
				page.style.visibility = "hidden";
			}
			/**
			 * 初始化
			 */
			init() {
				//重置配置
				this.reset();
				//开始加载
				this.task();
				//隐藏元素
				Baidu.delayRun(() => {
					this.hideElement();
				}, 3);
			}
			/**
			 * 入口
			 * @returns {void}
			 */
			execute() {
				if (super.isUseAuoLoadNextPage()) {
					Baidu.ready = () => {
						this.init();
					};
				}
			}
		}
		/**
		 * 重定向
		 * @class Redirect
		 */
		class Redirect extends Base {
			constructor() {
				super();
				//重定向后需添加类名(防止重复重定向)
				this.REDIRECT_CLASS_NAME = "isredirect";
			}
			/**
			 * 重定向
			 * @param item a节点
			 */
			redirect(item) {
				super.xmlhttpRequest({
					method: "HEAD",
					url: item.href,
					onload: response => {
						let realURL = response.finalUrl;
						let whiteLists = [
							"wenku.baidu.com",
						]
						//加入重定向标志
						item.className = this.REDIRECT_CLASS_NAME;
						//移除不必要的属性
						item.removeAttribute("data-click");
						//排除白名单,防止有些网站不能正常打开
						for (let list of whiteLists) {
							if (realURL.includes(list)) {
								return;
							}
						}
						//替换地址
						item.href = realURL;

						//去除百家号
						//console.log(new Base().isUseHideBaiJiaHao());
						// if (realURL.includes("baijiahao") && new Base().isUseHideBaiJiaHao()) {
						// 	let selector = item.parentNode.parentNode;
						// 	if (selector.classList.contains("c-container")) {
						// 		selector.classList.add("bd-none");
						// 	}
						// }

					}
				});
			}
			/**
			 * 获取未重定向链接
			 */
			getItems() {
				return document.getElementById("content_left").querySelectorAll("h3>a:not([class])");;
			}
			/**
			 * 开始
			 */
			start() {
				
				let items = this.getItems();
				for (let i = 0, item;
					(item = items[i++]);) {
					//延时执行
					Baidu.delayRun(() => {
						this.redirect(item);
					}, i);
				}
			}
			/**
			 * 初始化
			 */
			init() {
				Baidu.delayRun(() => {
					this.start();
				}, 1);
			}
			/**
			 * 执行
			 */
			execute() {
				if (super.isUseRedirect()) {
					Baidu.ready = () => {
						this.init();
					};
				}
			}
		}
		/**
		 * 回到顶部
		 * @class BackToTop
		 */
		class BackToTop {
			/**
			 * 单击回到顶部
			 */
			bindClickEvent() {
				let container = document.getElementsByClassName("s_form")[0];
				container.onclick = event => {
					let e = event || window.event;
					let isContainer = e.target ?
						e.target === container :
						e.srcElement === container;
					if (isContainer) {
						//setInterval方案
						let element = document.documentElement;
						let body = document.body;
						let node = element.scrollTop ? element : body;
						let top = node.scrollTop;
						let step = top / 20;
						let timer = setInterval(() => {
							if (node.scrollTop <= 0) {
								node.scrollTop = 0;
								clearInterval(timer);
							}
							node.scrollTop -= step;
						}, 10);
						e.stopPropagation();
					}
				};
			}
			/**
			 * 初始化
			 */
			init() {
				this.bindClickEvent();
			}
			/**
			 * 执行
			 */
			execute() {
				Baidu.ready = () => {
					this.init();
				};
			}
		}
		/**
		 * 谷歌
		 * 双击使用 google 搜索
		 * @class Google
		 */
		class Google {
			constructor() {
				this.GOOGLE_SEARCH_PATH = "https://www.google.com/search?q=";
			}
			getInputContent() {
				return document.getElementById("kw").value.trim();
			}
			googleSearch() {
				let url = this.GOOGLE_SEARCH_PATH +
					encodeURIComponent(this.getInputContent());
				window.open(url);
			}
			/**
			 * 绑定双击打开Google搜索
			 */
			bindDoubleClickEvent() {
				let button = document.getElementById("su");
				button.ondblclick = () => {
					this.googleSearch();
				};
			}
			/**
			 * 初始化
			 */
			init() {
				this.bindDoubleClickEvent();
			}
			/**
			 * 执行
			 */
			execute() {
				Baidu.ready = () => {
					this.init();
				};
			}
		}
		class ReplaceSearchEvent extends Base{
			
			search(searchContent){
				if (searchContent.trim() != "") {
					let url = "https://www.baidu.com/s?ie=UTF-8&wd="+encodeURIComponent(searchContent.trim());;
					location.href = url;
				}
				
			}
			
			getSearchContent(){
				let selector = document.getElementById("kw");
				return selector.value;
			}
			
			replaceButtonClickEvent(){
				let selector = document.getElementById("su");
				// su.style.color = "red";
				su.onclick = ()=>{
					let searchContent = this.getSearchContent();
					// alert(searchContent);
					this.search(searchContent);
					return false;
				}
				
			}
			
			
			/**
			 * 初始化
			 */
			init() {
				try {
					this.replaceButtonClickEvent();
				} catch (error) {}
			}
			/**
			 * 执行
			 */
			execute() {
				Baidu.ready = () => {
					this.init();
				};
			}
		}
		
		
		/**
		 * 替换首页搜索栏
		 * @class ReplaceSearch
		 */
		class ReplaceSearch extends Base {
			constructor() {
				super();
				this.NEW_BAIDU_SEARCH_ID_NAME = "baiduinput";
				this.ASSOCIATION_ID_NAME = "badiduassociation";
				this.PANEL_ITEM_SELECED_CLASS = "baiduselected";
				this.SEARCH_DATA_NAME = "data-content";
				this.count = 0;
				this.BAIDU_SEARCH_PATH = "https://www.baidu.com/s?ie=UTF-8&wd=";
				this.BAIDU_ASSOCIATION_SEARCH_PATH = "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=";
			}
			/**
			 * 获取新搜索的内容
			 */
			getNewSearchInputContent() {
				return document.getElementById(this.NEW_BAIDU_SEARCH_ID_NAME).value.trim() || "";
			}
			/**
			 * 搜索
			 */
			search() {
				let inputContent = this.getNewSearchInputContent();
				if (inputContent !== "") {
					// if (!super.isUseHideBaiJiaHao()) {
					// 	location.href =
					// 		this.BAIDU_SEARCH_PATH +
					// 		encodeURIComponent(inputContent);
					// } else {
					// 	location.href =
					// 		this.BAIDU_SEARCH_PATH +
					// 		encodeURIComponent(inputContent) +
					// 		" -baijiahao";
					// }

					location.href =
						this.BAIDU_SEARCH_PATH +
						encodeURIComponent(inputContent);
				}
			}
			/**
			 * 是否显示面板
			 * @param isShow 是否显示面板
			 */
			isshowPannel(isShow = true) {
				let panel = document.getElementById(this.ASSOCIATION_ID_NAME);
				if (isShow) {
					panel.style.display = "none";
				} else {
					panel.style.display = "block";
				}
			}
			/**
			 * 插入节点
			 * 覆盖原来的搜索框
			 */
			coverBaiduInputElement() {
				//屏蔽原来文本输入
				let oldInput = document.getElementById("kw");
				oldInput.setAttribute("disabled", "disabled");
				let container = document.getElementById("s_kw_wrap") ||
					document.getElementsByClassName("s_ipt_wr")[0];
				let div = document.createElement("input");
				div.id = this.NEW_BAIDU_SEARCH_ID_NAME;
				div.type = "text";
				div.autofocus = true;
				div.autocomplete = "off";
				div.setAttribute("list", this.ASSOCIATION_ID_NAME);
				container.appendChild(div);
				//延时聚焦
				Promise.resolve().then(() => {
					document.getElementById(this.NEW_BAIDU_SEARCH_ID_NAME).focus();
				});
			}
			/**
			 * 绑定覆盖百度输入框事件
			 */
			bindCoverBaiduInputEvent() {
				/**
				 * 绑定提交事件
				 */
				let bindSubmit = () => {
					let button = document.getElementById("su");
					button.setAttribute("type", "button");
					button.onclick = event => {
						let e = event || window.event;
						this.search();
					};
				};
				bindSubmit();
				/**
				 * 检测输入
				 */
				let bindKeydown = () => {
					let input = document.getElementById(this.NEW_BAIDU_SEARCH_ID_NAME);
					input = document.getElementById("form");
					input.onkeydown = event => {
						let e = event || window.event;
						let keyCode = e.keyCode || e.which || e.charCode;
						if (keyCode === 13) {
							this.search();
						}
					};
				};
				bindKeydown();
			}
			/**
			 * 插入联想搜索面板
			 */
			inserAssociationPanel() {
				let datalist = document.createElement("ul");
				let input = document.getElementById("form");
				datalist.id = this.ASSOCIATION_ID_NAME;
				input.appendChild(datalist);
			}
			/**
			 * 开始联想搜索
			 */
			startAssociationSearch() {
				let input = document.getElementById(this.NEW_BAIDU_SEARCH_ID_NAME);
				input.oninput = () => {
					let inputContent = input.value.trim();
					let inputContentURL = this.BAIDU_ASSOCIATION_SEARCH_PATH + inputContent;
					let datalist = document.getElementById(this.ASSOCIATION_ID_NAME);
					//如果数据为空,则退出
					if (inputContent.length < 1) {
						datalist.innerHTML = "";
						return;
					}
					//与服务交换数据
					super.xmlhttpRequest({
						method: "GET",
						url: inputContentURL,
						timeout: 3000,
						responseType: "text",
						onload: response => {
							if (response.status === 200 ||
								response.status === 304) {
								let searchData = response.responseText;
								//unicode 编码转中文
								searchData = unescape(searchData.replace(/\\\u/g, "%u"));
								//定义正则
								let reg = /\[.*\]/g;
								let content = reg.exec(searchData)[0];
								//删除首尾字符 "[]"
								let datas = content.substr(1).substr(0, content.length - 2).split(",");
								//加载联想数据
								this.LoadAssociationSearchDatas(datas);
							}
						},
						onerror: response => {
							console.error(response);
						}
					});
				};
			}
			/**
			 * 加载联想数据到面板中
			 * @param datas 联想数据
			 */
			LoadAssociationSearchDatas(datas) {
				let datalist = document.getElementById(this.ASSOCIATION_ID_NAME);
				let inputValue = document.getElementById(this.NEW_BAIDU_SEARCH_ID_NAME).value.trim();
				let frame = document.createDocumentFragment();
				for (let data, i = 0; data = datas[i++];) {
					let option = document.createElement("li");
					//去除双引号
					data = data.replace("\"", "").replace("\"", "");
					//赋值
					option.setAttribute(this.SEARCH_DATA_NAME, data);
					option.innerHTML = data.concat("</b>").replace(inputValue, inputValue + "<b>");
					frame.appendChild(option);
				}
				datalist.innerHTML = "";
				datalist.appendChild(frame);
				this.count = 0;
			}
			/**
			 * 绑定联想事件
			 */
			bindAssociationEvent() {
				let input = document.getElementById(this.NEW_BAIDU_SEARCH_ID_NAME);
				let panel = document.getElementById(this.ASSOCIATION_ID_NAME);
				panel.onclick = (event) => {
					let e = event || window.event;
					let target = e.target || e.srcElement;
					if (target.nodeName.toUpperCase() == "LI") {
						input.value = target.getAttribute(this.SEARCH_DATA_NAME);
						this.search();
						return;
					}
					if (target.nodeName.toUpperCase() == "B") {
						input.value = target.parentNode.getAttribute(this.SEARCH_DATA_NAME);
						this.search();
						return;
					}
				};
				document.onkeydown = (event) => {
					let e = event || window.event;
					let keyCode = e.keyCode || e.which || e.charCode;
					//方向键下
					if (keyCode == 40) {
						let lis = panel.getElementsByTagName("li");
						let length = lis.length;
						if (this.count >= length) {
							this.count = 0;
						}
						for (let i = 0, li; li = lis[i++];) {
							li.removeAttribute("class");
						}
						lis[this.count].classList.add(this.PANEL_ITEM_SELECED_CLASS);
						input.value = lis[this.count].getAttribute(this.SEARCH_DATA_NAME);
						this.count++;
						return false;
					}
					//方向键上
					if (keyCode == 38) {
						let lis = panel.getElementsByTagName("li");
						let length = lis.length;
						if (--this.count < 0) {
							this.count = length - 1;
						}
						for (let i = 0, li; li = lis[i++];) {
							li.removeAttribute("class");
						}
						lis[this.count].classList.add(this.PANEL_ITEM_SELECED_CLASS);
						input.value = lis[this.count].getAttribute(this.SEARCH_DATA_NAME);
						return false;
					}
				};
				/**
				 * 禁止 input 上方向键功能
				 */
				input.onkeydown = (event) => {
					let e = event || window.event;
					let keyCode = e.keyCode || e.which || e.charCode;
					if (keyCode == 38) {
						e.preventDefault();
						return false;
					}
				};
				/**
				 * 鼠标滑过,移除类名
				 */
				panel.onmouseover = (event) => {
					let e = event || window.event;
					let target = e.target || e.srcElement;
					let lis = panel.getElementsByTagName("li");
					//移除类名
					for (let i = 0, li; li = lis[i++];) {
						if (li == target) {
							this.count = i - 1;
						}
						li.removeAttribute("class");
					}
					//li标签触发
					if (target.nodeName.toUpperCase() == "LI") {
						target.classList.add(this.PANEL_ITEM_SELECED_CLASS);
						return;
					}
					//b标签触发
					if (target.nodeName.toUpperCase() == "B") {
						target.parentNode.classList.add(this.PANEL_ITEM_SELECED_CLASS);
						return;
					}
				};
				//点击触发
				panel.onclick = (event) => {
					let e = event || window.event;
					let target = e.target || e.srcElement;
					//li标签触发
					if (target.nodeName.toUpperCase() == "LI") {
						input.value = target.getAttribute(this.SEARCH_DATA_NAME);
						this.search();
						return;
					}
					//b标签触发
					if (target.nodeName.toUpperCase() == "B") {
						input.value = target.parentNode.getAttribute(this.SEARCH_DATA_NAME);
						this.search();
						return;
					}
				};
			}
			/**
			 * 初始化 input替换
			 */
			initCoverBaiduInputElement() {
				this.coverBaiduInputElement();
				Promise.resolve().then(() => {
					this.bindCoverBaiduInputEvent();
				});
			}
			/**
			 * 初始化联想搜索
			 */
			initAssociationSearch() {
				this.inserAssociationPanel();
				Promise.resolve().then(() => {
					this.startAssociationSearch();
					this.bindAssociationEvent();
				});
			}
			/**
			 * 初始化
			 */
			init() {
				try {
					this.initCoverBaiduInputElement();
					Promise.resolve().then(() => {
						this.initAssociationSearch();
					});
				} catch (e) {
					throw new Error(e);
				}
			}
			/**
			 * 执行
			 */
			execute() {
				Baidu.ready = () => {
					this.init();
				};
			}
		}
		/**
		 * 快捷键
		 * @class ShortcutKeys
		 */
		class ShortcutKeys {
			constructor() {
				this.Google = new Google();
				this.filters = Configs.FILTERS;
				this.target = null;
				this.KEY_ENTER = 13;
				this.KEY_ALT = 18;
				this.KEY_SHIFT = 16;
				this.KEY_CTRL = 17;
				this.KEY_GOOGLE = "G";
			}
			/**
			 * 过滤搜索
			 */
			filterSearch(filterName) {
				//移除如 "-baijiahao" 正则
				let reg1 = /\s\-\S+/;
				//移除如 "site:baidu" 正则
				let reg2 = /\ssite\:\S+/;
				let URL = "https://www.baidu.com/s?ie=utf-8&wd=";
				let content = document.getElementById("kw").value.trim();
				content = content.replace(reg1, "").trim();
				content = content.replace(reg2, "").trim();
				location.href =
					URL + encodeURIComponent(content) + " " + filterName;
			}
			/**
			 * 选择全部
			 */
			selectAllContent() {
				let input = document.getElementById("kw");
				input.focus();
				input.selectionStart = 0;
				input.selectionEnd = input.value.length;
			}
			/**
			 * 绑定快捷键
			 */
			bindKeys() {
				let defaultTarget = this.target;
				document.onkeyup = event => {
					let e = event || window.event;
					if (e.target === defaultTarget || e.target === document) {
						let keyCode = e.keyCode || e.which || e.charCode;
						//Ctrl + Enter 全选中
						if (keyCode == this.KEY_ENTER && e.ctrlKey) {
							this.selectAllContent();
							return;
						}
						//谷歌搜索
						if (keyCode ===
							this.KEY_GOOGLE.toUpperCase().charCodeAt() &&
							!e.altKey &&
							!e.shiftKey &&
							!e.ctrlKey &&
							!e.metaKey) {
							this.Google.googleSearch();
							return;
						}
						//过滤搜索
						for (let {
								name,
								value
							} of this.filters) {
							if (keyCode === name.toUpperCase().charCodeAt() &&
								!e.altKey &&
								!e.shiftKey &&
								!e.ctrlKey &&
								!e.metaKey) {
								this.filterSearch(value);
								return;
							}
						}
					}
					e.stopPropagation();
				};
			}
			/**
			 * 重置
			 */
			reset() {
				this.target = document.getElementsByTagName("body")[0] || null;
			}
			/**
			 * 初始化
			 */
			init() {
				try {
					this.reset();
					this.bindKeys();
				} catch (error) {}
			}
			/**
			 * 执行
			 */
			execute() {
				Baidu.ready = () => {
					this.init();
				};
			}
		}
		/**
		 * Base地址重置
		 */
		class BaseURL {
			run() {
				location.href = location.href.replace("https://www.baidu.com/#", "https://www.baidu.com/s?");
			}
		}

		/**

		*/
		class Fixed extends Base {
			removeWrapperNew() {
				let wrapper = document.getElementById("wrapper");
				if (wrapper != null) {
					wrapper.classList.remove("wrapper_new");
					return true;
				}
				return false;
			}

			removeUserIcon() {
				let paras = document.getElementsByClassName("s-top-img-wrapper");
				if (paras != null && paras.length > 0) {
					for (let i = 0; i < paras.length; i++) {
						if (paras[i] != null)
							paras[i].parentNode.removeChild(paras[i]);
					}
					return true;
				}
				return false;
			}

			start() {
				this.removeWrapperNew();
				this.removeUserIcon();
			}

			execute() {
				//移除新首页类名,防止排版错误
				let countRemoveWrapperNew = 0;
				let timerRemoveWrapperNew = setInterval(() => {
					let isSuccess = this.removeWrapperNew();
					if (isSuccess || countRemoveWrapperNew++ > 20) {
						clearInterval(timerRemoveWrapperNew);
					}
				}, 0)

				//移除用户头像,防止排版错误
				let countRemoveUserIcon = 0;
				let timerRemoveUserIcon = setInterval(() => {
					let isSuccess = this.removeUserIcon();
					if (isSuccess || countRemoveUserIcon++ > 20) {
						clearInterval(timerRemoveUserIcon);
					}
				}, 0)

				//再次执行
				Baidu.ready = () => {
					this.start();
				};

			}
		}

		/**
		 *  首页
		 */
		class PageIndex {
			run() {
				//组合模式
				let command = new Commond();
				command.add(new ImportIndexStyle());
				command.add(new ReplaceSearch());
				command.execute();
			}
		}
		/**
		 *  搜索结果页
		 */
		class PageCommon {
			run() {
				/**
				 * 01 - 初始化执行
				 */
				let command = new Commond();
				command.add(new ImportCommonStyle());
				command.add(new FirstFilter());
				// command.add(new HideBaijiahao());
				command.add(new ReplaceSearchEvent());
				command.add(new CustomMenuButton());
				command.add(new MulPageLayout());
				command.add(new UseAutoLoadNextPage());
				 // command.add(new Redirect());
				command.add(new BackToTop());
				command.add(new Google());
				command.add(new ShortcutKeys());
				command.add(new Fixed())
				command.execute();
				/**
				 * 02 - 设置标志位
				 * 防止后期多次无用执行
				 */
				let avoidMulExecute = new AvoidMulExecute();
				//设置标志位
				Baidu.ready = () => {
					avoidMulExecute.setSign();
				};
				/**
				 * 03 - 监测 DOM
				 */
				//调用函数
				let mutationfunc = () => {
					//只执行一次
					if (!avoidMulExecute.hasSign()) {
						//设置标志位
						avoidMulExecute.setSign();
						//执行
						command.execute();
					}
				};
				//加载完成后 - 根据 DOM 变化重新执行函数( 防止Bash值改变时不触发脚本)
				window.onload = () => {
					let MutationObserver = window.MutationObserver ||
						window.WebKitMutationObserver ||
						window.MozMutationObserver;
					if (!!MutationObserver) {
						let observer = new MutationObserver(mutationfunc);
						let wrapper = document.querySelector("#wrapper");
						let observerConfig = {
							childList: true,
							subtree: true
							//"attributes": true,
							//"characterData":true,
							//"attributesFilter": ["class"],
						};
						//开始观察
						observer.observe(wrapper, observerConfig);
					} else {
						console.error("百度搜索-优化: 浏览器不兼容 MutationObserver 接口, 请升级浏览器版本");
					}
				};
			}
		}
		/**
		 * 简单工厂
		 */
		class Factory {
			/**
			 *
			 * @param url
			 */
			static create(url) {
				//BASE地址(BASE地址会导致样式跳转,需要重定向)
				const URL_BASE = "https://www.baidu.com/#";
				//普通页 01
				const URL_COMMON_01 = "https://www.baidu.com/s";
				//普通页 02
				const URL_COMMON_02 = "https://www.baidu.com/baidu";
				//首页
				const URL_INDEX = "https://www.baidu.com";
				//返回BASE
				if (url.startsWith(URL_BASE)) {
					return new BaseURL();
				}
				//返回结果页
				if (url.startsWith(URL_COMMON_01)) {
					return new PageCommon();
				}
				//返回结果页
				if (url.startsWith(URL_COMMON_02)) {
					return new PageCommon();
				}
				//返回首页
				if (url.startsWith(URL_INDEX)) {
					return new PageIndex();
				}
			}
		}
		/**
		 * 启动函数
		 */
		Baidu.start = () => {
			Factory.create(location.href).run();
		};
		//返回对象
		return Baidu;
	})(BaiduConfig);
	//启动
	try {
		Baidu.start();
	} catch (msg) {
		if (Configs.IS_DEBUG) {
			console.error(msg);
		}
	}
})();