Add links to each other in search engines. Including multiple search modes.
// ==UserScript== // @name Search Switcher // @name:zh-CN 一键切换搜索 // @name:zh-TW 壹鍵切換搜索 // @description Add links to each other in search engines. Including multiple search modes. // @description:zh-CN 在常用的搜索引擎页面中添加互相切换的按钮。 // @description:zh-TW 在常用的搜索引擎頁面中添加互相切換的按鈕。 // @author XanderWang // @icon https://i.loli.net/2020/05/29/DxSmHAy2o53FdUY.png // @license GPL-3.0 // @include https://www.baidu.com/* // @include *.so.com/* // @include *.bing.com/* // @include *.soku.com/* // @include *.sogou.com/* // @include /^https?://[a-z]+\.google\.[a-z,\.]+/.+$/ // @run-at document_body // @date 05/29/2020 // @modified 07/31/2024 // @version 1.0.7 // @namespace https://blog.xanderwang.site // ==/UserScript== (function () { //指定代码在严格条件下执行 'use strict'; const sites = [ { name: "百度", host: "baidu.com", link: "https://www.baidu.com/s", key: "wd", hide: false, }, { name: "必应", host: "bing.com", link: "https://bing.com/search", key: "q", hide: false, }, { name: "谷歌", host: "google.com", link: "https://www.google.com.hk/search", key: "q", hide: false, }, { name: "谷歌镜像", host: "google.####cloudnative.io", link: "https://google.####cloudnative.io/search", key: "q", hide: false, }, { name: "搜搜", host: "so.com", link: "https://www.so.com/s", key: "q", hide: false, }, { name: "搜狗", host: "sogou.com", link: "https://www.sogou.com/web", key: "query", hide: false, }, ]; const css = ` .search-warpper { position: fixed; left: 0; top: 0; } .search-switcher { position: fixed; opacity: 0.2; top: 80px; right: calc(100% - 10px); z-index: 9999999; transition: all 400ms; } .search-switcher:hover { top: 80px; left: 0px; right:auto; opacity: 1; border-radius: 0 20px; } .search-switcher .search-list { display: flex; flex-direction: column; align-items: center; justify-content: center; box-sizing:border-box; background-color: #000; border-radius: 0px 10px 10px 0px; color: #fff; padding: 10px; box-shadow: 5px 5px 5px #777; } .search-switcher .search-list a { color: #0cf; height: 25px; line-height: 25px; } .search-switcher .search-list a.mirror { font-weight: bold; } `; function setup() { console.log("setup location:", location.href); let current_site; for (let site of sites) { if (location.host.includes(site.host)) { current_site = site; } } let site_list = sites.filter( ({ host, hide }) => !location.hostname.includes(host) && !hide ); // console.log("site_list:", site_list); let query = new URLSearchParams(location.search).get(current_site.key || "q"); console.log("current_site:", current_site, ",query:", query); if (query == null) { return; } let body = document.body; if (body == undefined) { return; } let switcherParentId = "search-switcher-parent"; let switcherParent = document.getElementById(switcherParentId); if (switcherParent == undefined) { // 样式 const style = document.createElement("style"); style.innerHTML = css; body.appendChild(style); // 生成切换框 switcherParent = document.createElement("div"); switcherParent.setAttribute("id", switcherParentId); console.log("body.appendChild:", switcherParent); body.appendChild(switcherParent); } const siteTag = ({ link, name, host, mirror, key }) => { let className = ""; let text = name; let href = `${link}?${key}=${query}`; console.log("href:", href); return `<a href='${href}' target='_blank' >${text}</a>`; }; const tags = site_list .filter(({ hidden }) => !hidden) .map(siteTag) .join(""); switcherParent.innerHTML = ` <div id='search-switcher' class='search-switcher'> <div id='search-list' class="search-list">${tags}</div> </div> `; console.log("switcherParent:", switcherParent); } // 监听 pushState 和 replaceState 方法 const originalPushState = history.pushState; const originalReplaceState = history.replaceState; history.pushState = function () { originalPushState.apply(this, arguments); window.dispatchEvent(new Event('urlChange')); }; history.replaceState = function () { originalReplaceState.apply(this, arguments); window.dispatchEvent(new Event('urlChange')); }; // 监听 popstate 事件(用于处理浏览器后退和前进) window.addEventListener('popstate', () => { window.dispatchEvent(new Event('urlChange')); }); // 自定义的 URL 变化事件处理函数 const handleUrlChange = () => { console.log('URL changed to: ', window.location.href); // 这里可以添加你希望执行的代码 setTimeout(function () { setup(); }, 2000) }; // 监听自定义的 urlChange 事件 window.addEventListener('urlChange', handleUrlChange); // 初始加载时也触发一次 handleUrlChange(); })(); // end userScript