GoogleMore

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

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==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/[email protected]/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);