selection-search

划词搜索

  1. // ==UserScript==
  2. // @name selection-search
  3. // @version 10000
  4. // @author logan
  5. // @description 划词搜索
  6. // @homepage https://github.com/loganoxo/selection-search
  7. // @homepageURL https://github.com/loganoxo/selection-search
  8. // @supportURL https://github.com/loganoxo/selection-search/issues
  9. // @icon data:image/png;base64,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
  10. // @match *://*/*
  11. // @exclude *://192.168.*.*
  12. // @exclude *://10.*.*.*
  13. // @exclude *://172.16.*.*
  14. // @exclude *://127.0.0.*
  15. // @exclude *://localhost
  16. // @exclude *://*.local
  17. // @grant GM.openInTab
  18. // @grant GM.setClipboard
  19. // @grant GM.getValue
  20. // @grant GM.setValue
  21. // @grant GM.xmlHttpRequest
  22. // @run-at document-end
  23. // @license MIT
  24. // @namespace https://gf.qytechs.cn/users/1317201
  25. // ==/UserScript==
  26.  
  27. (async function () {
  28. "use strict";
  29.  
  30. ///////////////////////////////////////////////////////////////////
  31. // 配置
  32. ///////////////////////////////////////////////////////////////////
  33.  
  34. //=========================定义网站数据=======================================
  35. function SiteInfo(_name, _url, _homepage, _icon) {
  36. this.name = _name;
  37. this.url = _url;
  38. this.home = _homepage;
  39. this.icon = _icon;
  40.  
  41. this.callSiteInformation = function (_enable = true) {
  42. return {
  43. name: _name,
  44. url: _url,
  45. home: _homepage,
  46. icon: _icon,
  47. enable: _enable,
  48. };
  49. };
  50. // this.callSiteInformationNoHomepage = function (_enable = true) {
  51. // return {
  52. // name: _name,
  53. // url: _url,
  54. // icon: _icon,
  55. // enable: _enable,
  56. // };
  57. // };
  58. }
  59.  
  60. // 百度
  61. const Baidu_ICO = "data:image/png;base64,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";
  62. const Baidu = new SiteInfo(
  63. "百度",
  64. "https://www.baidu.com/s?wd=%s&ie=utf-8",
  65. "https://www.baidu.com/",
  66. Baidu_ICO,
  67. );
  68.  
  69. // 谷歌
  70. const Google_ICO = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACDVBMVEUAAAD+/v7+/v79/f39/f39/f39/f39/f3+/v7+/v79/f39/f39/f39/f3+/v7////9/f39/f39/f39/f3+/v7+/v79/f39/f3+/v7+/v79/f39/f3////+/v79/f3////9/f3+/v7+/v79/f39/f39/f3+/v7////9/f3+/v79/f39/f39/f3////9/f3////+/v7////85uT1pZ7wdGrsVUjqRjjqRTfsU0bvcmj1oZr85OL85+XxgXjqRDbqQzXxf3b3urXrSz7rTD/4v7r1p6DyioHuZVn0m5P3tK73ta/0m5TuZlryjob//v7rSj3tXFD5zMj5y8fsWEzzlIz0kG3vbGH+8vL+9fT+9t37uQfxdyD98O7934b7vAX1kxXrSTT3uLP8zUb5riH/+/v7whz801lChfS/1fv7vQf93H2lxfqfwfn80liqyPr8zkfkwi76/fve6v3B1/v934iztSE8qFCw3byox/rn8P7+9t/2vAmGsDM0qFNGsGLs9+/z9/5UkPVgmfaPx4JcuXXw+fL6/P93p/epyPrm9Oo+rFtMsmfC5cza7+BjsahChfH2+f634MJUtm6Nzp+q2rer27iV0qVkvHs1qFQ3oHdBiePD2Pyj2LE1pWA+jsq54cQ+rFw3qVab0rHn9et7xo82qVRnvn7X7t2h169swIJJsWU4qlZGsGNlvX3Y7t5rzgcKAAAAMXRSTlMADlqcy+367Fknn/f2nSUKjfz7iwkm1dIkMuvqMAuKD/UNV5nI+VYMmiOH09AI6CIvZ7+SkQAAAAFiS0dEDxi6ANkAAAAHdElNRQfmCBALMiy/XZkSAAAB7klEQVQ4y2NggANGJmYWVjY2dhZmDkYGTMDJxW0IBzy8fGjS/AKChihASFgEWV5UzBADiEsg5CWlwEJGxiamZuYWllbWYK60DFw/WN7G1s4eCuwcbMAqoGbIgs13dLJHAs4uYFsg7hAAsV3tUYEb2BY5sP9A7neECLt7eHp5+wAZvn4Qv4As4QI5zx8kHRAIcX9QcAjMK8wMDPKg8AkFyYeFw4Qj4H5VUGRgAlKRUdH29qYxhliAEgMzkIyNi4tPSMQmb6jMwAIkk+Li4pJTsCpQYWAFkqlABWlQkXQEyAAFFgMbkMwEKsjCVJAN5KriU5ADVsAOtSIXU0Ee2AqQI/OBCgoKkd1WBFJQDHYkyJslcXGlZeXICipACirB3uQAklXVNbW1dfUI+YZGoHwTiKXGwMgDpJprgaClFSbf1g4yoAMU1OoMDLxAurMLpKK7ByLf29cPlG+cAGRqAGOTTwjImFgLBpMmT5k6bfqM2pmz0tNnA4XZNEEJQhika04tCpg7DxQIhlqQJK8NYs9fgKxg4SKQmI4uJFFKSIN4i5cshcsvWw4S0dOHJWsZsArDzhUrV61euGbttHVgrp4BImNIiGNGtI4+ctYSkRNClWbT0kXLnRLMCghpBQ1NLPlbUUlZRVpVVVpFWU0dIQoAIFvbhdFCbusAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjItMDgtMTZUMTE6NTA6NDQrMDA6MDC+ka4IAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIyLTA4LTE2VDExOjUwOjQ0KzAwOjAwz8wWtAAAAABJRU5ErkJggg==";
  71. const Google = new SiteInfo(
  72. "谷歌",
  73. "https://www.google.com/search?q=%s&ie=utf-8&oe=utf-8",
  74. "https://www.google.com/",
  75. Google_ICO,
  76. );
  77.  
  78. // 必应
  79. const Bing_ICO = "data:image/png;base64,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";
  80. const Bing = new SiteInfo(
  81. "必应",
  82. "https://cn.bing.com/search?q=%s",
  83. "https://cn.bing.com/",
  84. Bing_ICO,
  85. );
  86.  
  87. // github
  88. const GitHub_ICO = "data:image/png;base64,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";
  89. const GitHub = new SiteInfo(
  90. "GitHub",
  91. "https://github.com/search?q=%s",
  92. "https://github.com/",
  93. GitHub_ICO,
  94. );
  95.  
  96. // 哔哩哔哩
  97. const Bilibili_ICO = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAADmhJREFUeF7tnV+IXkcVwOdmd8vms2mT9ttKRDYiVdPWB6U++BKaFIwIghSJCNvEim++iL6Z0HZDTXz2RXw1aUAUiYI+xAezJQULpi/SkigizSKI2S1pTN3ddpPccma/czPf7Pw58+/euV/mQptNvvvdOX9+c86Zc+ferVjAsfL8Kwfh61U19fL4ZWr+7+WIbYFqCa9YV/Vr8PPcmROLIaNUrl8Gp285vDjZ1XYpz68rdtIHCDIAxfEp3Rf32gADNTJYAVg5dmqxqpkU4uMKXK6WxgIUEIwAFOencUybV7VBoAVg9ejpiyXPt+mqlGNVS8Ozxw+pRlACUJyf0hldXVsNwTYAStjvykHpx1WlgzEAivPTO6HrEWQIxgBYPXqq7lrAMn56CwzPnmj83vxQZn96w+cyQl3fPTT36ou8q9gAUGZ/Lu5pQ457BSEHoMz+Noye1xgYBQoAefmlRWm2ogAHoIT/Fu2e0VBQDPYCgGqwk1XD3Qz+hKNevcHurt7IyJSskY3Lt7aelWw6YSANVLnn/x3DPawa7lHqcHf5P50bW4YTAahX3+tcNhuF2QNgcj4qd+fqv2x6JvvcJB9EAQA076NaqnLu+1MA6MrQFNlyiFBmAHMHYH7vWG7VKdO2oSnOz7VWGbfhhADQdhSY2v9pUmTPsVhVAJBv/x8KrB3ze7MyNnX29yMCMFbl3gOgzjYweOpU4OL8NuQhzQzLSdkD4GL01KnABcbUssRwPlwjewBASEgD2ASyKZ4qCriA2Jfw3xsAnGqBBOvvSXV+bwDgUcDQEZSjQuzq2yX0gyxdNqdsEVL+vBcpAIXuIhW4gNen0I827RUAbaeCSXd+r1JAEwUcUkFoQTjJoT/LCCBX+tVgdntKG8ySVwQ8JAfcmqWuPJpx1ja0KbgWPguRyTXH285vPQWgUeH+fkPh6D6/TdhJ/JzDMIIDIGkbjuQAiA53mVGT6GyqTghFG0AkA0C1UYJqgHLeuAViL2vFq0cHoDg+Hb6hRa1KsqgAuCzT0plpsq8cOxpEA8B1zTzZbkqrXUwIogBQZn5ah6uuHguCKAC4NkzaN9dkjhjjnkMwACX0dwdXjCgQDECZ/d0BACOHRoEgAMrs79b5MHro0jAYgJ3PHWAbl95KYgm5LSr205UDGnrxvgLOfPaTbPMf/773ddX9Ceni8j2MlB3Q0K1n3gAMnjvAwPlwvHf6V7725d8DJbhzm55498/Wifq9e+x0kH74ZQ7CCCCAJBYYIWnACQAwChzoeFTMBwDu9Myen9PpFwsAZSdu9NwjpFPfIyQNkAAAw0zvn2czT+xTyugCADzVC9VrToc421VypQRAHA8egvUBISkAD/14Qet41wgQImgqYCj6tQUA6OjTVAupA6wRwDY7qDVATOfrItHmlWvOnFD0axMAUOCBL3yGVR9/dJsut69dV+qXPQCxw77KaeD8//303EQAoIpK4Pz3z/25fQBgtoFApsNUA8R2PsgREwCKfm1HAJV+JgDAJr4rAWsKgIs/euZ49gCAgD6O6gsAtlTbKQAQmnT5yVcwE3E6p/kAQAHc97rO+Wj0BV1dYoy0nq/LIUUAW6WsAyBF+AcbxQbAph/UFj4Fpi8AOv06A8BWKbcNgG7W+jrKpp/vdX0B0OnXPwA8wxLFcKq65NbPf88+fONtytfHznEBgO95HLVzU76qTqWfKdX6LrNJKcBWKOkES5H/0XOqsI1yuBrDph9EAKhxVG8riXFPXkWsKwC+cpAAsBVKcDdQdUcwFQDQLt31g2+y6X2PjdlOlMN1bNNKBwC4W08ZIws4IOY+fhXgOjuDYNkBENKdwr7D7avLbO38paYPcWd5hW28+U/uiNkDn+f/iYdoIIgCO7/6Jf7x5tVl/ufM/nn+J1xTPkwArP/hDfbB394hpRa8z2FKDzr9UF8YSJWWZABQ/9vL11l98xab3vuIVj+d8OQIYMqTKjJDAYCwjN09dI44DgWAR37xwy0Arlxj6797vQFJVdSZVgIuAKCh8ekeFQg4lqzf+vlLDZwUAHYf/zYfDtLT+h//wnZ9/xv87y5FazIAQpaA8l4DUVFsh6oAELtlkAJEQ9sAMAHuA4A44+TwLO81QMBdAXhw4VmeBicOgI8tHGazo/ANSx9RUQQAFId/Fw8EAA0eDYDzl3iNo3tnMSk3CHlaBkCOCDxdKVrwcju4VQBMlbIqBfhEANxjKM5uAAD/LhpAB8Ctn/22eZM4GpqSAkz64cyMtQdy9unHG8Chy+gLgGiX5CnAtBJQ3ahwAUA2rOhcmPHT849xCORxMDWIM1Bs27oAYNJPvtMYCoKoH+RrKE5hl5U8jqowFZtBrQOgK5RCANAZE52bIwAInC8IMuBTg5n7EwCTATG/b7z+Fp/5PAIsX29uOkGV/eCxrzDYtRsrAugAt+014Nu4HDd5ivrB9SEtwHJVvOegkqfTCGCqlOU+NSUF+MwgcTOpykDyEgh3D4FhxZ9VhZtOPxsAYkSAn12LRd2S2dTtxDGxGbb55t/Z1NxDzbKXWpiSl4G65gQOlBoA1S5ilcNc1sCykUyAu9wSxvsFVBB0AKjk0bXdk3cCdUuTEABMGyBVVT6MZVsri5+jzKrZoLq9a1oJuAAgjqeLcr76ySsujADQCaxvvt8MTb197RQBTAbyiQAgrc5AMCv2/OS723znCoCqkpYhwUFSAGAqGFWrGJt+MgC2a9hSgRMApqWSLwAIARd0MMsfFoEDAFDlQNFAKofJznUBwKSfbwSQHdDs+x/MWgFX6ZctAHJuohSBNjopmz9lB6cCIKS20OmpAlwsOLMEQLdUygUASjNFlwLAUTr9UgDgAzilGWbST4bROQWYmkHy0gT+LhcjcFNG9e+qWULZ+ydHABkAWxqRxzX1AsRaAX8O0U+36hDTjayf7n6AqEdSAGzbp2xhXfwce/SmilWVw0UDqRxm+1w0EKxExMfQ+6CfWG/hDaFeAkAR2gaAymEUANYvXG5+Ha24hSwmADH0s3UDJwYATAuQImztUDEf2wBQbqy4cLnZWYROQghSAYD6yY+v2bqZKnlU7WAKbKro7FwD2DZQuqQA3bk2B4d+rttbBxBAY8X2KFyojqHyZw/A5tvvsLXfvMZmntzHZp76FP/P9cAwrpoBtl6AzcCmzZVTs1Ns14+OGMVF/QZHnuHnpdTP1g5W7YxKWgSCwrZnBcFANxd/OWZEMBIYjGosVMLW7FF9TgUAij/5NS26DuRY8dqxfuKSuzcANEsoBxAQAtdmjzgDHnjmi2zX9742BiNEADgHmlWqVrSqvWoDwEc/BNVVPzGCqe4pdB4BwBirR04aw+jDi9+xRgM0kFwo2Zo94haumac/t23v4MaFy+z/5/7UyCdDEAIAXjSlfp0D8PBLL7Dpxz9hdLAJAEgFg28dtJYFCICcB23NHgQAXmJJnSEiBDYAbIDH1k+OEL0GgGoc210x01ofAUGnyg7VhUg8X7W2lmnVAZ5Ev5deYDPChLPdEEqeAigRAIpAKAbFgxIW8XzRwapCT7X5E78rRggo8vABEfzcZCA4H1YB8lYzGYBW9Vs43DzlBHLY7gckB0Dct6+L42u/XuJLQTios8LkIDkMmip9ao2gk932vgD4Xoh+qhtLsn5jgPcVAO58Qq4XHaGj1wYAvMdQPMSOm+xQ2wyhdAMBgNb0WzjcPNeIOoovjKKmOBXwzp3ALaWfZTu//mVrEed6gumWq+xEl9uzKQBw1c1248ukn+1X5so1iw1wUfYsAHAR2NXwcH7XAITqN5EAwIwQH4f2cSz1O/KLJW0bJikpwDZ2TP1sv5MBlrr1f99l9QcfcrFs+gVHAHiTpa1frjIQzAReQCmez7cZtM3PfW94pdLPBgDYxvWtKGhPrxQASyXdHTN4egePzb9e4VS6ENmmo01jafUbvWyCz7TRzyn1o747uFUAQPmUVOYCQQ5yUN8g7vpKnKAIQAUg5C0hORg/BxkKADl4oUMZKJEWxGs9AtiWJmgz39zUoc2zGZo6+0MirVcRCBaiAhAiXDae6EgQMgCrN5q3oriK6g0AtToNWaK4KjNJ51OdDzr7PhkM320FgBIF3NGk5v7QCeYNAHUlgKoXCOgQUNMrXtG3AAyKAC51gKh6jIdG6abs15n8xRLD3U6/TzB0YgVFAJc6QIYAfkmk/JtB++WueNL6OL6JrAEFYHAE8AWgwLD16+G4AxxnvIxdSPgPBsA3DejmTvMrZPGEnkeJsWcO+FvEZrecPnJ+aAwJqf5x7KAUgMqo3qMfqpwJEtO1rb9gOlAw+RdDy5eL5VyKmDGabMEAxI4CFMXLOWFrf9F+UQAoELSLZGjlnwSAAkE7EMR0/qgIPH2Rsdr+mA5RP9cmBvGy5bTRm9PgLWrxls/VUrV6NC4APBIM9zi/LrV42GyBGBX/9hESAYADFRDCsVa9Ijf8qs0iME0EkAXElyNS350bT8F+Ximt0+/ZpK7YyWrl+VcOVtWOi22aSnxbZpvr5jZ1pIwl5nLxDamU78Y4pzMAVMKLIGxrtow6aGPLl0jdtCiGXFvXX2Zto/lMbFLFK+T8NRiePVFV8PXVo6dq/8uUb/bVAgIA8VcCfTXK/SI3hP+5MycWeQToog64Xwydq55jAGylgRIFcnVWCrkg/MN1+f9KFEhh4nyvibN/DIBSDObrsNiS4ezfBsDKsVOLVc1ejj1guV4+FhBn/zYAeCooEOTjrciSyM5XAlAKwshWz+Zy1dLw7PFDsjhNESh/UFYF2XgugiBq52sjQLMyKOkggvG7vYQq7IsSaSNAgaBbx8UY3eZ8awQQhSjFYQyXtHGNaqmu75yce/XFrRcZWg5rBJC/DyBwcspy0Wbblj93czwK5wyAHohq69dn8CPeHsOWrZj5cNXYrIaZDgJTZ7tKuY8A/N6opYsocZcAAAAASUVORK5CYII=";
  98. const Bilibili = new SiteInfo(
  99. "哔哩哔哩",
  100. "https://search.bilibili.com/all?keyword=%s",
  101. "https://www.bilibili.com/",
  102. Bilibili_ICO,
  103. );
  104.  
  105. //youtube
  106. const YOUTUBE_ICO =
  107. "data:image/png;base64,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";
  108. const YOUTUBE = new SiteInfo(
  109. "YOUTUBE",
  110. "https://www.youtube.com/results?search_query=%s",
  111. "https://www.youtube.com/",
  112. YOUTUBE_ICO);
  113.  
  114. //V2EX
  115. const V2EX_ICO =
  116. "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAABb9JREFUeF7tnVFy2zAMRKmepukFkr86N/CNmtzIN6g/kws0PU3VYSfqcDy2ZJFYcAEiv7EkEly8BUh5PKX4GzoC09Czj8mnEMDgIggBhAAGj8Dg0w8ChAAGj8Dg0w8ChAAGj8Dg0w8ChAAGj8Dg0w8ChADWI/DweJytxmie0vPvt9O5dfxfn46HaU4/W+/T4/qP99Nqkm8SIASQUgigh3QFnhkESCkIEBYQFtAKk7CA1gh2uj4sICwgugCBLqBsfw6dkrnmsed5Sq+DtoH/W9+P99PzWvA228BrF2dP/JLSYZ7T95QShSimKb3msf56O73UqOWeaxjnnced5/4npXON2KsEUAbrs0D60UsIefLIRb8lDIZ51y56OadmASw3+/Z0fJnnlIWg9tdr8csJWp+3mAByUJSDcd7yNy0las5bqrNZYiMqAE0RSAeiVSwaW+YI4okLQEkENNm/COfh8Zi7JVhBjFj8fwVkq/JvXQ8OyGgCgM0XJgCwL8ICUpsQSMEj7Q4mgBxIoC+OJADoXKECQFJg65izNpNrr0OJHZn90BqgKI4gbxShiqIaASBPC9FChxIA2REwCQDo/1D8qxBgBBuwin8VASCLQQYKAPEPz341AQApoBKktbrAMv7VBICkALpIWlt8YPYndPUPOwu4FTAUBXraAFAAamSDdwGLIFACyPfvRQEU/rWyX9UCkDagGbBF0MDsVxW0GgG87Qmgsj+lpIZ/dQJ4yZpPmkGOf7VppkoApA1oFoNAIatmvzoBvNgACv/a2d9FAEgKaHUDlrd+L9t0dQuwTgFP+O9GANSegEYd4An/3QRg2QZQ+NeyLwoLsGoD3vDflQAWg+kN/10FgNxMQeDUomDXTjLVTwOvDcZSMYgSQI/ev1yLLm1gOQArRRUK/wha3ZP5FARAFoOSmYXKfu2Dn2vC6E4ACzaAyn5Jke7JeioLsLAnABKA+sEPJQGQNiCxM+gZ/93bQHQxKCEAUParvfS5ZQ3da4BlgKhaoLXKBnUpFPinIgBKAC0UQOGfofijaQOZbQCF/1YqbWF9z/9pLABZDNYG3Dv+qSwAKYAaGxgB/3QCQO0J1AgAhH+a4o+yBkBSYI8NoLK/Roh7/Lzms1Q1wDIBhPfuCT5KAEzVPy0BgBS4G7+j4J+yBgAK4K7dt5Gyn1YAPYtBUParfuFzTy1AWQMgKbBVDIIEcLf97Fk8ic/SCgCF4rViEPVMxuKPuggsugHxb+CuCWC07KeuAXrYAKL9ZM5+egFoFoMo/G/VHBI+3nIP2hpgmRTimPiaDYyIfxMEQAggT/wyM0fEvwkBaNjAqPg3IwAEBUobGBX/ZgSAokC2AVT2s1f/JvYByuoWkaXLL25Ocyp/HrelqF6upd35u5wcfReA7AbyV7M+7y/6a19Wst+UBaBsQCLdL+/B3vuX4zVDAOTOoLAIzODfHAEQ3YDw4t/1zoH0M1vuZ4oABmzAVPabIwC7Dex577AlayWvNUcAZgpYqv7N7QOUqietBczh36QFsNqAxew3KwBGG7DU+5vdByC2AZP4N00A1CFOTYVtFf+mBUBkA2az37wAGLoBy9lvXgAMFLBa/JneByAqBk3j3wUBetqAdfy7EEBPG7COfzcC6EQB8/h3I4AeFPCAf28CEP8i6cqmkIvsdyUATRvwkv2uBKBpAx6KPzf7AB32BNzg3x0BNGzAE/7dCUDBBlxlv0sBIClg8aXPreNtky+Fbk0K8V3//Exv+HdJgDwpEAXc4T8EsIWS4v8es9+tABDFoKfev9S9yxoAYAMu8e+aAJIvjXrFv2sBCNqA2+x3LwCJbsBz9rsXgAQFQgA7WiXGjzZSwDX+hyAAoyiZxuS2DWQKMvNYQgDMq6MwthCAQpCZHxECYF4dhbGFABSCzPyIEADz6iiMLQSgEGTmR4QAmFdHYWwhAIUgMz8iBMC8OgpjCwEoBJn5EX8BIef7rrx529QAAAAASUVORK5CYII=";
  117. const V2EX = new SiteInfo(
  118. "V2EX",
  119. "https://www.google.com/search?q=site:v2ex.com/t%20%s",
  120. "https://www.v2ex.com/",
  121. V2EX_ICO);
  122.  
  123. // 直达
  124. const ZHIDA_ICO =
  125. "data:image/png;base64,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";
  126. const Zhida = new SiteInfo("直达", "%s", "https://www.baidu.com/", ZHIDA_ICO);
  127.  
  128. //复制
  129. const FUZHI_ICO =
  130. "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAABXNJREFUeF7tnQGSFCEMRdmTqSdbPZl6Mi2s6dqdcXdC8tPkQ/+ustxyCZD8R6CBGV+anktH4OXS3sv5JgAuDoEAEAAXj8DF3VcGEAAXj8DF3VcGEABUEfjaWnttrfW/9fwfgR+3f/rVWut/4IctA/yBPbpOBR2ADgQEAhMA32+j/zoS5njaIeixCz1MAGj0hyT8ZxSGQADEg85m+S0yHTAB8FOLP4ipvhboELgeJgD6yr9DoCceAXcWYALgcFuLwTgA7rUAIwBx9/e2HNkjcU8DAmAtaKxpUgCspWeot9brsmtQuwqHuiuj7AgIgOyILlafAFhMsOzuCoDsiC5WnwBYTLDs7tICcLyndod1nv+x7Bnn+XQAjGxQZI+CHeqLnudTAaBtWxxF7/YtDQASHxf/qMEDAQUAEj9P/KOm0ZM8CgCsTuSHZ/8aR/fxrdi7dnddhW8aaPSfB+NIFhAA58W/vOaRtUA5ANbVrejrTXn0T+7AyOvyyDRQDoDVgZE0dnKsaavPOM+34u+a1l2Fb2FN7QCtVOd1DI0fan/nmQA4T+jPakYFRO0FwHzN71pEBUTtBYAAeIuApoD5NKAjGLVXBpivuaaA4phTNY+OYNReGaAYB1RA1F4ACAAtAisZQEcwaq8MUKl+aw0VELWnBGDkoKRYt7vmR07ttBPoUMyi2lHV1KKRgy/LV2tvBrWnywArXzAZOb59JBIVELWnA8ByaOqQDjRmjVgBYARVANwHyALKipdlT5cBrBtGgUE5zSSyGEQFRO3pALBuyUxTM9CQa7Td6kcFRO3pADg6tNJiELn3iAqI2tMCEBiAS5qgAqL2AqAYG1RA1F4ACIC3CFQsYorjX948OoJRe2WAYgRQAVF7ASAANAVUMoCOYNReGaBSfd0HKI4+QfPoCEbtlQGKIUAFRO0FgADQIrCSAXQEo/aUGUB3AscH5ZYAWE5VjthnbetO4AfR8W4vr3QM/Oiu7gQmALDq6D9c9wJv+WvVh9rTrQEsh1jTvwD4RBmL4Ecz3Qm8j4gVP2vAWPZ0GUB3Ai8OwOH+SotB3Ql8MjG7UhD7BH9C/9AUjtrTTQEnxJi6SlRA1F4AFOOBCojaCwABML7v/FGsUgksFqOieTR+qL0yQIXq79pEBUTtBYAA0BRQyQA6glF7ZYBK9XUptDj6BM2jIxi1VwYohgAVELWnB+Ds/3e47+NXPqiAqD0lALPvBHYIfrfW+gHU7AcVELWnA6DyODhypw8FBhUQtacDoPIYOHKnTwAYEfAeB1tEowG37L39teqzfm/5a/UHtafLANVXwqyAW4J6f48KiNrTAVA5BUS+588r+GN5VEDUng6A3qGKLFAx/3dfUQFRe0oAeqd6JviCDq9B+z7yq/YDUAFRe1oABrVbvhgqIGovAIoRQgVE7QXA4gA8Wy+5F7WRV6BUAovFqGgejd+znVO3nm6DhFVsRdCZ2kQBOHx5//oc/qCKAJiPRhYAKT0XAClhdFUiAFzh2q+wANhPU5dHAsAVrv0KC4D9NHV5JABc4dqvsADYT1OXRwLAFa79CguA/TR1eSQAXOHar7AA2E9Tl0fLA2Bd36q4a+9SoLDwyGcgItvzYZcijVkAhE+mwl6sYTjy6Sf3eT7qegSAylu8qL/s9ksAMJLG2APN2r/p02ckA/TgWdMAa4CZ+1VyTT0KgLJAPkrTR393IQpAt9VaIA+C6XP/0XUEAEGQA0CZ+GgGONwfeb3JCdVetVC8LqMZ4L0kHYTj611e99IqxZvjo2j9m0n6z1UfTbtzJhOAlCipkrkREABz403XmgCgk2RuhwTA3HjTtSYA6CSZ2yEBMDfedK0JADpJ5nZIAMyNN11rfwHN12OQr51tdAAAAABJRU5ErkJggg==";
  131. const Fuzhi = new SiteInfo("复制", "%s", "https://www.baidu.com/", FUZHI_ICO);
  132.  
  133. // 知乎
  134. const Zhihu = new SiteInfo(
  135. "知乎",
  136. "https://www.zhihu.com/search?q=%s",
  137. "https://www.zhihu.com/",
  138. "https://static.zhihu.com/heifetz/favicon.ico",
  139. );
  140.  
  141. //fsou
  142. const FSOU = new SiteInfo(
  143. "FSOU",
  144. "https://fsoufsou.com/search?q=%s&tbn=all",
  145. "https://fsoufsou.com/",
  146. "https://fsoufsou.com/favicon.ico");
  147.  
  148.  
  149. const Baidufanyi = new SiteInfo(
  150. "百度翻译",
  151. "https://fanyi.baidu.com/#auto/zh/%s",
  152. "https://fanyi.baidu.com/",
  153. "https://fanyi-cdn.cdn.bcebos.com/webStatic/translation/img/favicon/favicon.ico",
  154. );
  155. const Baiduwangpan = new SiteInfo(
  156. "百度网盘",
  157. "https://pan.baidu.com/disk/home?#/search?key=%s",
  158. "https://pan.baidu.com/",
  159. "https://nd-static.bdstatic.com/m-static/v20-main/favicon-main.ico",
  160. );
  161. const Baidubaike = new SiteInfo(
  162. "百度百科",
  163. "https://baike.baidu.com/search/word?pic=1&sug=1&word=%s",
  164. "https://baike.baidu.com/",
  165. "https://baike.baidu.com/favicon.ico",
  166. );
  167. const Baiduzhidao = new SiteInfo(
  168. "百度知道",
  169. "https://zhidao.baidu.com/search?word=%s",
  170. "https://zhidao.baidu.com/",
  171. "https://www.baidu.com/favicon.ico?t=20171027",
  172. );
  173. const Baiduxinwen = new SiteInfo(
  174. "百度新闻",
  175. "https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&rsv_dl=ns_pc&word=%s",
  176. "https://news.baidu.com/",
  177. "https://www.baidu.com/favicon.ico",
  178. );
  179. const Baiduwenku = new SiteInfo(
  180. "百度文库",
  181. "https://wenku.baidu.com/search?word=%s",
  182. "",
  183. "https://www.baidu.com/favicon.ico",
  184. );
  185. const Baidumap = new SiteInfo(
  186. "百度地图",
  187. "https://map.baidu.com/search?querytype=s&wd=%s",
  188. "",
  189. "https://map.baidu.com/favicon.ico",
  190. );
  191. const Baidutupian = new SiteInfo(
  192. "百度图片",
  193. "https://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word=%s",
  194. "",
  195. "https://www.baidu.com/favicon.ico",
  196. );
  197. const Baiduxueshu = new SiteInfo(
  198. "百度学术",
  199. "https://xueshu.baidu.com/s?wd=%s",
  200. "",
  201. "https://www.baidu.com/favicon.ico",
  202. );
  203. const Baidutieba = new SiteInfo(
  204. "贴吧",
  205. "https://tieba.baidu.com/f?kw=%s&ie=utf-8",
  206. "https://tieba.baidu.com/",
  207. "https://www.baidu.com/favicon.ico",
  208. );
  209.  
  210. const Googlefanyi = new SiteInfo(
  211. "谷歌翻译",
  212. "https://translate.google.com/?q=%s",
  213. "",
  214. "https://ssl.gstatic.com/translate/favicon.ico",
  215. );
  216. const Googlemap = new SiteInfo(
  217. "谷歌地图",
  218. "https://www.google.com/maps/search/%s",
  219. "https://www.google.com/maps/",
  220. "https://s2.loli.net/2022/08/17/SloXZzf9nC6LPbq.png",
  221. );
  222. const Googleearth = new SiteInfo(
  223. "谷歌地球",
  224. "https://earth.google.com/web/search/%s",
  225. "https://earth.google.com/web/",
  226. "https://s2.loli.net/2022/08/17/IOiPDl7YX3QnmsC.png",
  227. );
  228. const Googlexueshu = new SiteInfo(
  229. "谷歌学术",
  230. "https://scholar.google.com/scholar?hl=zh-CN&q=%s",
  231. "",
  232. "https://s2.loli.net/2022/08/17/4BaC1Acu2ebXJR9.png",
  233. );
  234. const Googlepic = new SiteInfo(
  235. "谷歌图片",
  236. "https://www.google.com/search?q=%s&tbm=isch",
  237. "https://www.google.com/imghp?hl=zh-CN",
  238. Google.icon,
  239. );
  240. const Googlenews = new SiteInfo(
  241. "谷歌新闻",
  242. "https://news.google.com/search?q=%s&hl=zh-CN&gl=CN&ceid=CN:zh-Hans",
  243. "https://news.google.com/topstories?hl=zh-CN&gl=CN&ceid=CN:zh-Hans",
  244. "https://s2.loli.net/2022/08/17/RTdZQMD2Aw8eobn.png",
  245. );
  246.  
  247. const StackOverflow = new SiteInfo(
  248. "StackOverflow",
  249. "https://stackoverflow.com/search?q=%s",
  250. "",
  251. "https://s2.loli.net/2022/08/16/mgMHa8UTekYIdV4.png",
  252. );
  253.  
  254. const Taobao = new SiteInfo(
  255. "淘宝",
  256. "https://s.taobao.com/search?q=%s",
  257. "https://www.taobao.com/",
  258. "https://www.taobao.com/favicon.ico",
  259. );
  260. const Jingdong = new SiteInfo(
  261. "京东",
  262. "https://search.jd.com/Search?keyword=%s&enc=utf-8",
  263. "https://www.jd.com/",
  264. "https://search.jd.com/favicon.ico",
  265. );
  266. const Tianmao = new SiteInfo(
  267. "天猫",
  268. "https://list.tmall.com/search_product.htm?q=%s",
  269. "https://www.tmall.com/",
  270. "https://www.tmall.com/favicon.ico",
  271. );
  272. const Maimai = new SiteInfo(
  273. "脉脉",
  274. "https://maimai.cn/web/search_center?type=gossip&query=%s&highlight=true",
  275. "https://maimai.cn/feed_list",
  276. "https://maimai.cn/favicon.ico",
  277. );
  278. const Weibo = new SiteInfo(
  279. "微博",
  280. "https://s.weibo.com/weibo/%s",
  281. "https://weibo.com/",
  282. "https://s.weibo.com/favicon.ico",
  283. );
  284.  
  285.  
  286. //=========================定义网站数据=======================================
  287.  
  288. const defaultConf = {
  289. //
  290. // 基本配置
  291. //
  292. showToolbar: true, // 显示划词工具条
  293. showFrequentEngines: true, // 显示常用搜索引擎
  294. showClassifiedEngines: true, // 显示分类搜索引擎
  295. showPlaceholder: false, // 显示使用方式提示信息(如搜索框placeholder)
  296. enableOnInput: true, // 是否在input/textarea上启用划词和快捷键
  297. autoCopyToClipboard: false, // 划词时自动复制到剪贴板(内容为文本格式)
  298. //
  299. // 常用搜索引擎列表
  300. // 属性:
  301. // - name 搜索引擎名称
  302. // - url 搜索引擎搜索url
  303. // - home 搜索引擎主页url
  304. // - icon 搜索引擎图标, base64编码
  305. // - enable 是否启用
  306. //
  307. frequentEngines: [
  308. Baidu.callSiteInformation(),
  309. Google.callSiteInformation(),
  310. FSOU.callSiteInformation(false),
  311. Bing.callSiteInformation(),
  312. Baidufanyi.callSiteInformation(false),
  313.  
  314. GitHub.callSiteInformation(),
  315.  
  316. Zhihu.callSiteInformation(false),
  317. Googlenews.callSiteInformation(false),
  318.  
  319. Bilibili.callSiteInformation(),
  320. Taobao.callSiteInformation(false),
  321. Jingdong.callSiteInformation(false),
  322. Tianmao.callSiteInformation(false),
  323. Baiduwangpan.callSiteInformation(false),
  324. Maimai.callSiteInformation(false),
  325.  
  326. YOUTUBE.callSiteInformation(),
  327. V2EX.callSiteInformation(),
  328.  
  329. Zhida.callSiteInformation(),
  330. Fuzhi.callSiteInformation()
  331. ],
  332. };
  333.  
  334. ///////////////////////////////////////////////////////////////////
  335. // css样式
  336. ///////////////////////////////////////////////////////////////////
  337.  
  338. const sheet = `
  339. /*
  340. 注意: 为了避免网页style对该工具的影响, 所有样式均进行初始化并加入!important,
  341. js中设置style时也要注意将其设置为important, 否则不能生效.
  342. */
  343. /* 划词工具条 */
  344. .qs-toolbar {
  345. /* 初始化所有style, 避免被网页本身的style影响 */
  346. // all: initial !important;
  347. margin: 0;
  348. position: absolute !important;
  349. display: flex !important;
  350. flex-direction: row;
  351. align-items: center;
  352. justify-items: center;
  353. gap: 8px;
  354. height: 50px !important;
  355. padding: 5px 4px !important;
  356. white-space: nowrap !important;
  357. border: 2px solid rgba(0, 196, 182, 0.9) !important;
  358. background-color: white !important;
  359. z-index: 10000 !important;
  360. border-radius: 15px;
  361. }
  362. .qs-toolbar-icon {
  363. // all: initial !important;
  364. display: block !important;
  365. margin: 0px !important;
  366. padding: 2px !important;
  367. width: 35px !important;
  368. height: 35px !important;
  369. // border: 1px solid #FFF !important;
  370. transition: all 0.3s ease;
  371. cursor: pointer !important;
  372. border-radius: 15px;
  373. }
  374. .qs-toolbar-icon:hover {
  375. // border: 1px solid #CCC !important;
  376. transform: scale(1.1, 1.1);
  377. }
  378. .engine-name {
  379. vertical-align: middle !important;
  380. // margin-left: 2px !important;
  381. font-size: 20px !important;
  382. font-family: arial,sans-serif !important;
  383. font-weight: 400 !important;
  384. color: #5F5F5F !important;
  385. height: 45px !important;
  386. width: 45px !important;
  387. border: 1px solid #262626 !important;
  388. cursor: pointer !important;
  389. display: flex;
  390. justify-content: center;
  391. align-items: center;
  392. background-color: white !important;
  393. transition: all 0.3s ease;
  394. padding: 2px !important;
  395. box-sizing: border-box;
  396. border-radius: 15px;
  397. outline: 1px solid rgba(0, 196, 182, 0.8) !important;
  398. }
  399. .engine-name:hover {
  400. outline: 3px solid #6DC5D1 !important;
  401. }
  402. `;
  403.  
  404. ///////////////////////////////////////////////////////////////////
  405. // 全局变量
  406. ///////////////////////////////////////////////////////////////////
  407. var shadowHost = null;
  408. var shadowRoot = null;
  409. var conf = await GM.getValue("qs-conf", defaultConf);
  410.  
  411. var qsPageLock = false; // 是否在当前页面锁定快搜所有功能, 锁定之后仅响应解锁快捷键
  412.  
  413. var qsToolbar = null; // 快搜划词工具条
  414. var qsMainBox = null; // 快搜主窗口
  415. var qsSettingBox = null; // 快搜设置窗口
  416. var selectionBak_qs = null;
  417. ///////////////////////////////////////////////////////////////////
  418. // 功能函数
  419. ///////////////////////////////////////////////////////////////////
  420.  
  421. // 获取可视窗口在文档(页面)中的绝对位置
  422. function getWindowPosition() {
  423. return {
  424. top: window.scrollY,
  425. bottom: window.scrollY + window.innerHeight,
  426. left: window.scrollX,
  427. right: window.scrollX + window.innerWidth,
  428. };
  429. }
  430.  
  431. // 获取选中文本
  432. function getSelection() {
  433. return window.getSelection().toString().trim();
  434. }
  435.  
  436. // 判断是否允许工具条
  437. function isAllowToolbar(event) {
  438. var target = event.target;
  439. if (!conf.showToolbar || qsPageLock) {
  440. return false;
  441. }
  442. if (
  443. !conf.enableOnInput &&
  444. (target.tagName == "INPUT" || target.tagName == "TEXTAREA")
  445. ) {
  446. return false;
  447. }
  448. if (
  449. (qsMainBox && qsMainBox.contains(target)) ||
  450. (qsSettingBox && qsSettingBox.contains(target))
  451. ) {
  452. return false;
  453. }
  454. return true;
  455. }
  456.  
  457. // 获取搜索引擎主页url
  458. function getEngineHome(engine) {
  459. if (engine.home) {
  460. return engine.home;
  461. } else {
  462. var url = new URL(engine.url);
  463. return `${url.protocol}//${url.hostname}/`;
  464. }
  465. }
  466.  
  467. // 打开url.
  468. // 当按下Cmd(Mac系统)/Ctrl(Windows/Linux系统), 则后台打开url.
  469. async function openUrl(url, event) {
  470. // console.log(`Quick Search: open url, url is ${url}`);
  471. if (!url) return;
  472. if (event.metaKey || event.ctrlKey) {
  473. await GM.openInTab(url, true);
  474. } else {
  475. await GM.openInTab(url, false);
  476. }
  477. }
  478.  
  479. // 打开engine搜索结果或engine主页.
  480. function openEngine(engine, query, event) {
  481. // console.log(`Quick Search: open engine, engine is ${engine.url}, query is ${query}`);
  482. if (!engine) return;
  483. if (engine.name === "直达") {
  484. var Expression =
  485. /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/;
  486. var objExp = new RegExp(Expression);
  487. if (objExp.test(query) == false) {
  488. query = "https://" + query;
  489. }
  490. openUrl(query, event);
  491. return;
  492. }
  493. if (engine.name === "复制") {
  494. copyText(query);
  495. hideToolbar();
  496. return;
  497. }
  498. if (query) {
  499. var url = engine.url.replace("%s", encodeURIComponent(query));
  500. openUrl(url, event);
  501. } else {
  502. openUrl(getEngineHome(engine), event);
  503. }
  504. }
  505.  
  506. // 点击搜索引擎.
  507. // 当按下Alt, 则忽略查询词打开引擎主页, 否则正常搜索.
  508. function openEngineOnClick(engine, query, event) {
  509. if (event.altKey) {
  510. openEngine(engine, null, event);
  511. } else {
  512. openEngine(engine, query, event);
  513. }
  514. }
  515.  
  516. // 点击划词工具条搜索引擎.
  517. function openEngineOnClickToolbar(engine, event) {
  518. var query = getSelection();
  519. if (!query) {
  520. query = selectionBak_qs;
  521. }
  522. openEngineOnClick(engine, query, event);
  523. }
  524.  
  525. ///////////////////////////////////////////////////////////////////
  526. // 元素创建 与 元素事件响应
  527. ///////////////////////////////////////////////////////////////////
  528.  
  529. // 加载css样式
  530. function loadSheet() {
  531. var css = document.createElement("style");
  532. css.type = "text/css";
  533. css.id = "qs-css";
  534. css.textContent = sheet;
  535. shadowRoot.appendChild(css);
  536. }
  537.  
  538. //
  539. // 划词工具条
  540. //
  541.  
  542. // 创建划词工具条
  543. function createToolbar() {
  544. // 工具条container
  545. var toolbar = document.createElement("div");
  546. toolbar.id = "qs-toolbar";
  547. toolbar.className = "qs-toolbar";
  548. toolbar.style.setProperty("display", "none", "important");
  549. shadowRoot.appendChild(toolbar);
  550.  
  551. // 常用搜索引擎按钮
  552. conf.frequentEngines.forEach((engine, index) => {
  553. if (!engine.enable) return; // 此处return搭配forEach, 请勿改为其他形式循环
  554. var ele = document.createElement("div");
  555. ele.className = "engine-name";
  556. var icon = document.createElement("img");
  557. icon.id = "qs-toolbar-icon-" + index;
  558. icon.className = "qs-toolbar-icon";
  559. icon.src = engine.icon;
  560. icon.alt = engine.name;
  561. icon.title = engine.name;
  562. // icon.style.cssText = "display: none !important";
  563. icon.addEventListener(
  564. "click",
  565. function (e) {
  566. openEngineOnClickToolbar(engine, e);
  567. },
  568. true,
  569. );
  570. ele.appendChild(icon);
  571.  
  572. toolbar.appendChild(ele);
  573. });
  574.  
  575. qsToolbar = toolbar;
  576. }
  577.  
  578. // 划词工具条是否处于显示状态
  579. function isToolbarVisual() {
  580. return qsToolbar && qsToolbar.style.display !== "none";
  581. }
  582.  
  583. // 显示划词工具条
  584. function showToolbar(event) {
  585. ensureQuickSearchAlive();
  586. if (!qsToolbar || isToolbarVisual()) {
  587. return;
  588. }
  589.  
  590. var toolbar = qsToolbar;
  591.  
  592. toolbar.style.setProperty("top", "-10000px", "important");
  593. toolbar.style.setProperty("left", "-10000px", "important");
  594. toolbar.style.setProperty("display", "flex", "important");
  595.  
  596. var toolbarClientRect = toolbar.getBoundingClientRect();
  597. var toolbarWidth = toolbarClientRect.right - toolbarClientRect.left;
  598. var toolbarHeight = toolbarClientRect.bottom - toolbarClientRect.top;
  599.  
  600. var toolbarNewTop = event.pageY - 100;
  601. var toolbarNewLeft = event.pageX - toolbarWidth / 2;
  602. var windowPos = getWindowPosition();
  603. if (toolbarNewTop - 10 < windowPos.top) {
  604. toolbarNewTop = event.pageY + toolbarHeight + 15;
  605. }
  606. if (toolbarNewLeft < windowPos.left) {
  607. toolbarNewLeft = windowPos.left;
  608. } else if (toolbarNewLeft + toolbarWidth > windowPos.right) {
  609. toolbarNewLeft = windowPos.right - toolbarWidth;
  610. }
  611.  
  612. toolbar.style.setProperty("top", toolbarNewTop + "px", "important");
  613. toolbar.style.setProperty("left", toolbarNewLeft + "px", "important");
  614. }
  615.  
  616. // 隐藏划词工具条
  617. function hideToolbar() {
  618. if (qsToolbar) {
  619. qsToolbar.style.setProperty("display", "none", "important");
  620. }
  621. }
  622.  
  623. //复制
  624. var copyText = function (button, content, success) {
  625. if (!button) {
  626. return;
  627. }
  628.  
  629. if (typeof content == 'function') {
  630. success = content;
  631. content = null;
  632. }
  633.  
  634. success = success || function () {
  635. };
  636.  
  637. // 是否降级使用
  638. var isFallback = !navigator.clipboard;
  639.  
  640. if (typeof button == 'string' && !content) {
  641. if (content === false) {
  642. isFallback = true;
  643. }
  644. content = button;
  645. button = null;
  646. }
  647.  
  648. var eleTextarea = document.querySelector('#tempTextarea');
  649. if (!eleTextarea && isFallback) {
  650. eleTextarea = document.createElement('textarea');
  651. eleTextarea.style.width = 0;
  652. eleTextarea.style.position = 'fixed';
  653. eleTextarea.style.left = '-999px';
  654. eleTextarea.style.top = '10px';
  655. eleTextarea.setAttribute('readonly', 'readonly');
  656. document.body.appendChild(eleTextarea);
  657. }
  658.  
  659. var funCopy = function (text, callback) {
  660. callback = callback || function () {
  661. };
  662.  
  663. if (!isFallback) {
  664. navigator.clipboard.writeText(text).then(function () {
  665. callback();
  666. // 成功回调
  667. success(text);
  668. }, function () {
  669. // 禁止写入剪切板后使用兜底方法
  670. copyText(text, false);
  671. callback();
  672. // 成功回调
  673. success(text);
  674. });
  675.  
  676. return;
  677. }
  678.  
  679. eleTextarea.value = text;
  680. eleTextarea.select();
  681. document.execCommand('copy', true);
  682.  
  683. callback();
  684. // 成功回调
  685. success(text);
  686. };
  687.  
  688. funCopy(content);
  689. return;
  690. };
  691.  
  692. //
  693. // 创建以上所有东东
  694. //
  695.  
  696. function initQuickSearch() {
  697. selectionBak_qs = null;
  698. shadowHost = document.createElement("div");
  699. document.body.appendChild(shadowHost);
  700. shadowRoot = shadowHost.attachShadow({mode: 'closed'});
  701. loadSheet();
  702. if (conf.showToolbar) {
  703. createToolbar();
  704. }
  705. }
  706.  
  707. // 百度等网页会在不刷新页面的情况下改变网页内容, 导致quick search除了js脚本之外的东东全部没了.
  708. // 此函数用于确保quick search处于可用状态, 需在toolbar或mainbox等窗口每次显示时调用.
  709. function ensureQuickSearchAlive() {
  710. if (!shadowHost || !shadowRoot) {
  711. initQuickSearch();
  712. } else {
  713. var css = shadowRoot.getElementById("qs-css");
  714. if (!css) {
  715. initQuickSearch();
  716. }
  717. }
  718. }
  719.  
  720. initQuickSearch();
  721.  
  722. ///////////////////////////////////////////////////////////////////
  723. // 全局事件响应
  724. //
  725. // 我们将全局事件绑定在捕获阶段执行, 避免事件响应被网页自带的脚本拦截掉.
  726. ///////////////////////////////////////////////////////////////////
  727.  
  728. //
  729. // top window和iframe共用的事件处理逻辑
  730. //
  731.  
  732. document.addEventListener(
  733. "mousedown",
  734. function (e) {
  735. var target = e.target;
  736. // 隐藏工具条
  737. if (isToolbarVisual() && !qsToolbar.contains(target) && !shadowHost.contains(target)) {
  738. selectionBak_qs = null;
  739. hideToolbar();
  740. }
  741. },
  742. true,
  743. );
  744.  
  745. document.addEventListener(
  746. "mouseup",
  747. function (e) {
  748. var target = e.target;
  749. var selection = getSelection();
  750. if (!qsToolbar.contains(target) && !shadowHost.contains(target)) {
  751. selectionBak_qs = selection;
  752. }
  753. // 显示/隐藏工具条
  754. if (isAllowToolbar(e)) {
  755. if (selection && !isToolbarVisual()) {
  756. showToolbar(e);
  757. }
  758. if (!selection && isToolbarVisual() && !qsToolbar.contains(target) && !shadowHost.contains(target)) {
  759. selectionBak_qs = null;
  760. hideToolbar();
  761. }
  762. }
  763.  
  764. // 划词时自动复制文本到剪贴板
  765. if (
  766. conf.autoCopyToClipboard &&
  767. target.tagName !== "INPUT" &&
  768. target.tagName !== "TEXTAREA" &&
  769. !qsMainBox.contains(target) &&
  770. !qsSettingBox.contains(target)
  771. ) {
  772. if (selection) {
  773. GM.setClipboard(selection, "text/plain");
  774. }
  775. }
  776. },
  777. true,
  778. );
  779. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址