Greasy Fork

Greasy Fork is available in English.

移动百度优化

非百度系浏览器使用百度APP的ua时,添加一个悬浮搜索栏。

当前为 2022-11-19 提交的版本,查看 最新版本

// ==UserScript==
// @name         移动百度优化
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  非百度系浏览器使用百度APP的ua时,添加一个悬浮搜索栏。
// @author       tutu辣么可爱(greasyfork)/IcedWatermelonJuice(github)
// @require      http://greasyfork.icu/scripts/415581-jquery%E5%BA%93/code/jquery%E5%BA%93.js?version=866373
// @match        https://m.baidu.com/s*
// @grant        GM_addStyle
// @run-at       document-start
// @license      MIT
// ==/UserScript==

(function() {
	// jQuery extensions
	$.fn.TTjs = function(k, v) {
		return /string|boolean/i.test(typeof v) ? this.attr(`TTjs-${k}`, v) : this.attr(`TTjs-${k}`);
	}
	$.fn.removeTTjs = function(k) {
		return this.removeAttr(`TTjs-${k}`)
	}
	$.urlChange = function(fn) {
		var addEvent = function(type) {
			var origin = history[type];
			return function() {
				var rv = origin.apply(this, arguments);
				var e = new Event(type);
				e.arguments = arguments;
				window.dispatchEvent(e);
				return rv;
			}
		};
		history.pushState = addEvent('pushState');
		history.replaceState = addEvent('replaceState');
		$(window).bind('hashchange', fn);
		$(window).bind('popstate', fn);
		$(window).bind('pushState', fn);
		$(window).bind('replaceState', fn);
	}

	// 常量
	const device = location.hostname === "m.baidu.com" ? "mobile" : "pc";
	const css =
		`@media (min-width:800px){[TTjs-device=mobile][TTjs-page=synthesis] #results{display:grid;grid-template-columns:repeat(2,calc(50% - 5px));grid-gap:10px;margin:10px;}[TTjs-device=mobile][TTjs-page=synthesis] #results>.c-result{background-color:rgb(255,255,255);border-radius:15px;}[TTjs-device=mobile][TTjs-page=synthesis] #results>:not(.c-result){display:none;}[TTjs-device=mobile][TTjs-page=tieba] .sfa-results{display:grid;grid-template-columns:repeat(2,calc(50% - 5px));grid-gap:10px;}[TTjs-device=mobile][TTjs-page=tieba] .sfa-results>.c-result{background-color:rgb(255,255,255);}[TTjs-device=mobile][TTjs-page=tieba] .sfa-results>:not(.c-result){display:none;}[TTjs-device=mobile][TTjs-page=realtime] #realtime-container .c-infinite-scroll{display:grid;grid-template-columns:repeat(2,calc(50% - 5px));grid-gap:10px;margin:10px;}[TTjs-device=mobile][TTjs-page=realtime] #realtime-container .c-infinite-scroll>div{background-color:rgb(255,255,255);border-radius:15px;}[TTjs-device=mobile][TTjs-page=realtime] #realtime-container .c-infinite-scroll>:not(div),[TTjs-device=mobile][TTjs-page=realtime] #realtime-container .c-infinite-scroll>.c-infinite-scroll-topbar{display:none;}}.TTjs-float-search-bar{position:fixed;bottom:0;left:0;width:100vw;z-index:99999;--bg:#f2f3f5;--bg2:#fff;--border:#222;}.TTjs-float-search-bar[TTjs-ele=title]{height:66px;background-color:transparent;transition:height 0.2s;}.TTjs-float-search-bar[TTjs-ele=page]{height:100vh;background-color:var(--bg);transition:height 0.2s;}.TTjs-float-search-bar [TTjs-ele=container]{display:flex;flex-direction:column-reverse;width:90%;max-width:750px;height:calc(100% - 20px);position:absolute;left:50%;transform:translateX(-50%);background-color:transparent;}.TTjs-float-search-bar [TTjs-ele=bar]{position:relative;width:calc(100% - 14px);height:42px;border:2px solid var(--border);border-radius:8px;padding:0 5px;background-color:var(--bg2);}.TTjs-float-search-bar i{width:30px;height:100%;}.TTjs-float-search-bar [TTjs-ele=search]{background:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAiIGhlaWdodD0iMzAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNC4wNjMgNi43OTdhNy4yNjYgNy4yNjYgMCAxMDQuNjE2IDEyLjg3NmwzLjI3NyAzLjI3N2EuNzAzLjcwMyAwIDEwLjk5NC0uOTk0bC0zLjI3Ny0zLjI3N2E3LjI2NiA3LjI2NiAwIDAwLTUuNjEtMTEuODgyem0wIDEuNDA2YTUuODYgNS44NiAwIDExMCAxMS43MTkgNS44NiA1Ljg2IDAgMDEwLTExLjcxOXoiIGZpbGw9IiMyMjIiLz48L3N2Zz4=") no-repeat center;float:left;}.TTjs-float-search-bar [TTjs-ele=empty]{background:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00IDEyYTggOCAwIDExMTYgMCA4IDggMCAwMS0xNiAwem0xMC4yMTYtMy41MzZhLjc3My43NzMgMCAxMTEuMDkyIDEuMDkzTDEyLjg2NiAxMmwyLjQ0MiAyLjQ0M2EuNzczLjc3MyAwIDAxLTEuMDkyIDEuMDkzbC0yLjQ0My0yLjQ0My0yLjQ0MyAyLjQ0M2EuNzczLjc3MyAwIDExLTEuMDkzLTEuMDkzTDEwLjY4IDEyIDguMjM3IDkuNTU3QS43NzMuNzczIDAgMDE5LjMzIDguNDY0bDIuNDQzIDIuNDQzIDIuNDQzLTIuNDQzeiIgZmlsbD0iI0NBQ0FDQSIvPjwvc3ZnPg==") no-repeat center;float:right;}.TTjs-float-search-bar [TTjs-ele=back]{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIyNSIgaGVpZ2h0PSIyNSIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xMi45OTk4IDhMNiAxNEwxMi45OTk4IDIxIiBzdHJva2U9IiMzMzMiIHN0cm9rZS13aWR0aD0iNCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PHBhdGggZD0iTTYgMTRIMjguOTkzOEMzNS44NzY4IDE0IDQxLjcyMjEgMTkuNjIwNCA0MS45OTA0IDI2LjVDNDIuMjczOSAzMy43Njk2IDM2LjI2NzEgNDAgMjguOTkzOCA0MEgxMS45OTg0IiBzdHJva2U9IiMzMzMiIHN0cm9rZS13aWR0aD0iNCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+") no-repeat center;background-size:65%;position:absolute;bottom:-2px;right:-38px;border:2px solid var(--border);border-radius:8px;}.TTjs-float-search-bar input{outline:0;border:0;background-color:transparent;width:calc(100% - 70px);height:100%;padding:0 5px;font-size:20px;}.TTjs-float-search-bar [TTjs-ele=sug]{display:flex;flex-direction:column-reverse;font-size:20px;height:auto;max-height:calc(100% - 46px);overflow-y:auto}.TTjs-float-search-bar [TTjs-ele=sug]::-webkit-scrollbar{display:none;}.TTjs-float-search-bar [TTjs-ele=item]{background-color:var(--bg2);margin-bottom:10px;padding:5px;padding-left:10px;border-radius:10px;height:40px;line-height:40px;}.TTjs-float-search-bar [TTjs-ele=insert]{background:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAiIGhlaWdodD0iMzAiIHZpZXdCb3g9IjAgMCAzMCAzMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTguNSA4LjVMMjAuNTIwOCAyMC41MjA4IiBzdHJva2U9IiMyMjIyMjIiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTguNSA4LjVIMTcuNSIgc3Ryb2tlPSIjMjIyMjIyIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CjxwYXRoIGQ9Ik04LjUgOUw4LjUgMTgiIHN0cm9rZT0iIzIyMjIyMiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8L3N2Zz4K") no-repeat center;transform:rotate(-90deg);width:30px;height:100%;float:right;}.TTjs-float-search-bar[TTjs-ele=title] [TTjs-ele=sug],.TTjs-float-search-bar[TTjs-ele=title] [TTjs-ele=empty],.TTjs-float-search-bar[TTjs-ele=title] [TTjs-ele=back]{display:none;}.TTjs-float-search-bar[TTjs-ele=title] [TTjs-ele=input]{text-align:center;position:absolute;left:50%;top:0;transform:translateX(-50%);}.TTjs-float-search-bar[TTjs-ele=page] [TTjs-ele=bar]{margin-right:38px;width:calc(100% - 52px);}.TTjs-float-search-bar[TTjs-ele=page] [TTjs-ele=search]{float:right;}`;

	var originURL = new URL(location.href);
	var pd = originURL.searchParams.get("pd") || "synthesis";
	var wd = originURL.searchParams.get("word") || originURL.searchParams.get("wd");

	function initPreParams() {
		originURL = new URL(location.href);
		pd = originURL.searchParams.get("pd") || "synthesis";
		wd = originURL.searchParams.get("word") || originURL.searchParams.get("wd");
	}

	function enableMap() {
		var map = {
				"mobile": ["synthesis", "tieba", "realtime"]
			},
			check = map.hasOwnProperty(device) && map[device].indexOf(pd) > -1;
		$("html").TTjs("device", check ? device : "");
		$("html").TTjs("page", check ? pd : "");
		return check
	}

	function searchTrigger(self) {
		var val = self.val().trim(),
			sugApi = "https://m.baidu.com/sugrec?json=1&prod=wise&callback=baidusug&wd=";
		if (val) {
			$(".TTjs-float-search-bar [TTjs-ele=empty]").removeAttr("style");
		} else {
			$(".TTjs-float-search-bar [TTjs-ele=empty]").hide();
			return false;
		}
		$.get(sugApi + val, (sug) => {
			if (!sug) {
				console.log("百度联想词获取失败");
				return null
			}
			try {
				sug = sug.replace(/^baidusug\(/, "").replace(/\)$/, "");
				sug = JSON.parse(sug);
				console.log(sug);
				$(".TTjs-float-search-bar [TTjs-ele=sug]").html("");
				sug.g.forEach((e) => {
					e.type==="sug"&&$(".TTjs-float-search-bar [TTjs-ele=sug]").append(
						`<div TTjs-ele="item">${e.q}<i TTjs-ele="insert"></i></div>`
					)
				})
				$(".TTjs-float-search-bar [TTjs-ele=item]").click((e) => {
					e = $(e.currentTarget);
					location.href = `https://m.baidu.com/s?word=${e.text()}`;
				})
			} catch (e) {
				console.log("百度联想词获取失败");
			}
		})
	}

	function addBar() {
		var $bar = $(
			`<div class="TTjs-float-search-bar" TTjs-ele="title"><div TTjs-ele="container"><div TTjs-ele="bar"><i TTjs-ele="search" TTjs-click="disabled"></i><input TTjs-ele="input" value="${wd?wd:"请输入搜索内容"}" placeholder="请输入搜索内容" disabled/><i TTjs-ele="empty"></i><i TTjs-ele="back"></i></div><div TTjs-ele="sug"></div></div></div>`
			);
		var bar = {
			self: $bar,
			input:$bar.find("[TTjs-ele=input]"),
			search:$bar.find("[TTjs-ele=search]"),
			empty: $bar.find("[TTjs-ele=empty]"),
			back: $bar.find("[TTjs-ele=back]")
		};
		bar.self.click(() => {
			if (bar.self.TTjs("ele") === "page" || bar.self.TTjs("click") === "disabled") {
				return false
			}
			bar.back.TTjs("click", "disabled");
			bar.search.removeTTjs("click");
			bar.input.removeAttr("disabled");
			searchTrigger(bar.input);
			bar.self.TTjs("ele", "page");
			var url = new URL(location.href);
			url.searchParams.set("TTjs", "baiduSearch");
			history.pushState(null, "移动百度优化-搜索", url.toString());
			setTimeout(() => {
				bar.back.removeTTjs("click");
			}, 250)
		})
		bar.empty.click(() => {
			bar.input.val("");
			bar.empty.hide();
		})
		bar.back.click(() => {
			if (bar.back.TTjs("ele") === "title" || bar.back.TTjs("click") === "disabled") {
				return false
			}
			bar.input.val(wd);
			bar.empty.removeAttr("style");
			bar.self.TTjs("click", "disabled");
			bar.search.TTjs("click", "disabled");
			bar.input.attr("disabled", "");
			bar.self.TTjs("ele", "title");
			history.back();
			setTimeout(() => {
				bar.self.removeTTjs("click");
			}, 250)
		})
		bar.search.click(() => {
			if (bar.search.TTjs("click") === "disabled") {
				return false
			}
			location.href = `https://m.baidu.com/s?word=${$(".TTjs-float-search-bar input").val()}`
		})
		bar.input.on({
			compositionstart: function() {
				$(this).TTjs("isIput", true);
			},
			compositionend: function() {
				$(this).removeTTjs("isIput");
				searchTrigger($(this))
			},
			input: function(e) {
				if (!$(this).TTjs("isIput")) {
					searchTrigger($(this))
				}
			},
			keydown: function(e) {
				e = e.originalEvent;
				if (!$(this).TTjs("isIput") && (e.keyCode === 13 || /enter/i.test(e.key))) {
					bar.search[0].click();
				}
			}
		});
		$("body").append(bar.self);
	}
	GM_addStyle(css);
	enableMap();
	addBar();
	$.urlChange(() => {
		$(".TTjs-float-search-bar[TTjs-ele=page]").is(":visible") && $(
			".TTjs-float-search-bar [TTjs-ele=back]")[0].click();
		initPreParams();
		enableMap();
	})
	setInterval(() => {
		if (!$(".TTjs-float-search-bar")[0]) {
			console.log("add bar")
			addBar();
		}
	}, 200)
})();