🏠 Home 

移动端聚合搜索引擎导航 SearchSwitcher

移动端-手机版聚合搜索引擎切换导航,支持自定义隐藏和排序,可以全部展开或横向排列滑动选择。


Installer dette script?
  1. // ==UserScript==
  2. // @name 移动端聚合搜索引擎导航 SearchSwitcher
  3. // @namespace Violentmonkey Scripts
  4. // @include *
  5. // @grant GM_setValue
  6. // @grant GM_getValue
  7. // @version 1.3.6
  8. // @author #安Mc_Myth
  9. // @license MIT
  10. // @description 移动端-手机版聚合搜索引擎切换导航,支持自定义隐藏和排序,可以全部展开或横向排列滑动选择。
  11. // ==/UserScript==
  12. (function() {
  13. 'use strict';
  14. // 搜索引擎配置对象
  15. var searchEngines = {
  16. Google: {
  17. hide: 0,
  18. name: "Google",
  19. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAF8WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTA4LTAyVDA3OjQzOjU0KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMC0wOC0wMlQwNzo0NDoyMCswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMC0wOC0wMlQwNzo0NDoyMCswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2ZjQ0NTJmYy0xY2IzLWQyNDMtODRiMy02MGMxY2Q0Yzk0MTQiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDowNGU0NWRjMy02MmY5LTU2NGQtYmY5NS01YWU0ZGVhOTYxOWEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxY2NhMTM3YS0xODJjLTE4NGQtOGM1YS1jOTQzZGRlMDBlYjAiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjFjY2Ex###hLTE4MmMtMTg0ZC04YzVhLWM5NDNkZGUwMGViMCIgc3RFdnQ6d2hlbj0iMjAyMC0wOC0wMlQwNzo0Mzo1NCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo2ZjQ0NTJmYy0xY2IzLWQyNDMtODRiMy02MGMxY2Q0Yzk0MTQiIHN0RXZ0OndoZW49IjIwMjAtMDgtMDJUMDc6NDQ6MjArMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMS4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6Adq1DAAAClUlEQVRYw2P4//8/w0BihlEHDDkHfF06z/RDSVb+m1CPSa/cLJa8cjVf9ibYber7oozCrwtnWdHMAR8bK+JfuZgte+VsuhKI/+PAK0FqPtaXJVHNAd93bZV+7W03l4DFGA557WM/98f+XWIUOeDr8gXGJFqM4ohPXY0hZDsA5HMclq98lxrZ+GX2ZIfvW9Ypf9+6XvHL7CkO79KiGpHUr/zU1xZAURS89rJdgG7x25iAnp9nTrDj0vPz9HH2NxE+fZ+n9HhSlAa+TMjNQvP9yvc5iRV0y4a/d7Lf+ViuAPc9KMvRrRz4e78t4Pce1ntA/P/rZNH/rz1NVn7fsVmWbg74c9ZtKshyGP65TnE/XUvC34dkDiM74M/lyEZ8Bji1fplJLN5/9bcAYQfsZb+D7IC/d2ojiXDAf2Lw0qO/dAbUAfMP/jQmPQouRTRTGAVwB6w68UuDcCI8546SCJ8c0ltPbgJDc8DMg9d/8xKRDTv8YNlw81bF/zYrAhZsuLtHkVTLVxz/pYXuAKILom97OG+2bTD+b7IiGIzdNiRNJdUBIRO+tiMHf8LMb1VEO6D/eFMI0OKVMAeA2DE7S+uItbx8+fd4dN+vxBL/eCsjuzXRc5EcAHaEz6b0vkNPz/Diszx544oyp9aPKIkPFBok14bbHxySQAsFuENCtuW1956b777q1naN1bd3qE29tNQuZU91memKEJD6leYLyv87dj6G+/7wjT/cZDVIFt/YqI/DEQSx6dKE/3Z9p+Ziy/skNcl2PjwiZrcmZi6JDllpvjJs2exLG82p1iitPtYfbbYyZBkBh4CjIH1fXSHNmuULr683zDnQlOu5MXWSxaqwJSCfum1Inpq6t7YYlBZGe0ajDiAVAwCcsjeFTD7reAAAAABJRU5ErkJggg==",
  20. url: "https://google.com/search?q=",
  21. parameter: "q",
  22. hostnameRegex: /(?:www\.)?google\.(com|co\.[a-z]{2}|[a-z]{2,3})(\.[a-z]{2})?/,
  23. insertPoint: function(container) {
  24. insertAfter(container, document.getElementById("msc"));
  25. container.style.marginBottom = "10px";
  26. }
  27. },
  28. Baidu: {
  29. hide: 0,
  30. name: "百度",
  31. icon: "data:image/x-icon;base64,AAABAAEAGBgAAAEACADIBgAAFgAAACgAAAAYAAAAMAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/51YAP+JNQD/rnUA/9zCAP+4hQD/tH4A/4gzAP+INAD/0bAA/9KyAP+KNwD/jj0A/5hPAP+2ggD/l0wA/7F5AP+XTQD/tX8A/4o2AP+kYwD/0K8A/61zAP/LpgD/izgA/8WbAP+SRAD/jTsA/9KzAP+TRgD/oV4A/6BcAP+cVAD/wZQA/9vCAP/HoAD/yKEA/59aAP+jYgD/3cUA/6hqAP+rbwD/wZUA/6VkAP/PrQD/0bEA/55YAP+PPgD/3cQA/82pAP/KpQD/wJMA/6ZmAP+udAD/kEEA/9a4AP/GngD/kUIA/+zfAP+kZAD/jDoA/6VlAP+6iQD/nlkA//TsAP+oawD/qWsA/7yMAP/IogD/9e8A/5pTAP+NPAD/nFYA/7aBAP/17gD/07QA/9vBAP/48gD/ol8A////AP/o2QD/xJkA/5hOAP/t4AD/zKcA/6puAP/JogD/7+QA/8KXAP+TRwD/8ukA//r3AP/gygD/zqwA//bvAP+VSQD/sHgA/9CuAP/OqwD/kUMA/6doAP+PPwD/lUoA/4s5AP+USAD/2r8A/9W2AP+9jgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATGlpAAAAAABqKmtUAAAAAAAAAAAAADdlBwcHBzYPZmcHBwcHaAAAAAAAAAAAADYHGGBhHGJjZCwcHBYHBykAAAAAAAAACgcHWFo4Ck0BW1xdXlEHB18AAAAAAAAAVgcHV1gHNE1OT1IHUFEHB1kAAAAAAAAAMAIHU1QHNE1OTxEHUFEHB1UAAAAAAAAAACkHSUpLTE1OTxEHUFEHUgAAAAAAAAAAAABCCCtDREVGEEcHQkg/AAAAAAAAAAAAAAAAPgIHP0ARBwcHB0EAAAAAAAAAAAAAAAAAADgCOQYMBwcHHjo7PDw9AAAAAAAAMzQ1AAAGBwcHBwc2ADcHBwcHBAAAAAAtBwcHHgAALgcHBy8wADEHBwcHMgAAAAApBwcHCwAAACorEAAAACwHBwcHFQAAAAAoBwcHBwAAAAAAAAAAAAACBwcYAAAAAAAhBwcHEQAAIgAAAAAjIwAkJSYnAAAAAAAAGgcbHAAdBx4AAB8HByAAAAAAAAAAAAAAABUAABYHBwcXABgHBwcZAAAAAAAAAAAAAAAAABEHBwcSABMHBwcUAAAAAAAAAAAAAAAAAA0HBwcOAA8HBwcQAAAAAAAAAAAAAAAAAAYHBwgJAAoLBwwAAAAAAAAAAAAAAAAAAAABAgMAAAAEBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////APx8PwDwAB8A8AAPAOAADwDgAA8A4AAPAPAAHwD4AD8A/AB/AP4ABwDjAQMAwYEDAMHHAwDB/4cAwbyHAOEYfwD2CD8A/gg/AP4IPwD+CH8A/xz/AP///wD///8A",
  32. url: "https://www.baidu.com/s?word=",
  33. parameter: "word|wd",
  34. hostnameRegex: /(?:www\.)?baidu\.com/,
  35. insertPoint: function(container) {
  36. document.getElementById("page-hd").appendChild(container);
  37. let initialMarginTop = null; // 初始的 margin-top 值
  38. // 检查元素是否匹配所需的样式条件
  39. function isMatchingElement(element) {
  40. const style = window.getComputedStyle(element);
  41. const maxHeight = element.style.maxHeight || style.maxHeight;
  42. return (
  43. style.backgroundColor !== 'transparent' &&
  44. style.paddingTop !== '' &&
  45. style.marginTop !== '' &&
  46. style.minHeight !== '' &&
  47. maxHeight.includes('calc')
  48. );
  49. }
  50. // 修复部分特殊页面背景颜色错位
  51. function adjustMarginTop() {
  52. const searchEngineContainer = document.getElementById('searchengine_container');
  53. if (searchEngineContainer) {
  54. const searchEngineContainerHeight = searchEngineContainer.offsetHeight; // 获取searchengine_container的高度
  55. const allElements = document.querySelectorAll('*');
  56. // 遍历所有元素
  57. allElements.forEach(element => {
  58. if (isMatchingElement(element)) {
  59. if (initialMarginTop === null) {
  60. initialMarginTop = parseFloat(window.getComputedStyle(element).marginTop); // 记录初始的 margin-top 值
  61. }
  62. element.style.marginTop = `${initialMarginTop - searchEngineContainerHeight}px`;
  63. }
  64. });
  65. }
  66. }
  67. // 每隔一定时间进行检查和调整
  68. let intervalId = setInterval(adjustMarginTop, 200); // 每秒检查一次
  69. setTimeout(() => {
  70. clearInterval(intervalId);
  71. }, 2500);
  72. // 初始检查:在元素已经存在于DOM中的情况下立即调整
  73. adjustMarginTop();
  74. //修复搜索栏悬浮状态时遮挡搜索框
  75. }
  76. },
  77. Bing: {
  78. hide: 0,
  79. name: "Bing",
  80. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB5ElEQVQ4jZ2Tv0sbYRyHX5Uzl8bLVNrSToUOHbr0T2gHqf1Baf8AvcUruNcpd5e75BK9H0Q9gptCogZKh6J2kWtDhkpxkmCwOIidijpYECoI5unQNo0QauwHnuUD78PL9/2+on9w0ItrWiSraiSNjER9w8NRTFUjuQvimhaJuKZ9ThaLJHyfGzMz3AxDRC6H7LooQYDi+50JApJhiJBVNVJ8nx7TZKhU4svhIYX1dW4XCsRsm4FstjOOg+K6fwXCMHiysMCfvKhUELp+OcHjcrkleL60hEil/l/wslKhxzAQuk6vaRLPZC5/g9dra5jVKvdnZ5FtG5FKIVkWSjeCB3NzvFpeBuD7yQnvd3YYW13lztQUsm1fLHhUKnE1n6e+v0973mxtIaXTJDKZLoY4Ps71yUneNhqt/uPuLrJlceUiwcP5ea5NTJCt1fh2fNzq321vI6XT/xacNZuUNzdpHBy0Dp41m1Tqde4Vi/RbVucZPG1bpPbU9vZ4triIlE7TZ5qdXyFmWdzyfYobG/w4PQXg69ERYysrKI6D0PXzu9Am+KAEAYrjELNthGEwVC5jVqvcDUOErv/6E45znlwOxfMQ8ujop2QYorguiueRcF16HQeRzSLl8wz87hXXPY/nkZye5icfi28JEi0cegAAAABJRU5ErkJggg==",
  81. url: "https://cn.bing.com/search?q=",
  82. parameter: "q",
  83. hostnameRegex: /(?:www\.)?bing\.com/,
  84. insertPoint: function(container) {
  85. document.getElementsByTagName("header")[0].appendChild(container);
  86. }
  87. },
  88. Zhihu: {
  89. hide: 0,
  90. name: "知乎",
  91. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0MzYwLCAyMDIwLzAyLzEzLTAxOjA3OjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDI0LTA2LTI3VDE4OjE4OjAyKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0wNi0yN1QxODoxOTozMyswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNC0wNi0yN1QxODoxOTozMyswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozY2VjYjNmOS0wNzUxLTQzNDItOWIzZi0wNTgyMTRmODZmOWEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6M2NlY2IzZjktMDc1MS00MzQyLTliM2YtMDU4MjE0Zjg2ZjlhIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6M2NlY2IzZjktMDc1MS00MzQyLTliM2YtMDU4MjE0Zjg2ZjlhIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDozY2VjYjNmOS0wNzUxLTQzNDItOWIzZi0wNTgyMTRmODZmOWEiIHN0RXZ0OndoZW49IjIwMjQtMDYtMjdUMTg6MTg6MDIrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMS4xIChXaW5kb3dzKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6ivk0LAAACTUlEQVQ4jYXTX4hVVRQG8N8+59x7ZxzvjEVpWhcGFIIhzILqJVALhOixmaCXKDDffFQLzQFJo5ey3vpDoo8qYg9JBEJSUPgS1BgkEoGa6aCOd05z5/47u4dzMH1qw2LB2nt/a31rfSuYjXBAZrvUSin/ZyHTiYnP9ezL9LwntVeCIf7BKowoT7zfh9I1Q2pvrCuCXTGXGpOUtzObOH2J/m2MVUAFEmSiFCOCFUi0M0N1cIuZLRyfZvNROg9Sb/LrDdZNsHacJGOhJ/yxxO0OGhqZgWWFmi5vPl3Wd3KaLGPub078zv7naffI+8LGh/ngZ97+Bqv1EgO0mZrimRZbP+XiPJ/8yLb3mc8pIs8e47mPOX+NxyfQL3uWGCJjqcNj+/judEl37i+W57i6QK/gZpvlBfFmh35RNXxAFiKxx602u15gcoYNDzH7ItseZbHGlTs0ErqJkAWK6rNBmYwerSZPrhPXNmk2+OUK9YKxlOKejGJl9wGMc+EyM3t4+aOyxKPneePd0rdW0e0gFweDUk/6FUBUzblW6uTQNHmXL1/j9Z0sLjHeKB/XGsIjTdJQVm1IRiWSG0w+xTsv8cpn4uV54dxuXj1Ct8/1WRaWWD3KqQv/0chQl7O+xbd7OHeRU2fR5eDXXLrOEwf5agcffs/Z31hM8QCGRoId8Y6u8ckWU2s485MoFdSxLGoIYkUTxkQ1wShSeYLDRvjzKmd+QF0IoxWthiBUW5hhJVJBcncKhzOJWYVUzVsmjCLEWO1eenf7ykC/AgtyfCG3/1+c2dZRiDfRJgAAAABJRU5ErkJggg==",
  92. url: "https://www.zhihu.com/search?type=content&utm_id=0&q=",
  93. parameter: "q",
  94. hostnameRegex: /(?:www\.)?zhihu\.com/,
  95. insertPoint: function(container) {
  96. fixedContainer(container, () => document.getElementById('SearchMain'), 500, 3000);
  97. }
  98. },
  99. Yandex: {
  100. hide: 0,
  101. name: "Yandex",
  102. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAADAFBMVEX4YEr4YUv7tKr8ycH5inr5hnX6qp74X0n6qZ3////80Mn8xr/6o5b4b1v+7+3++vn5f274dGH+9fT+8/H4cF37r6T7w7v7s6n7uK74b1z+8e/++fj4emf4cFz+8O7+9/b4d2X7ua/7tav7rKD+/f37xb35fmz97ev4eWb4cl74aFP8y8T6pJj5iXn+/fz92tX4blr4bFf++vr4ZU/6l4n4ZVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAA3C0QAAHYAAAAAAAAh+IAAAQsAAAAAAAAAAAD5EAC/CyF3lXYAAAELRACudjd3lXcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVBhT4qHcAAN8A1gAAAAAAAAAAAAAAAAAAAAAAAABkAAAAAAAAAAKXkAAAAN8AAAAAAAIAAACAAAAA3/Pf+Kf4qACAAN8A35fWAAD5cAAsCyELIfmQ8UYGCXcAd5IAAAAAAAAAAAAAAAAAAAAAAAAQCQCCaxd2Je8h+dDv3QsAdiUAAAAGC3y6LFBSAHB2JfAAAGAABQCAAAAAAAAQAIAAAMAAAAAAAAAABZgAAAACAAAAAAB2AHT4qAD4AN8LIfkAAAAAAACoAAAA3/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAABwAAALIfkAAEAAAADAAAALIfkAAAAAAAAMAAAAAAAAAAIBAQA2AAADn5Ih+hTpPgsAdiUAAAAAAAL5+AAACyEAAAAGC3y6LFAAAHAAAAAABZgAGACAAAAAAAAAAAAAAAAAAAAAAADyEusEAAAAAWJLR0Q2R7+I0QAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAHNJREFUGNNjYKARYGRiZgHRrMxs7AhRDk4uIMnOzcmDpJSXj1+AgUFQSFgESZBdlFOMgV2cU4Id2VRJKWkZWTl5BRSr2BU5lZRVVNlRHaDGr66hqYXuLG1OHUy36urpYwoaSAsZYhE0kiVO0NjExJRKQQkAVH4HZC9bKmcAAAAASUVORK5CYII=",
  103. url: "https://yandex.com/search/touch/?text=",
  104. parameter: "text",
  105. hostnameRegex: /yandex\.com/,
  106. insertPoint: function(container) {
  107. let mainElement = document.getElementsByTagName("main")[0];
  108. let parentElement = mainElement.parentElement;
  109. parentElement.insertBefore(container, mainElement);
  110. }
  111. },
  112. KuaKe: {
  113. hide: 0,
  114. name: "夸克",
  115. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAC4jAAAuIwF4pT92AAAClElEQVQ4y7VUPWgTYRg+nbqojWhdMqQgiJs4uDgkVZPBISLaQRGKUdJBkOKimEBtpV20k+KQguJahC4iYgWVav1BRaFzBzVpkmt+G8ldyN3j93z33aW5VHHpCw8c933vc+/7vM+9GgDNhz6BQwI3BRYEfgiYAoZ6XlBnIYFt/nw/WVAgJbAooAtY6A1LnT0RSKicTQn7BdICNfxf2Io4rXK7CIPqYEXeFFfLxTa+vjEwP9vA7EQdmVt1zN1v4P3zJvRcW95RsaJygy5hn2pTVrZetfDuWROTF8s4cyCPE3tyiOxycHx3DqcG80ifK2H5gwnL8lhriiOgqQ###pWRbORIEccCOQz1O0ThHVkJPvMdcftyGYWfXZWSY0RTE6MWss3JRFmSMTm6N4dkWMfdqxXMjFVxJaojts85O70/j0fTdZQLbZeQHEskfOFOk5qxTVZAsmvxNXx6acBs2jANG9/eGrh+toTogEN64XABX14bG6ff0pS3ZHAArmbJcNEhMzo9tUwbn18ZGBVnvBMTxPOZRtfoNWVaGZmJmqcZ22Rl/jDEO56FdzqaMsdP6NWcGe8QzoxVuqqTPbVtVNcsTCXLHcLxXkKv5bl769IavMgBUDO2yahXLDx9/FsObfhgXt6hPMzxE3pDoWnjg85QOE0OgJqxze+C/NLRoudJgsRLIsc/FM82eraN1PkShpRtKPpoRMcdodmN4RJOBlc9b8ZDeTxI1VDM9tompH50myZd/mhK09JnbiVSL6WZQ7aKh1N1lAqesW3FEdHUCkq4VfJ3KvxqS9PSZ7GBTovUjG2yslKhaxHpimP735eD+DpNS59lNiwHasY2/7UctmR9bcmCdRHg1uDEaINNCFvqLELN/Pl/AGSMLPSsRFKQAAAAAElFTkSuQmCC",
  116. url: "https://quark.sm.cn/s?q=",
  117. parameter: "q",
  118. hostnameRegex: /quark\.sm\.cn/,
  119. insertPoint: function(container) {
  120. document.getElementById("page-channel-tab").parentElement.appendChild(container);
  121. }
  122. },
  123. QiHu360: {
  124. hide: 0,
  125. name: "360",
  126. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAADAFBMVEX////x+vbK7t2+6tXJ7dzu+fTe9Op10qUpunQPsmQluXJv0KLZ8ua2588vvHjF7NoiuHASs2Y9wIJVyJFAwYMTs2csu3fR8OH2/PlDwoU4v3696dT7/v38/v3D7Ng/wYPw+vWx5cwnuXPh9euk4cR106aB1q2O2rZpzp5bypWw5cy+6dVOxo0hsGApr16w5csqr14esGBNxoya0KHenDjwmjTkypbk0aP0mTSSypXz4MH/mTL/oUT/7dr/8eT/pk3x2LL//Pn/sWT/qFH/4MD//Pr//fz/48j/rFn/rl3/+PL/+fT//v7/58//njz/mTP/t2//mjX/oUP/6tT/0aT/pEj/yJH/27j/p07/o0j/4cP/nDj/r2D/8+j/p0//pUv/xYr/8OL/vn3/s2b/5s7/+/f/7Nr/587/69f/+vX/6dT/+fPi+IAAAQYAAAAAAAAAAAD5EAC/BuJ3lXYAAAELRACudjd3lXcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVBhRmcHcAAOAA1gAAAAAAAAAAAAAAAAAAAAAAAABkAAAAAAAAAAOOsAAAAN8AAAAAAAEAAADIAAAA4F/gZm9mcACgAOAA347WAAD5cAAsBuIG4vmQ8UYGCXcAd5IAAAAAAAAAAAAAAAAAAAAAAAAQCQCCZtR2Je/i+dDv3QYAdiUAAAAGC3y6LFBSAHB2JfAAAGAABQCAAAAAAAAQAIAAAMAAAAAAAAAABZwAAAACAAAAAAB4AHZmcAD4AOAG4vkAAAAAAABwAAAA4GYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAABwAAAG4vkAAEAAAADAAAAG4vkAAAAAAAAMAAAAAAAAAAIBAQA2AAAOXJLi+hTpPgYAdiUAAAAAAAL5+AAABuIAAAAGC3y6LFAAAHAAAAAABZwAGACAAAAAAAAAAAAAAAAAAAAAAAB6L2TFAAAAAWJLR0RuIg9RFwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAANxJREFUGNOV0GkzwlEYBfAbUcdayRoiLUQhWY+tSKVNKBWVQrbv/575P5fhZefVmd/Mc2buVarbmHp6zX3/qd9iBTAwOPTHhkcgsY7+mtkG2B1jznFgYlLb1DQw45pVc/NOwL0guAh4ZGzpe8Yr6AP8+igALEtbAYIaV4E1jaHwukbXxmZE2lZ0e0fj7l50X9oBeXhktOMT8lQwFifPzhPqIpki05eZrKG5PFlIXaWL5PXNbamcMPSuQkm1Fqvw/kEW6uVGgWw+tlS2zafnn/e/dF7f3o3y8dnFj38BOb4gIfEaIJ0AAAAASUVORK5CYII=",
  127. url: "https://m.so.com/s?q=",
  128. parameter: "q",
  129. hostnameRegex: /m\.so\.com/,
  130. insertPoint: function(container) {
  131. document.getElementsByTagName("header")[0].appendChild(container);
  132. }
  133. },
  134. SouGou: {
  135. hide: 0,
  136. name: "搜狗",
  137. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAC4jAAAuIwF4pT92AAAEvElEQVQ4y3WUe1CUVRjGsaYo0CbFskbRUCCnGKfy7mgwplkjM9oUaagg5RVvLCPgpMCyF0UF3V1ELiIKiw6ioogiAyorZNSCuqI1k8ruYoAiut5YLsI+T2eXJHe0P86c75x5z++8z/O+53Mh6eI0urtceefaOF5IkbMgTMeM6c1MHmNj0phupvo388AiHXUqGS0NI184K4bzxqOm4QKk4IH5tcyaZWZ+SCVPxWh5douK5Uo1T0TlMTe4kpoAMw8uOUl93go+bPJ8ObDryQBWqbYwZYKVud9eYW2OhBazD3uevtYXY/++b/Jh9V4Jd35upvwjK8u3K9kpzjoB7ZnZYdmzb7A8IYNNl6fwabvbyyT1Xm51Y92JecxeUMZk/+ss3arkg0bPXmB3pyt/0SioHmdlmTSd7RYPRyYtf/nxj5Ig6rWrWJW2gVXp0fwtZxUNx4NprPan1TKQD5qG8WhMOjd6t/H0Nhk7Hg9w4e2r45kbVMv931xh4+XJbH84kIajocxdqONmvw7KvEnpKDLOi4z9gNzkZeP2qfU8q/lZQAfRVDOZSV8YsGNWDX7VLnVhlVrOtBlm6vdJ2CVkGo4spmpqI2W+oFTAUr+u44lNu3kqQcXCmExqlxYyZbaeOUuOsOWmr10+KtIlkI41I2Gc0YUHQnTMW1gpzPZ2+HMqLpUJz7ISnXEmWUag1zv73NX+JhuvfkLzxYmixRwFQ8tNH+wMrMTqwSJIM62ZRVHavmqeU0kZ721jrJC4UUhUf1nH0kQl9flhrK+exsd3h9DW88rzRYIAY99yLVZ6iA3F6B6WylV9Aa1GH0dWaXOqGedrZYwoXtRQcv1QG+LHNEMzV4fC2GQ0GD7Ds8zt0PwNKix7WyxkH3azRKZ2agvY+rGx7lOe27WBe0OKuXG0BZL3iIghxNp3iTXvEBkhhbhr7HstOBilxpK3xGL7pCYejtA6NfDzjdxqGom6kjmoSIvE7u9LsWowEe4h4CMeoiwl0iHXPjJ+0iJsgDiUNa+Cmd9VOqTaISb9FNYUhPKWYSw6re7PZNln6LLCsXIQsWIgsXyQDUfiEvG0wxV3bnhDObMSoe4CUJYkY+IkM89nStjZ5s7jcTsQ69eCpJm12BNyHHlrs3EoJgW5a7KgmHYZywRs6duEPECPP3XT0dnmhtMpEYjwbYBktMmF98wjuXfRSSommHHp2DzcEmZXpEegQEAyhU87As9D6X8JCv+L2PpVFXb9cAwFm7ahvna8yLofHrUORoFUjqzwDNSdmdnr1YX9KxDtZcXuoDJYGof1SRQ9J4wfBWPtBJgujsftGz7oeNLfqbr2uDtGL1zTBcDS/H7vpuVvTxRvVkI28ToORqaj/vfJwr///Tk4Lnp8z8MBazGNwKH4BCTOLcL+9cn/BYmHjSKFEuuGtUE+1YCyXRJhtg/+fQ19DXxbFKBEsw6HZfG4ax6OfAEL7t8O6YwzuFAQ5HzzfZFpkTIBioAaRH9sxmZRuYwftdCuVyEnUoPU0DxIp4snNsqMPeFpuHouAMrAYsQLWE1xIHq6X31RTrvIVJe9DNF+RoT1Jxa7E4vciAVvEMGuxPzXidXeJlwpn4HWBk9krVXbM7PD7Of/Aa7HXbW/LOVCAAAAAElFTkSuQmCC",
  138. url: "https://m.sogou.com/web/searchList.jsp?keyword=",
  139. parameter: "keyword",
  140. hostnameRegex: /m\.sogou\.com/,
  141. insertPoint: function(container) {
  142. fixedContainer(container, () => document.getElementById("mainBody"), false, 3000);
  143. }
  144. },
  145. WeiXin: {
  146. hide: 0,
  147. name: "微信",
  148. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAC4jAAAuIwF4pT92AAACYElEQVQ4y2P4//8/AzUxhsCX31+4L7y7YLzywYr4rqtdjeXnyqdln8peknMqZzGIDRIDyd3/fF/5379/jHgN/PjrI/+MWzMK3fe6nVVYL/9Daq3kf2wYJJdwLH7DlidbgkB6MAz88+8P042PN7QbLjb06GzWfoXLIGQss1b6j+l20wcgPSC9IDPgBu58utPXY6/Habl1sr+QNPwF0v+wGPYPKgfmg/SA9ILMABv46vsr8eTjyWtgCqTXSv1z3eNyHmhzb8Th8F2K6xW+w+RAbJAYSM5su+l9ZItAZlz7cE2PYd6dedm6m3VewiRAXp53e27O199fuY+8POLotNvxEkwOxAaJgeQKzxTORTYQZEbwoeD9DEAbdyJLaGxUfz/x+oSq9z/fC25/ut3feqfVLZgciA0SA8llnsxYji1sGYy3GT1GDyPTbSYPYo7GbAG5CDlcQWyQGEgOV+QxqG5Q+URMrBKLGYCueUhVA+OPxm8ExSwVDPsHNOcvw4I78zO1Nmm+pdRAjU3q71z3upxnePL1sRwwxpZRamD6ibQVJ16fsAXnlCvvr+gXnimYR2y2Q8Zam7Xe5J/OW3D5/WUDlMLh7Y+3IuXnyqaTYpjqRpVPjRcbe15+fymBtbSZf2deFiy9qW9U+wCkf6IbIr9e7ofVDstbxWeKZq9+uCr22ddn0jiLr+6r3Q1GWw2fVJyrmAaKrL5rfbVFZ4rmJB5L2ADMq2uLzxbP7r/eV7P3+V5PULlJsIDd9HhT6MbHG8OA3hcGFp4Mv//+ZgaxH315pPAYGHnvfr4TAoqxkFRiU4oBJH6RE5TfS94AAAAASUVORK5CYII=",
  149. url: "https://weixin.sogou.com/weixinwap?type=2&_sug_=y&_sug_type_=&s_from=input&query=",
  150. parameter: "query",
  151. hostnameRegex: /weixin\.sogou\.com/,
  152. insertPoint: function(container) {
  153. document.getElementsByClassName("hhy-navcontainer")[0].appendChild(container);
  154. }
  155. },
  156. TouTiao: {
  157. hide: 0,
  158. name: "头条",
  159. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAADAFBMVEX////+/v7x8fHt7e3u7u719fXw8PDy8vLz8/P29vbl5eX/+/v/9PT/7e3/5ub/39//2Nj/0dH9ycn5wsLxyMj/u7v/tLT/ra3/pqb/n5//mZn/kZH/ior/g4P/fHz/dXX/bm7/Z2f/YGD/Xl7xiIj/gID/c3P/aGj/dnb/cnL/eHj/l5f/i4v/bGz/kJD/nZ3/9fX/7+//8vL//v7/rKz/j4//4eH/lpb/trb/xMT/kpL/oqL/3d3/3Nz/eXn/jo7/cHD/v7//Y2P/oaH//f3/sbH/5+f/mJj/ycn/7u7/y8v/zMz/yMj/X1//amr/fX3/vLz/29v/4+P/urr/wcH/5eX/7Oz/9vb/3t7/qKj/tbX/wsL/5OT/4uL/sLD/lJT/ZGT/gYH/e3v/jIz/6ur/vb3/w8P/np7/d3f/enr/ysr/8/P/Zmb/qan/dHT/YmL/YWH/b2//hIT/k5P/mpr/paXwu7v/r6//0tL/2dn/4OD//Pz9/f35+fnk5OT8/Pz09PTr6+vn5+f7+/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVBhR+CHcAAOAA1gAAAAAAAAAAAAAAAAAAAAAAAABkAAAAAAAAAASg8AAAAN8AAAAAAAAAAADgAAAA4Hfgfgd+CADgAOAA36DWAAD5cAAsA60DrfmQ8UYGCXcAd5IAAAAAAAAAAAAAAAAAAAAAAAAQCQCCY5t2Je+t+dDv3QMAdiUAAAAGC3y6LFBSAHB2JfAAAGAABQCAAAAAAAAQAIAAAMAAAAAAAAAABXQAAAACAAAAAAByAHB+CAD4AOADrfkAAAAAAAAIAAAA4H4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAABwAAADrfkAAEAAAADAAAADrfkAAAAAAAAMAAAAAAAAAAIBAQA2AAALE5Kt+hTpPgMAdiUAAAAAAAL5+AAAA60AAAAGC3y6LFAAAHAAAAAABXQAGACAAAAAAAAAAAAAAAAAAAAAAAANN29TAAAAAWJLR0SEYtBacQAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAShJREFUGNNjYGBkYmZBAsysDAwMjGysjAxIgJGdg4GBnZMBDbBzMbAheNw8vHz8AoJCwgwiomLiEpJS0jKycvIKikrKIMCgogwHqmrqChqqmmBBLW0dXT19ZWUNXgNeQyNjE7CgqRmvuYWlsrKVgZm1pI2tHVhQ3sreQdRRWdnJmcfFxcBVByxo5cbjbmmhrOzh6eVqIubtAxb09fP3twmQkTMRlwgMCg6xAAmqhYYZhnPzRURGeUTHxIrFxYMEExKTklNEJdyVnVKdA9LS3TIg7sw0y1KUzFaV9JS3CM7xyQUL5nmIKirn22doySur56D5qEC9UMO/SKe4xLmUoazcItXSq6Kyys3ToBoSeDUMTLXoQcdax1DPgibKyVbPwNDQiCrY1MwAAIhjO1uH8gJKAAAAAElFTkSuQmCC",
  160. url: "https://so.toutiao.com/search?source=input&pd=synthesis&original_source=&keyword=",
  161. parameter: "keyword",
  162. hostnameRegex: /so\.toutiao\.com/,
  163. insertPoint: function(container) {
  164. fixedContainer(container, () => document.getElementById("head-bar"), 100, false, 3000);
  165. }
  166. },
  167. ShenMa: {
  168. hide: 0,
  169. name: "神马",
  170. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0MzYwLCAyMDIwLzAyLzEzLTAxOjA3OjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDI0LTA2LTI4VDE0OjQ5OjE4KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0wNi0yOFQxNDo0OTozNSswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNC0wNi0yOFQxNDo0OTozNSswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDphNmVjYzViMy0wYjAxLTkwNGQtOWUyNC1kNDBiOWNmNGRiYTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6YTZlY2M1YjMtMGIwMS05MDRkLTllMjQtZDQwYjljZjRkYmEyIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6YTZlY2M1YjMtMGIwMS05MDRkLTllMjQtZDQwYjljZjRkYmEyIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDphNmVjYzViMy0wYjAxLTkwNGQtOWUyNC1kNDBiOWNmNGRiYTIiIHN0RXZ0OndoZW49IjIwMjQtMDYtMjhUMTQ6NDk6MTgrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMS4xIChXaW5kb3dzKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz60LnLGAAADW0lEQVQ4jXWVS2hcZRTHf+f7vjuPZNJ0Okns1KRVmhhSfMWqNSi0IrRIKYiLIgi+4sqIiHVRdFHQndiNCzeSFqugBNGN2hrRFqmtUqQ2hZY2xQRrYkpK83CaSeY+jot7MzMJ7Vmde7/7/fj/zzmcK/oOHsoreLyEYyO3CwEU8JPcS94rEPA3Pp8iDDqUfrJ8TA7B3hYXh3FocydogMxdiWEAIRsosY0yGBz9VZgCEbAELCZqtKZMsxuo7P4ev+8gBMm3Clggh+DoN3i0V2EKZNYSde4kfOA5tNi70qpxaK4dmb0BMwmQOqhHu6EmHELQpruJ2nYQrXuSqGlrDAqATJbojkcBQRvXo5v7IJWCcEVR1FWBCqQ9NNsGc1OY8l+YyVNQhqhnO8F9b6CFByH00dZuKnu+xFz7HffLADI/DekaMLErBD2vEt7/JurWQEMBM34Me+kIYffz2D+/QfPnCZ54G3vuczSbJ+h7HRamcWfeQ5auxX2rirVgpi/ifbeP9Bd7kBtX0GwRJY8Z/Rnzz29oYRPYFNGmx9FCJ7IwS9j7GmHn3riRsgwUIFLM5ROYy98StW1Gm4q4s4dxpz9B8PF3vU905yOwOI/79UO8o/sw0xexI0PY88djhkDNcqqRsHcXUddewrt2QyZH1LENgknCrqfxhvcTPPYW0cbtmLGjRF1PQbCAG96P/DcGLfG4xUAfwu5nCbcMoDYHJoMZPY6KI7z3ZXRtD5prQfMdII5gxwG0uAV38gNkbgxak+LpsmUPzORJvKEXsOeOgDW40wfxvh7Anv0MKiX8nR8RrX8YtRYkhfvhAGZ0GNbVYLCs0IDMjsE8aGsHRAJL1xE7ix3/CjN+Am17iMozhzETZ3A/vhsPcktC0KQP1S5rkhUM2noPVBaRpTloABpAouvIzRFEIqQ8AyliZbUproZb8WQEe2EI4x9DSv/GFwHSoIUimm1GFudqUlbBloFSHR0NsSODcDNWtmJheGvANkBl/pagJKQGXLaeiRXVjTwoaDoPnoVgceXZKqDBZ4KwDiuJstWRakSmLmEm/6gtV+ruhIDPhCNgkBJbya0CSV2eBnP1J1IXTsVD3LzqPARKQMCgQzhEGQh4EUfHrY2AzEzFSzedXK6vY8DV5Bdw6H+C7ToUtYG1fgAAAABJRU5ErkJggg==",
  171. url: "https://m.sm.cn/s?&from=smor&safe=1&q=",
  172. parameter: "q",
  173. hostnameRegex: /\.sm\.cn/,
  174. insertPoint: function(container) {
  175. document.getElementById("header").appendChild(container);
  176. }
  177. },
  178. DuckDuckGo: {
  179. hide: 0,
  180. name: "DuckDuckGo",
  181. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF8WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0MzYwLCAyMDIwLzAyLzEzLTAxOjA3OjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDI0LTA2LTI4VDE0OjU3OjE1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI0LTA2LTI4VDE0OjU3OjE1KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0wNi0yOFQxNDo1NzoxNSswODowMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1NWY5NzNmMi1kMzZjLTZjNDctODAxMi1lN2I1N2ZkZmY2MjQiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDoxYWY2YWU2Zi02ZTUyLTc5NDUtODBkZC00M2NkMTFhMWYxOWQiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozY2I0OGE3MS1###ZjLWRlNGMtYThhYi1hNjc4ZmMyYmE2MTYiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjNjYjQ4YTcxLWZkNmMtZGU0Yy1hOGFiLWE2NzhmYzJiYTYxNiIgc3RFdnQ6d2hlbj0iMjAyNC0wNi0yOFQxNDo1NzoxNSswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NWY5NzNmMi1kMzZjLTZjNDctODAxMi1lN2I1N2ZkZmY2MjQiIHN0RXZ0OndoZW49IjIwMjQtMDYtMjhUMTQ6NTc6MTUrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMS4xIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4h8DtFAAAE90lEQVQ4jW2UbWydZRnHf/d9Py/nvaen9HRrx14AccDG0pa5AVsnWQGnTFkFImhICG9Ro/umJCRKjPJFDX5CP0iMMS4gmRFfaDBqKbg5RsWN1cq6tmvX9nRna3t6Xp9znue5n9sPWwgS/5+v//+6cl1XfmLmS/18XMZvYfzmfhlP3a468v1Wx7qNCKF0eaUYLl98L6qVx1D2sIzFGx/3Wv+bZIjqld1WruvbqX1fvs/ZvNWSiRQoCZEBITFe7Z6gOE9t9A+jrbnJF2Qi/ZqwbDAGAPHhhFGErpUfTe4e/FF26InOsLhI/dgw/sJ5Iq+KsGOoTBars5tE316cjTdQHfm9X/nzK88L2/2ecFyDMajD27rBGHSt/JXM4Bdfyj341XRl+AjexHu4W25CZdoJiwX8C5NE1TWChWka746gy6tkhx5XVr7n096pYxLEiJDWlcCoUe1N7tp/pP2hr6VKv/4JldePYHX1EB98gOz9j5HY/imiRo2oVAQpkbEEral/0zp7iraDjyLjyYHm+MmzwnbG1Tc/2aFUJvfTziee7a3+5SiVN15G5jpJ9O0lueN27GwHVi5Pcu/nMIk2vFPHESZCJtMEhTmCxVnaH3hK+PNT/cHShVelaTXvTO/7/Gd1eZXqX48ibYfkrv3UDn2LQmwD4uq9Whq8XYeI7b4HWg0wBtWWwxs/iff+CdJ33b8F+IIUseSA+4ntVv2fo0SNGsaJ4e64g1Q6TtT08H0NgCMMpbJH/eZ9WKkMUSvEaIGwbBon/4aV78Fet2FQWrl8n4zFCBZmEJYNysLKZMmmFL86OsY7p+cBkFIwWTAsBnmc+DUIEWBlQcRi+PMzmMDHvX7b9ZbKdW4CgS4tI2wHo0OCtRJx4O69N7Ll2hw0piCcZqhfoFcX8aoNMilFcxZKbyt0rYwuLaPaO1OWEEIYYzAmAiEhbNFcnCUH7Nm5B###YPLrBIuXCAou2AZsm+acQ/UMIK5u2UQghLR0eXVRSNmr2nKEl5eQQuBfKtDSEa6S4PvAGuFak5UTcaKWQDgCNOg6gEYmkqhsB3pirC7DleLpqNXEWb8RE7QQlo1emMK/vHSlc7oPrv0xznW30nlA03VQ0PUZSPeCsCHymtjdm5FuAn964oKM6pXjwdw54n0DCGWBVJjiPP7MxNWHEZC9G118iPpv6jRGDSsjUBkDEwKhR6J3D3ptmaAw+6YUtjtSHfndqN3VQ2rPAXStgvCb+PMztNBMVydZ8pZY###OqBg/73F4LW8hGwJTXcO98VaSO++i+tYfl4zWv7WEG/P8pbnnysMvD7c/+HQsuHgB790R1NRZ5kuzfP8/z1LxVhFGU30kTqHb4c5Jzb3vLONm83Q89R2890/QGHvzBzKZnlaHt3UjbWe2de6Mp1Jt92aHniRcXiI8N4F/yw7+FByjWJ6jK3Mdm1Zgw/gC+UKV2xLbWfeN5/EvLbDyyx/+Qij1XaEccwVfQmCCANNsPJM58PBzmf2H3OYHp9Fb+3m74yJtWnFb/g7k2D8ovfIi9O2io38Q7/RxSq/+7CV0eFjEEnWM+QgPhYAwJGrUhtwbbnkmNXDfTmfzVhJbd0LCvVLjNfHHT6IvFSideGOq8a+/vyBj8ReF4/4fwH5EkVfPEUUHVbptwFm/6SZ1zfqMEUJGlVItuFw4ry8X3jJR9LqMJ88jJGA+9P4XWQFAhlNU5A8AAAAASUVORK5CYII=",
  182. url: "https://duckduckgo.com/?t=h_&q=",
  183. parameter: "q",
  184. hostnameRegex: /duckduckgo\.com/,
  185. insertPoint: function(container) {
  186. document.getElementById("header").appendChild(container);
  187. }
  188. },
  189. Bilibili: {
  190. hide: 0,
  191. name: "B站",
  192. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF8WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0MzYwLCAyMDIwLzAyLzEzLTAxOjA3OjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDI0LTA4LTA1VDExOjI1OjI1KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0wOC0wNVQxMToyNTo1NSswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNC0wOC0wNVQxMToyNTo1NSswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2NTExMmQ2Yy1jODFhLTAyNDctOTg4ZC05MDdiODQyMDQ3ODIiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDphMjcwZjJkMi0zMGZiLTAyNDItOGZlNS0wOTcxMGYxYzk5Y2IiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxZGRmMmQ3MS1lN2Y5LTQxNGQtOGQ3ZC1hMGQ2NzY5NDY3YzUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjFkZGYyZDcxLWU3ZjktNDE0ZC04ZDdkLWEwZDY3Njk0NjdjNSIgc3RFdnQ6d2hlbj0iMjAyNC0wOC0wNVQxMToyNToyNSswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo2NTExMmQ2Yy1jODFhLTAyNDctOTg4ZC05MDdiODQyMDQ3ODIiIHN0RXZ0OndoZW49IjIwMjQtMDgtMDVUMTE6MjU6NTUrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMS4xIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5t2pzwAAABhUlEQVQ4jaXUvWsUURTG4WfHC0EUrbTUCAn40USiGMkfYGkRsLCRELSzsVEbCxsVVLBViASrdNbaiJ1iYbVaJJ1FjKggiBauYzFnd6/LXZNdXxjmcN/3/ObjnpmWlbZMp3Adr3AHv5VV4Wrkb0W+Z+Saw1ks4vQQmPAWIzs3eKVc6/iKaTzGfAE2H950ZNdzM2X1FDp4jTMZ9CY+RWYfboQnsp3oXYOWlXbCFVwMYxyt4RHuJ1zQbMD/aCoYX1LcGbRxG5sjwvbjGo5iKeFAGE/xZMw7PBzAg/ku/8zqSc1uThSaJ8KbLPVWqKPeEec9WMZzLBSAC+EtRzbvrQfnsAucxU7MFPyZ8GYzYE8l4A9sRP2h4HfXNiL7l9LgAj7jMo5gteCvooV3kR0KrLP6WRwlfcSDgbVeb6X/2L+GALajbm9V6b+HY9g1Bmx39ML3hBc4hHOa2fo2InAvTkb9MuGuZhSO+/c/cCu9xb2k+YbP4xJO6A/pdtXBGzzE+1Zd11vkR9MfcA5NaUkxMGUAAAAASUVORK5CYII=",
  193. url: "https://m.bilibili.com/search?keyword=",
  194. parameter: "keyword",
  195. hostnameRegex: /m\.bilibili\.com/,
  196. insertPoint: function(container) {
  197. fixedContainer(container, () => document.getElementsByClassName("order-tabs")[0], 100, true, 3000);
  198. }
  199. }
  200. };
  201. // 获取URL参数的值
  202. function getQueryString(params) {
  203. var queryString = window.location.search.substring(1).split("&");
  204. var paramArray = params.split("|");
  205. for (var i = 0; i < queryString.length; i++) {
  206. var pair = queryString[i].split("=");
  207. if (paramArray.includes(pair[0])) {
  208. return pair[1];
  209. }
  210. }
  211. return false;
  212. }
  213. // 在指定元素之前插入元素
  214. function insertAfter(newNode, referenceNode) {
  215. var parent = referenceNode.parentNode;
  216. parent.lastChild == referenceNode ? parent.appendChild(newNode) : parent.insertBefore(newNode, referenceNode.nextSibling);
  217. }
  218. //为元素添加滑动隐藏事件
  219. function SwipeUpToHide(element, callback, excludeElement) {
  220. if (!element) return;
  221. let startX = 0;
  222. let startY = 0;
  223. let endX = 0;
  224. let endY = 0;
  225. let hasMoved = false;
  226. element.addEventListener('touchstart', (e) => {
  227. if (excludeElement && (excludeElement.contains(e.target) || excludeElement === e.target)) {
  228. return;
  229. }
  230. startX = e.touches[0].clientX;
  231. startY = e.touches[0].clientY;
  232. hasMoved = false;
  233. });
  234. element.addEventListener('touchmove', (e) => {
  235. if (excludeElement && (excludeElement.contains(e.target) || excludeElement === e.target)) {
  236. return;
  237. }
  238. endX = e.touches[0].clientX;
  239. endY = e.touches[0].clientY;
  240. if (Math.abs(startY - endY) > 30) { // 检测微小移动
  241. hasMoved = true;
  242. }
  243. // 阻止默认的纵向滚动,但不阻止 div 内部的横向滚动
  244. let canScrollVertically = element.scrollHeight > element.clientHeight;
  245. let canScrollHorizontally = element.scrollWidth > element.clientWidth;
  246. let isScrollingUp = startY > endY;
  247. let isScrollingDown = startY < endY;
  248. let isAtTop = element.scrollTop === 0;
  249. let isAtBottom = element.scrollHeight - element.scrollTop === element.clientHeight;
  250. let isScrollingHorizontally = Math.abs(startX - endX) > Math.abs(startY - endY);
  251. if (!isScrollingHorizontally && ((isScrollingUp && isAtTop) || (isScrollingDown && isAtBottom))) {
  252. e.preventDefault(); // 阻止默认的纵向滚动行为
  253. }
  254. });
  255. element.addEventListener('touchend', (e) => {
  256. if (excludeElement && (excludeElement.contains(e.target) || excludeElement === e.target)) {
  257. return;
  258. }
  259. if (hasMoved && startY > endY && startY - endY > 50) { // 上滑检测
  260. element.style.transform = 'translateY(-100%)';
  261. callback(e);
  262. }
  263. // 重置变量以确保后续触摸操作正常
  264. startX = 0;
  265. startY = 0;
  266. endX = 0;
  267. endY = 0;
  268. hasMoved = false;
  269. });
  270. }
  271. //创建设置按钮
  272. function createSettingButton(container, searchEngines) {
  273. // 创建设置页面搜索引擎列表
  274. function createSearchEngineList(engine, currentParameter, engineKey) {
  275. var child = document.createElement("div");
  276. child.setAttribute("style", "font-size:16px;background-color:#DEEDFF;padding:5px;border-radius:5px;margin:5px;align-items:center;display:flex;");
  277. child.setAttribute("engine", engineKey.toString());
  278. var icon = document.createElement("img");
  279. icon.setAttribute("style", "margin:0 2px;vertical-align:middle;width:20px;height:20px;");
  280. icon.setAttribute("src", engine.icon);
  281. child.appendChild(icon);
  282. var title = document.createElement("span");
  283. title.style = "width: calc(100% - 220px);word-wrap: break-word;color:black";
  284. title.innerText = engine.name;
  285. child.appendChild(title);
  286. //创建顺序调整和隐藏/显示按钮
  287. var buttonContainer = document.createElement("div");
  288. buttonContainer.style = "margin-left: auto;";
  289. var buttonUP = document.createElement("button");
  290. var buttonDown = document.createElement("button");
  291. var toggleHide = document.createElement("button");
  292. buttonUP.style = buttonDown.style = toggleHide.style = "width:45px;height:27px;line-height:27px;color: #fff;background-color:#1677ff;border-radius:6px;margin:5px;font-size: 14px;border:0;padding:0;";
  293. toggleHide.innerHTML = "隐藏";
  294. buttonUP.innerHTML = "↑";
  295. buttonDown.innerHTML = "↓";
  296. // 添加隐藏/显示切换功能
  297. toggleHide.addEventListener("click", function() {
  298. if (toggleHide.innerHTML === "隐藏") {
  299. toggleHide.innerHTML = "显示";
  300. child.style.backgroundColor = "#dbdbdb";
  301. } else {
  302. toggleHide.innerHTML = "隐藏";
  303. child.style.backgroundColor = "#DEEDFF";
  304. }
  305. checkVisibleEngines();
  306. }, false);
  307. // 实现顺序调整
  308. buttonUP.addEventListener("click", function() {
  309. var parent = child.parentNode;
  310. if (child.previousElementSibling) {
  311. parent.insertBefore(child, child.previousElementSibling);
  312. }
  313. }, false);
  314. buttonDown.addEventListener("click", function() {
  315. var parent = child.parentNode;
  316. if (child.nextElementSibling) {
  317. parent.insertBefore(child.nextElementSibling, child);
  318. }
  319. }, false);
  320. buttonContainer.appendChild(toggleHide);
  321. buttonContainer.appendChild(buttonUP);
  322. buttonContainer.appendChild(buttonDown);
  323. child.appendChild(buttonContainer);
  324. return child;
  325. }
  326. //保存配置
  327. function saveEngineOrder() {
  328. var engineOrder = [];
  329. var hiddenStates = {};
  330. var engineList = document.querySelector("#settings_dialog div");
  331. engineList.childNodes.forEach(function(child) {
  332. var engineKey = child.getAttribute("engine");
  333. engineOrder.push(engineKey);
  334. var toggleHide = child.querySelector("button");
  335. hiddenStates[engineKey] = (toggleHide.innerHTML === "隐藏") ? false : true;
  336. });
  337. GM_setValue("engineOrder", engineOrder);
  338. GM_setValue("hiddenStates", hiddenStates);
  339. GM_setValue("expandSearchEngineChecked", expandSearchEngineCheckbox.checked);
  340. GM_setValue("floatChecked", floatCheckbox.checked);
  341. GM_setValue("hideOnScrollCheckboxed", hideOnScrollCheckbox.checked);
  342. }
  343. // 加载配置
  344. function loadEngineOrder() {
  345. var engineOrder = GM_getValue("engineOrder", []);
  346. var hiddenStates = GM_getValue("hiddenStates", {});
  347. var expandSearchEngineChecked = GM_getValue("expandSearchEngineChecked", false);
  348. var floatChecked = GM_getValue("floatChecked", false);
  349. const hideOnScrollCheckboxed = GM_getValue("hideOnScrollCheckboxed", false);
  350. return {
  351. engineOrder,
  352. hiddenStates,
  353. expandSearchEngineChecked,
  354. floatChecked,
  355. hideOnScrollCheckboxed
  356. };
  357. }
  358. var confirm_button_disabled
  359. // 检查是否符合保存条件
  360. function checkVisibleEngines() {
  361. var engineList = document.querySelector("#settings_dialog div");
  362. var visibleEngines = Array.from(engineList.childNodes).filter(function(child) {
  363. var toggleHide = child.querySelector("button");
  364. return toggleHide.innerHTML === "隐藏";
  365. });
  366. confirm_button_disabled = visibleEngines.length < 2; // 必须选择至少两个搜索引擎
  367. }
  368. //创建设置按钮
  369. var setting_button = document.createElement("div");
  370. setting_button.setAttribute("style", "font-size:16px;background-color:#DEEDFF;display:inline-flex;padding:5px;border-radius:5px;margin:5px;align-items: center;height:25px;box-sizing:unset;");
  371. var icon = document.createElement("img");
  372. icon.setAttribute("style", "margin:0 2px;vertical-align:middle;width:20px;height:20px;");
  373. icon.setAttribute("src", "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' x='0px' y='0px' width='100' height='100' viewBox='0 0 24 24'%3E%3Cpath d='M 9.6679688 2 L 9.1757812 4.5234375 C 8.3550224 4.8338012 7.5961042 5.2674041 6.9296875 5.8144531 L 4.5058594 4.9785156 L 2.1738281 9.0214844 L 4.1132812 10.707031 C 4.0445153 11.128986 4 11.558619 4 12 C 4 12.441381 4.0445153 12.871014 4.1132812 13.292969 L 2.1738281 14.978516 L 4.5058594 19.021484 L 6.9296875 18.185547 C 7.5961042 18.732596 8.3550224 19.166199 9.1757812 19.476562 L 9.6679688 22 L 14.332031 22 L 14.824219 19.476562 C 15.644978 19.166199 16.403896 18.732596 17.070312 18.185547 L 19.494141 19.021484 L 21.826172 14.978516 L 19.886719 13.292969 C 19.955485 12.871014 20 12.441381 20 12 C 20 11.558619 19.955485 11.128986 19.886719 10.707031 L 21.826172 9.0214844 L 19.494141 4.9785156 L 17.070312 5.8144531 C 16.403896 5.2674041 15.644978 4.8338012 14.824219 4.5234375 L 14.332031 2 L 9.6679688 2 z M 12 8 C 14.209 8 16 9.791 16 12 C 16 14.209 14.209 16 12 16 C 9.791 16 8 14.209 8 12 C 8 9.791 9.791 8 12 8 z'%3E%3C/path%3E%3C/svg%3E");
  374. setting_button.appendChild(icon);
  375. // 创建设置对话框
  376. var dialog = document.createElement("div");
  377. var title = document.createElement("h2");
  378. title.innerHTML = "设置<a target='_blank' style='float:right;color:#1677FF;font-size:15px;text-decoration: underline;' href='https://greasyfork.org/zh-CN/scripts/499230'>更新脚本</a>";
  379. dialog.appendChild(title);
  380. dialog.id = "settings_dialog";
  381. dialog.setAttribute("style", "position:fixed;top:50%;left:50%;transform:translate(-50%, -50%);padding:20px;background:white;border:1px solid #ccc;z-index:1000;width:80%;white-space: normal;display:none;border-radius: 15px;box-shadow: 0px 0px 25px 0px rgba(0,0,0,0.7);font-size: 15px;line-height: normal;opacity:1;height: auto; max-height: 90vh; overflow-y: auto;");
  382. var engineList = document.createElement("div");
  383. engineList.style = "max-height: 65vh;overflow-y: auto;";
  384. // 读取配置
  385. var {
  386. engineOrder,
  387. hiddenStates,
  388. expandSearchEngineChecked,
  389. floatChecked,
  390. hideOnScrollCheckboxed
  391. } = loadEngineOrder();
  392. // 将列表元素按照配置顺序添加到设置页面搜索引擎列表
  393. if (engineOrder.length > 0) { // 如果engineOrder数组不为空,则按照engineOrder的顺序添加搜索引擎
  394. engineOrder.forEach(function(engineKey) { // 遍历engineOrder数组,对每个engineKey进行处理
  395. if (searchEngines[engineKey]) { // 检查searchEngines对象中是否存在对应的engineKey
  396. var engineElement = createSearchEngineList(searchEngines[engineKey], "#", engineKey); // 创建搜索引擎列表元素
  397. if (hiddenStates[engineKey]) { // 如果hiddenStates中对应的engineKey为true,则设置元素为隐藏状态
  398. engineElement.querySelector("button").innerHTML = "显示";
  399. engineElement.style.backgroundColor = "#dbdbdb";
  400. }
  401. engineList.appendChild(engineElement); // 将创建的搜索引擎元素添加到搜索引擎列表中
  402. }
  403. });
  404. } else {
  405. for (let engine in searchEngines) { // 如果engineOrder数组为空,则按照searchEngines对象的顺序添加搜索引擎
  406. engineList.appendChild(createSearchEngineList(searchEngines[engine], "#", engine)); // 创建并添加搜索引擎列表元素
  407. }
  408. }
  409. // 将创建的搜索引擎列表添加到对话框
  410. dialog.appendChild(engineList);
  411. // 创建确认和取消按钮
  412. var confirmButton = document.createElement("button");
  413. var cancelButton = document.createElement("button");
  414. // 设置按钮的样式和文本
  415. var settingButtonWrapper = document.createElement("div");
  416. settingButtonWrapper.style.cssText = "display: flex; align-items: center; flex: 1 0 100%; margin-bottom: 8px;float:right;";
  417. confirmButton.id = "confirm_button";
  418. cancelButton.style = confirmButton.style = "padding:10px 25px;border-radius:6px;margin:10px 5px 10px 5px;background-color:#1677ff;color: #fff;border:0;";
  419. confirmButton.textContent = "确定";
  420. cancelButton.textContent = "取消";
  421. settingButtonWrapper.appendChild(cancelButton);
  422. settingButtonWrapper.appendChild(confirmButton);
  423. // 为取消按钮添加点击事件监听器,点击时隐藏对话框
  424. cancelButton.addEventListener("click", function() {
  425. dialog.style.display = "none";
  426. }, false);
  427. // 创建展开搜索引擎的复选框及其标签
  428. var expandSearchEngineCheckbox = document.createElement("input");
  429. expandSearchEngineCheckbox.type = "checkbox";
  430. expandSearchEngineCheckbox.id = "expandSearchEngine";
  431. expandSearchEngineCheckbox.style.cssText = "width: 20px; height: 20px; border: 2px solid #1677FF; border-radius: 3px; outline: none; cursor: pointer; appearance: auto;";
  432. var expandSearchEngineCheckboxLabel = document.createElement("label");
  433. expandSearchEngineCheckboxLabel.htmlFor = "expandSearchEngine";
  434. expandSearchEngineCheckboxLabel.appendChild(document.createTextNode("展开搜索引擎"));
  435. // 创建复选框和标签的函数
  436. function createCheckbox(id, labelText, initialChecked) {
  437. var checkbox = document.createElement("input");
  438. checkbox.type = "checkbox";
  439. checkbox.id = id;
  440. checkbox.style.cssText = "width: 20px; height: 20px; border: 2px solid #1677FF; border-radius: 3px; outline: none; cursor: pointer; appearance: auto;";
  441. checkbox.checked = initialChecked;
  442. var label = document.createElement("label");
  443. label.htmlFor = id;
  444. label.appendChild(document.createTextNode(labelText));
  445. var wrapper = document.createElement("div");
  446. wrapper.style.cssText = "display: flex; align-items: center; flex: 1 1 100px;";
  447. wrapper.appendChild(checkbox);
  448. wrapper.appendChild(label);
  449. return {
  450. checkbox,
  451. wrapper
  452. };
  453. }
  454. // 创建复选框及其容器
  455. var floatCheckboxObj = createCheckbox("floatCheckbox", "半悬浮在顶部", floatChecked);
  456. var hideOnScrollCheckboxObj = createCheckbox("hideOnScrollCheckbox", "向下滚动时隐藏", hideOnScrollCheckboxed);
  457. // 设置expandSearchEngineCheckbox的初始状态
  458. expandSearchEngineCheckbox.checked = expandSearchEngineChecked;
  459. // 创建expandSearchEngineCheckbox的容器
  460. var expandWrapper = document.createElement("div");
  461. expandWrapper.style.cssText = "display: flex; align-items: center; flex: 1 1 200px;";
  462. expandWrapper.appendChild(expandSearchEngineCheckbox);
  463. expandWrapper.appendChild(expandSearchEngineCheckboxLabel);
  464. // 创建总容器
  465. var wrapper = document.createElement("div");
  466. wrapper.style.cssText = "display: flex; flex-wrap: wrap; margin-top: 16px;";
  467. wrapper.appendChild(expandWrapper);
  468. var show_mode_tips = document.createElement("div");
  469. show_mode_tips.style.cssText = "flex: 1 1 100%;margin-top: 10px;"
  470. show_mode_tips.textContent = "浮动显示模式:";
  471. wrapper.appendChild(show_mode_tips);
  472. wrapper.appendChild(floatCheckboxObj.wrapper);
  473. wrapper.appendChild(hideOnScrollCheckboxObj.wrapper);
  474. // 添加互斥逻辑
  475. function addMutualExclusion(checkbox1, checkbox2) {
  476. checkbox1.addEventListener("change", function() {
  477. if (checkbox1.checked) {
  478. checkbox2.checked = false;
  479. }
  480. });
  481. checkbox2.addEventListener("change", function() {
  482. if (checkbox2.checked) {
  483. checkbox1.checked = false;
  484. }
  485. });
  486. }
  487. addMutualExclusion(floatCheckboxObj.checkbox, hideOnScrollCheckboxObj.checkbox);
  488. // 将复选框容器添加到对话框
  489. dialog.appendChild(wrapper);
  490. // 为确认按钮添加点击事件监听器
  491. confirmButton.addEventListener("click", function() {
  492. if (confirm_button_disabled) { // 检查确认按钮是否被禁用
  493. alert("必须至少显示两个搜索引擎。");
  494. return;
  495. }
  496. alert("刷新页面生效。"); // 显示提示信息
  497. saveEngineOrder(); // 保存搜索引擎顺序
  498. dialog.style.display = "none"; // 隐藏对话框
  499. }, false);
  500. var float_tips = document.createElement("span");
  501. float_tips.textContent = "(开启悬浮或滚动隐藏后向上滑动引擎栏可关闭搜索栏)";
  502. dialog.appendChild(float_tips);
  503. dialog.appendChild(settingButtonWrapper);
  504. // 将对话框添加到容器
  505. container.appendChild(dialog);
  506. // 为设置按钮添加点击事件监听器
  507. setting_button.addEventListener("click", function() {
  508. dialog.style.display = (dialog.style.display === "block") ? "none" : "block";
  509. checkVisibleEngines(); // 检查可见的搜索引擎
  510. }, false);
  511. return setting_button;
  512. }
  513. // 创建搜索引擎容器元素
  514. function createSearchEngineContainer() {
  515. var container = document.createElement("div");
  516. container.id = "searchengine_container";
  517. var wrap = GM_getValue("expandSearchEngineChecked", false) ? '' : 'white-space: nowrap; overflow-x: auto;'
  518. var floatWrapper = GM_getValue("floatChecked", false)
  519. let hideOnScroll = GM_getValue("hideOnScrollCheckboxed", false);
  520. if (floatWrapper || hideOnScroll) {
  521. var top_container = document.createElement("div");
  522. top_container.id = "searchengine_top_container"
  523. document.documentElement.insertBefore(top_container, document.body);
  524. document.body.style.position = 'relative';
  525. wrap = wrap + "position: fixed;top: 0;z-index: 10000;"
  526. }
  527. container.setAttribute("style", "padding:5px;text-align:left;width: 100vw;box-sizing:border-box;font-size:0;transition: transform 0.3s ease,opacity 0.3s ease;" + wrap);
  528. return container;
  529. }
  530. // 创建单个搜索引擎子元素
  531. function createSearchEngineChild(engine, currentParameter, ignoreHide = false) {
  532. if (!ignoreHide && engine.hide) return null; // 如果hide为true,则跳过创建
  533. var child = document.createElement("div");
  534. child.setAttribute("style", "font-size:16px;background-color:#DEEDFF;display:inline-flex;padding:5px;border-radius:5px;margin:5px;align-items: center;height:25px;white-space: nowrap;box-sizing:unset;");
  535. var icon = document.createElement("img");
  536. icon.setAttribute("style", "margin:0 2px;vertical-align:middle;width:20px;height:20px;");
  537. icon.setAttribute("src", engine.icon);
  538. child.appendChild(icon);
  539. var title = document.createElement("span");
  540. title.style = "width: calc(100% - 220px);word-wrap: break-word;color:black";
  541. title.innerText = engine.name;
  542. child.appendChild(title);
  543. child.addEventListener("click", function() {
  544. window.location.href = engine.url + getQueryString(currentParameter);
  545. }, !1);
  546. return child;
  547. }
  548. // 监听容器是否被移除
  549. function fixedContainer(container, getElementById, intervalTime = 1000, insertBefore = true, destroyAfterSeconds = null) {
  550. function insertContainer() {
  551. const targetElement = getElementById();
  552. if (!targetElement) return;
  553. const parentElement = targetElement.parentElement;
  554. if (!parentElement) return;
  555. if (insertBefore) { // 如果insertBefore为true
  556. // 插入到目标元素之前(父容器)
  557. if (container.parentElement !== parentElement || container.nextSibling !== targetElement) {
  558. parentElement.insertBefore(container, targetElement);
  559. // console.log("Container inserted before the target element.");
  560. }
  561. } else { // 如果insertBefore为false
  562. // 插入到目标元素里
  563. if (container.parentElement !== targetElement) {
  564. targetElement.appendChild(container);
  565. // console.log("Container appended to the target element.");
  566. }
  567. }
  568. }
  569. // 立即执行一次插入操作
  570. insertContainer();
  571. const timer = setInterval(insertContainer, intervalTime);
  572. // 根据参数决定是否销毁定时器
  573. if (destroyAfterSeconds !== null) {
  574. setTimeout(() => {
  575. clearInterval(timer);
  576. // console.log(`Timer destroyed after ${destroyAfterSeconds} seconds.`);
  577. }, destroyAfterSeconds * 1000);
  578. }
  579. }
  580. function fixTopOffset(top) {
  581. let timer, interval;
  582. let scrollYPosition = window.scrollY;
  583. document.addEventListener('touchstart', function() {
  584. clearTimeout(timer);
  585. clearInterval(interval);
  586. let allElements = document.querySelectorAll(".searchboxtop, .fix-wrap, .sbox");
  587. let searchengineTopContainer = document.getElementById("searchengine_top_container");
  588. let searchengineContainer = document.getElementById("searchengine_container");
  589. function fixElements() {
  590. if (!searchengineTopContainer) return;
  591. // 获取所有需要处理的元素,包括子元素
  592. let elementsToProcess = [];
  593. allElements.forEach(element => {
  594. elementsToProcess.push(element);
  595. element.querySelectorAll("*").forEach(child => elementsToProcess.push(child));
  596. });
  597. // 处理所有元素
  598. elementsToProcess.forEach(element => {
  599. if (element.id !== "searchengine_container") {
  600. let style = window.getComputedStyle(element);
  601. let isPositionFixed = style.position === "fixed";
  602. let isTopZeroOrAuto = style.top === "0px" || style.top === "auto";
  603. let isTopSet = style.top === `${top}px`;
  604. if (isPositionFixed && isTopZeroOrAuto) {
  605. element.style.top = `${top}px`;
  606. if (searchengineContainer) {
  607. setTimeout(() => {
  608. searchengineContainer.style.opacity = '1';
  609. searchengineContainer.style.transform = 'unset';
  610. }, 100);
  611. return true
  612. }
  613. } else if (!isPositionFixed && isTopSet) {
  614. element.style.top = "0px";
  615. window.scrollTo(0, window.scrollY - top);
  616. return false
  617. }
  618. }
  619. });
  620. }
  621. scrollYPosition = window.scrollY;
  622. fixElements();
  623. interval = setInterval(fixElements, 100);
  624. timer = setTimeout(() => clearInterval(interval), 1000);
  625. });
  626. }
  627. function initialContainer() {
  628. let fixStatus = false
  629. let hideOnScroll = GM_getValue("hideOnScrollCheckboxed", false);
  630. const engineOrder = GM_getValue("engineOrder", []);
  631. const hiddenStates = GM_getValue("hiddenStates", {});
  632. for (const key in searchEngines) {
  633. // 检测是否新增引擎
  634. if (!engineOrder.includes(key)) {
  635. // 将新增的引擎添加到 engineOrder 的尾部,默认显示
  636. engineOrder.push(key);
  637. hiddenStates[key] = false;
  638. }
  639. }
  640. GM_setValue("engineOrder", engineOrder);
  641. GM_setValue("hiddenStates", hiddenStates);
  642. const floatChecked = GM_getValue("floatChecked", false);
  643. if (document.getElementById("searchengine_container")) document.getElementById("searchengine_container").remove()
  644. // 获取当前页面的查询参数和主机名
  645. var currentParameter = "",
  646. currentHost = location.hostname,
  647. currentEngine = null;
  648. // 通过正则匹配确定当前搜索引擎,并获取其查询参数
  649. for (let engine in searchEngines) {
  650. if (searchEngines[engine].hostnameRegex.test(currentHost)) {
  651. currentParameter = searchEngines[engine].parameter;
  652. currentEngine = engine
  653. break;
  654. }
  655. }
  656. if (!getQueryString(currentParameter)) return
  657. if (currentParameter !== "" && !searchEngines[currentEngine].hide) {
  658. // 创建搜索引擎容器
  659. var container = createSearchEngineContainer();
  660. // 加载并按顺序添加搜索引擎子元素
  661. const engines = engineOrder.length > 0 ? engineOrder : Object.keys(searchEngines);
  662. // 遍历所有引擎键
  663. engines.forEach(engineKey => {
  664. const engine = searchEngines[engineKey]; // 获取当前引擎对象
  665. // 如果引擎存在且不在隐藏状态且当前主机名不匹配引擎的主机名正则表达式
  666. if (engine && !hiddenStates[engineKey] && !engine.hostnameRegex.test(currentHost)) {
  667. const child = createSearchEngineChild(engine, currentParameter); // 创建引擎子元素
  668. if (child) container.appendChild(child); // 如果子元素创建成功,将其添加到容器中
  669. }
  670. });
  671. container.appendChild(createSettingButton(container, searchEngines));
  672. // 将容器插入到当前搜索引擎页面的指定位置
  673. try {
  674. if (!hiddenStates[currentEngine]) {
  675. // 如果开启浮动或滚动隐藏
  676. if (floatChecked || hideOnScroll) {
  677. const topContainer = document.getElementById("searchengine_top_container");
  678. // 为顶部占位容器创建搜索栏并滚动到顶部
  679. topContainer.appendChild(container);
  680. window.scrollTo({
  681. top: 0
  682. });
  683. let searchEngineContainer = document.getElementById("searchengine_container");
  684. // 设定向上滑动并移除的行为
  685. SwipeUpToHide(searchEngineContainer, () => {
  686. setTimeout(() => topContainer.remove(), 300);
  687. }, document.getElementById("settings_dialog"));
  688. // 调根据搜索栏实际高度为占位容器设定高度
  689. topContainer.style.height = searchEngineContainer.offsetHeight + 'px';
  690. // 如果当前引擎是Baidu,修正其顶部偏移
  691. if (currentEngine === "Baidu" || currentEngine === "Google") {
  692. fixStatus = fixTopOffset(searchEngineContainer.offsetHeight);
  693. }
  694. // 优化哔哩哔哩搜索框位置
  695. const intervalId = setInterval(() => {
  696. const tabs = document.getElementsByClassName("tabs")[0];
  697. if (tabs) {
  698. const tabs = document.getElementsByClassName("tabs")[0];
  699. const search_bar = document.getElementsByClassName("m-search-search-bar")[0]
  700. if (searchEngineContainer && tabs) {
  701. if (searchEngineContainer.style.transform === 'unset') {
  702. tabs.style.transition = "margin-top 0.3s";
  703. search_bar.style.transition = "margin-top 0.3s";
  704. tabs.style.marginTop = searchEngineContainer.offsetHeight + "px";
  705. search_bar.style.marginTop = searchEngineContainer.offsetHeight + "px"
  706. } else {
  707. tabs.style.marginTop = 'unset';
  708. search_bar.style.marginTop = "unset"
  709. }
  710. }
  711. }
  712. }, 100);
  713. } else {
  714. //非浮动模式,插入到指定点
  715. searchEngines[currentEngine].insertPoint(container);
  716. }
  717. }
  718. } catch (error) {
  719. console.error("Failed to insert search engine container:", error);
  720. }
  721. }
  722. // 下拉显示搜索栏或在滚动页面时隐藏
  723. const settingsDialog = document.getElementById('settings_dialog');
  724. let touchTimeout;
  725. let startY = 0;
  726. // 更新容器样式
  727. function updateContainer() {
  728. let searchEngineContainer = document.getElementById("searchengine_container");
  729. if (!searchEngineContainer) return
  730. if (settingsDialog.style.display === 'block' && !fixStatus) {
  731. container.style.opacity = '1';
  732. container.style.transform = 'unset';
  733. return;
  734. }
  735. // 滚动隐藏模式
  736. if (hideOnScroll) {
  737. const currentY = window.scrollY;
  738. let containerHeight = searchEngineContainer.offsetHeight;
  739. if (currentY > startY && currentY > 15) { // 向下滚动并且滚动距离大于15
  740. const fixWrapElement = document.querySelector(".fix-wrap-p.fix-wrap");
  741. if (currentEngine !== "Baidu" || !fixWrapElement || parseFloat(fixWrapElement.style.top) === 0) {
  742. container.style.opacity = '0.3';
  743. searchEngineContainer.style.transform = `translateY(-${containerHeight}px)`;
  744. }
  745. } else {
  746. container.style.opacity = '1';
  747. container.style.transform = 'unset';
  748. }
  749. startY = currentY; // 更新 startY 为当前滚动位置
  750. } else {
  751. // 半悬浮隐藏模式
  752. if (window.scrollY > 25 && floatChecked) {
  753. container.style.opacity = '0.3';
  754. let containerHeight = searchEngineContainer.offsetHeight;
  755. searchEngineContainer.style.transform = `translateY(-${containerHeight - 30}px)`;
  756. } else {
  757. container.style.opacity = '1';
  758. container.style.transform = 'unset';
  759. }
  760. }
  761. }
  762. function restoreContainer() {
  763. if (settingsDialog.style.display !== 'block') {
  764. container.style.opacity = '1';
  765. container.style.transform = 'unset';
  766. clearTimeout(touchTimeout);
  767. touchTimeout = setTimeout(updateContainer, 3000);
  768. }
  769. }
  770. // 监听触摸和页面滚动
  771. container.addEventListener('touchstart', (e) => {
  772. startY = e.touches[0].clientY;
  773. restoreContainer();
  774. });
  775. window.addEventListener('scroll', updateContainer);
  776. // 初始调用以设置正确的状态
  777. updateContainer();
  778. }
  779. initialContainer()
  780. })();