GoogleMore

谷歌搜索快速跳转搜索其他网站

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name       GoogleMore
// @namespace  https://greasyfork.org/zh-CN/scripts/469906-googlemore
// @version    1.5.0
// @author     marumaru
// @icon       https://www.google.com/s2/favicons?sz=64&domain=google.com
// @match      https://www.google.com/search?q*
// @match      https://www.google.com.hk/search?q*
// @require    https://cdn.jsdelivr.net/npm/vue@3.4.21/dist/vue.global.prod.js
// @grant      GM_addStyle
// @grant      GM_getValue
// @grant      GM_setValue
// @description 谷歌搜索快速跳转搜索其他网站
// ==/UserScript==

(o=>{if(typeof GM_addStyle=="function"){GM_addStyle(o);return}const t=document.createElement("style");t.textContent=o,document.head.append(t)})(" *[data-v-1d2257bf]{box-sizing:border-box}.configContainer[data-v-1d2257bf]{display:flex;flex-direction:column;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:9999;width:490px;padding:20px;border:1px solid #ccc;background-color:#fff;border-radius:8px}.configContainer .configItemBox[data-v-1d2257bf]{height:300px;overflow:auto}.configItem[data-v-1d2257bf]{width:100%;margin-bottom:10px}.configItem .input[data-v-1d2257bf]{margin-bottom:2px;width:100%;padding:8px;border:1px solid #ccc;border-radius:4px}.configItem button[data-v-1d2257bf]{width:120px;padding:4px;margin-top:10px;background-color:#007bff;color:#fff;border:none;border-radius:4px;cursor:pointer;width:70px;margin-right:10px;margin-top:unset}.configItem button[data-v-1d2257bf]:hover{background-color:#0056b3}.btnBox[data-v-1d2257bf]{display:flex;justify-content:space-around;align-items:center;margin-top:10px}.btnBox button[data-v-1d2257bf]{width:120px;padding:4px;margin-top:10px;background-color:#007bff;color:#fff;border:none;border-radius:4px;cursor:pointer}.btnBox button[data-v-1d2257bf]:hover{background-color:#0056b3} ");

(function (vue) {
  'use strict';

  var _GM_getValue = /* @__PURE__ */ (() => typeof GM_getValue != "undefined" ? GM_getValue : void 0)();
  var _GM_setValue = /* @__PURE__ */ (() => typeof GM_setValue != "undefined" ? GM_setValue : void 0)();
  const _export_sfc = (sfc, props) => {
    const target = sfc.__vccOpts || sfc;
    for (const [key, val] of props) {
      target[key] = val;
    }
    return target;
  };
  const _hoisted_1 = { class: "configContainer" };
  const _hoisted_2 = { class: "configItemBox" };
  const _hoisted_3 = ["onUpdate:modelValue"];
  const _hoisted_4 = ["onUpdate:modelValue"];
  const _hoisted_5 = ["onClick"];
  const _hoisted_6 = ["onClick"];
  const _sfc_main = {
    __name: "App",
    setup(__props) {
      const defaultConfig = [
        { name: "百度", url: "https://www.baidu.com/s?wd=" },
        { name: "豆瓣", url: "https://www.douban.com/search?source=suggest&q=" },
        { name: "知乎", url: "https://www.zhihu.com/search?type=content&q=" },
        { name: "必应", url: "https://www.bing.com/search?cc=sg&q=" },
        { name: "V2EX", url: "https://www.google.com/search?q=site:v2ex.com/t%20" },
        { name: "哔哩哔哩", url: "https://search.bilibili.com/all?keyword=" },
        { name: "YouTube", url: "https://www.youtube.com/results?search_query=" },
        { name: "淘宝", url: "https://s.taobao.com/search?commend=all&ie=utf8&initiative_id=tbindexz_20170306&q=" }
      ];
      const getWebMenuItem = () => {
        const bar = document.querySelector('[data-st-cnt="mode"]');
        let imageElementAll = bar.querySelectorAll("a");
        return imageElementAll;
      };
      const addMenuElementListener = (element) => {
        element.addEventListener("mouseenter", function(event) {
          var inputElement = document.querySelector("#APjFqb");
          var keyword = encodeURIComponent(inputElement.value);
          var url = event.target.href;
          var lastEqualSign = url.lastIndexOf("=");
          var result;
          if (url.includes("q=site:v2ex")) {
            result = "https://www.google.com/search?q=site:v2ex.com/t%20";
          } else {
            result = url.substring(0, lastEqualSign + 1);
          }
          event.target.href = result + keyword;
        });
      };
      const createLinkElement = (item, cloneObj, elementType = "a") => {
        var copiedElement = cloneObj.cloneNode(true);
        let aElement;
        if (copiedElement.tagName.toLowerCase() === "a") {
          aElement = copiedElement;
        } else {
          aElement = copiedElement.querySelector("a");
        }
        aElement.href = item.url;
        aElement.target = "_blank";
        if (item.url === "edit") {
          aElement.href = "javascript:void(0)";
        }
        function getDeepestChild(element) {
          if (element.children.length === 0) {
            return element;
          }
          return getDeepestChild(element.children[0]);
        }
        const deepChild = getDeepestChild(copiedElement);
        deepChild.innerText = item.name;
        copiedElement.style.cssText = "margin-right:5px";
        return copiedElement;
      };
      const setBar1Menu = () => {
        const imageElement = getWebMenuItem()[1];
        const parentElement1 = imageElement.parentNode.parentNode;
        for (var i = 0; i < customCofig.value.length; i++) {
          var item = customCofig.value[i];
          const newElement2 = createLinkElement(item, imageElement);
          addMenuElementListener(newElement2);
          parentElement1.insertBefore(newElement2, imageElement.parentNode);
        }
        const editButton = createLinkElement({ url: "edit", name: "编辑" }, imageElement, "button");
        editButton.addEventListener("click", toggleDialog);
        parentElement1.append(editButton);
      };
      const customCofig = vue.ref([]);
      vue.onMounted(() => {
        var navigation = document.querySelector('[role="navigation"]');
        navigation.style.width = "calc(var(--center-width) + var(--rhs-margin) + var(--rhs-width) + -170px)";
        customCofig.value = _GM_getValue("data") || defaultConfig;
        setBar1Menu();
      });
      const dialogVisible = vue.ref(false);
      const toggleDialog = () => {
        dialogVisible.value = !dialogVisible.value;
      };
      const confirm = () => {
        _GM_setValue("data", customCofig.value);
        location.reload();
      };
      const reset = () => {
        _GM_setValue("data", defaultConfig);
        location.reload();
      };
      return (_ctx, _cache) => {
        return vue.withDirectives((vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
          vue.createElementVNode("div", _hoisted_2, [
            (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(customCofig.value, (config, index) => {
              return vue.openBlock(), vue.createElementBlock("div", {
                key: index,
                class: "configItem"
              }, [
                vue.withDirectives(vue.createElementVNode("input", {
                  "onUpdate:modelValue": ($event) => config.name = $event,
                  class: "input",
                  placeholder: "Name"
                }, null, 8, _hoisted_3), [
                  [vue.vModelText, config.name]
                ]),
                vue.withDirectives(vue.createElementVNode("input", {
                  "onUpdate:modelValue": ($event) => config.url = $event,
                  class: "input",
                  placeholder: "URL"
                }, null, 8, _hoisted_4), [
                  [vue.vModelText, config.url]
                ]),
                vue.createElementVNode("button", {
                  onClick: ($event) => customCofig.value.splice(index, 1)
                }, "删除", 8, _hoisted_5),
                vue.createElementVNode("button", {
                  onClick: ($event) => customCofig.value.splice(index, 0, config)
                }, "插入", 8, _hoisted_6)
              ]);
            }), 128))
          ]),
          vue.createElementVNode("div", { class: "btnBox" }, [
            vue.createElementVNode("button", { onClick: confirm }, "确认"),
            vue.createElementVNode("button", { onClick: reset }, "重置")
          ])
        ], 512)), [
          [vue.vShow, dialogVisible.value]
        ]);
      };
    }
  };
  const App = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-1d2257bf"]]);
  vue.createApp(App).mount(
    (() => {
      const app = document.createElement("div");
      document.body.append(app);
      return app;
    })()
  );

})(Vue);