Greasy Fork

Greasy Fork is available in English.

Pinterest - Open Original Image

Open the original (largest) image in a new tab by pressing 'z' while hovering over a pin

目前为 2018-08-02 提交的版本,查看 最新版本

// ==UserScript==
// @name         Pinterest - Open Original Image
// @namespace    http://tampermonkey.net/
// @version      0.1.0
// @description  Open the original (largest) image in a new tab by pressing 'z' while hovering over a pin
// @author       Valacar
// @include      https://*.pinterest.tld/*
// @grant        GM_openInTab
// @noframes
// @license      MIT
// @compatible   firefox Firefox
// @compatible   chrome Chrome
// ==/UserScript==

(function() {
  'use strict';

  // Custom key. Only single letters.
  const KEY_TO_OPEN = "z";

  // Immediately switch to new tab?
  // Note: Hold SHIFT key to do the opposite of this (e.g. shift-z)
  const ACTIVATE_NEW_TAB = true;

  function showImage(shouldActivateTab)
  {
    let data = getPinData();
    if (data) {
      let imageOrig = data.images.orig;
      if (imageOrig && /\.(?:jpe?g|png|gif)$/.test(imageOrig.url)) {
        GM_openInTab(imageOrig.url, {active: shouldActivateTab});
      }
    }
  }

  function getEventHandler(pin)
  {
    return Object.keys(pin).find(prop => prop.startsWith("__reactEventHandlers"));
  }

  function getPinData()
  {
    let handler;
    let data;
    let hoveredElements = document.querySelectorAll(':hover'); // <-- magic!
    for (let el of hoveredElements) {
      if (el.hasAttribute("data-grid-item")) { // normal pin
        handler = getEventHandler(el);
        if (handler) {
          data = el[handler].children.props.data;
          return data;
        }
      } else if (el.parentNode && el.parentNode.classList && el.parentNode.classList.contains("containCloseup")) { // closeup image
        handler = getEventHandler(el);
        if (handler) {
          data = el[handler].children.props.pin;
          return data;
        }
      }
    }
  }

  window.addEventListener("keydown",
    function(event) {
      if (event.defaultPrevented ||
        /(input|textarea)/i.test(document.activeElement.nodeName)) {
        return;
      }
      switch (event.key) {
        case KEY_TO_OPEN.toLowerCase():
          showImage(ACTIVATE_NEW_TAB);
          break;
        case KEY_TO_OPEN.toUpperCase():
          showImage(!ACTIVATE_NEW_TAB);
          break;
        default:
          return;
      }
      event.preventDefault();
    },
    true
  );

})();