Google - Middle Click Search

Opens search results in new tab when you middle click

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name         Google - Middle Click Search
// @namespace    https://greatest.deepsurf.us/users/649
// @version      1.2.1
// @description  Opens search results in new tab when you middle click
// @author       Adrien Pyke
// @include      /^https?:\/\/www\.google\.[a-zA-Z]+\/?(?:\?.*)?$/
// @include      /^https?:\/\/www\.google\.[a-zA-Z]+\/search\/?\?.*$/
// @require      https://cdn.jsdelivr.net/gh/fuzetsu/userscripts@ec863aa92cea78a20431f92e80ac0e93262136df/wait-for-elements/wait-for-elements.js
// @grant        GM_openInTab
// ==/UserScript==

(() => {
  'use strict';

  const setQueryParam = function (key, value, url = location.href) {
    const regex = new RegExp(`([?&])${key}=.*?(&|#|$)(.*)`, 'giu');
    const hasValue =
      typeof value !== 'undefined' && value !== null && value !== '';
    if (regex.test(url)) {
      if (hasValue) {
        return url.replace(regex, `$1${key}=${value}$2$3`);
      } else {
        const [path, hash] = url.split('#');
        url = path.replace(regex, '$1$3').replace(/(&|\?)$/u, '');
        if (hash) url += `#${hash[1]}`;
        return url;
      }
    } else if (hasValue) {
      const separator = url.includes('?') ? '&' : '?';
      const [path, hash] = url.split('#');
      url = `${path + separator + key}=${value}`;
      if (hash) url += `#${hash[1]}`;
      return url;
    } else return url;
  };

  const getUrl = function (value) {
    if (
      window.location.href.match(
        /^https?:\/\/www\.google\.[a-zA-Z]+\/search\/?\?.*$/u
      )
    ) {
      return setQueryParam('q', encodeURIComponent(value));
    } else {
      return `${location.protocol}//${
        location.host
      }/search?q=${encodeURIComponent(value)}`;
    }
  };

  waitForElems({
    sel: '#_fZl',
    onmatch(btn) {
      const input = document.querySelector('#lst-ib');

      btn.onmousedown = e => {
        if (e.button === 1) {
          e.preventDefault();
        }
      };

      btn.onclick = e => {
        if (e.button === 1 && input.value.trim()) {
          e.preventDefault();
          e.stopImmediatePropagation();
          const url = getUrl(input.value);
          GM_openInTab(url, true);
          return false;
        }
      };

      btn.onauxclick = btn.onclick;
    }
  });

  waitForElems({
    sel: '.sbsb_b li .sbqs_c, .sbsb_b li .sbpqs_d',
    onmatch(elem) {
      elem.onclick = e => {
        if (e.button === 1) {
          e.preventDefault();
          e.stopImmediatePropagation();
          const text = elem.classList.contains('sbpqs_d')
            ? elem.querySelector('span').textContent
            : elem.textContent;
          const url = getUrl(text);
          GM_openInTab(url, true);
          return false;
        }
      };
      elem.onauxclick = elem.onclick;
    }
  });
})();