Greasy Fork is available in English.

Mouse to where(Open in blank).

对链接的去向进行标注。

作者のサイトでサポートを受ける。または、このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name        Mouse to where(Open in blank).
// @namespace   Mouse to where(Open in blank).
// @icon        data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAO2SURBVHic7dwxTkNBDEDBfMR96Lh/TZcTLXfASNbqzfRJNs2TG/t5vV7ndbFzrn4+rPrYfgCwRwAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAg7HP6Bdv7+M/zjD6//X7YZAKAMAGAMAGAMAGAMAGAMAGAMAGAMAGAMAGAMAGAMAGAMAGAMAGAMAGAMAGAsPE9gG3TfX73BCgzAUCYAECYAECYAECYAECYAECYAECYAECYAECYAECYAECYAECYAECYAECYAEDYc4YL7fV9+u3/v/373M0EAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGGf0y+o77Nv/3+YMAFAmABAmABAmABAmABAmABAmABAmABAmABAmABAmABAmABAmABAmABAmABA2PgewNT2Pr17ApSZACBMACBMACBMACBMACBMACBMACBMACBMACBMACBMACBMACBMACBMACBMACBs/R7A1PY+/fY9AZgwAUCYAECYAECYAECYAECYAECYAECYAECYAECYAECYAECYAECYAECYAECYAEDY9fcApvv8t/8+TJgAIEwAIEwAIEwAIEwAIEwAIEwAIEwAIEwAIEwAIEwAIEwAIEwAIEwAIEwAIOz6ewDnnO0ntH19zz7//vmfd/zV7e8fMgFAmABAmABAmABAmABAmABAmABAmABAmABAmABAmABAmABAmABAmABAmABA2HMs1LdN9+GZWb4nYAKAMAGAMAGAMAGAMAGAMAGAMAGAMAGAMAGAMAGAMAGAMAGAMAGAMAGAMAGAMPcAbmefv214T8AEAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGECAGHPOedsP4JFX9/bL2h7/6z+vAkAwgQAwgQAwgQAwgQAwgQAwgQAwgQAwgQAwgQAwgQAwgQAwgQAwgQAwgQAwtwDYKZ+T2B5n3/KBABhAgBhAgBhAgBhAgBhAgBhAgBhAgBhAgBhAgBhAgBhAgBhAgBhAgBhAgBh7gGwa/uewOX7/FMmAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAgTAAhzDwDCTAAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQJgAQ9gvziV/bWLPjLAAAAABJRU5ErkJggg==
// @grant       none
// @run-at      document-start
// @version     1.27.202209191821
// @author      dms
// @description 对链接的去向进行标注。
// @match       *://*/*
// @supportURL  https://meta.appinn.net/t/35958
// @homepageURL https://meta.appinn.net/t/35958
// ==/UserScript==

(function() {
  'use strict';
  const openInSelf = false
  const addStyle = ()=>{
    const style = document.createElement('style')
    style.id = 'Mouse-to-where'
    style.innerHTML = `
    a.Mouse-to-where > span.Mouse-link-mark {
      position: relative;
      padding: 0;
      margin: 0;
      width: 0;
      height: 0;
    }
    a.Mouse-to-where > span.Mouse-link-mark::before {
      content: ' ';
      position: absolute;
      border-radius: 12px;
      box-sizing: border-box;
    }
    a.Mouse-to-where > span.Mouse-link-mark::before {
      top: 0;
      right: 0;
      width: 4px;
      height: 4px;
      background: rgba(66, 66, 233, 1);
      opacity: .3;
    }
    a.Mouse-to-where > span.Mouse-link-mark.Mouse-link-outer::before {
      background: rgba(233, 66 ,66, 1);
    }
    a.Mouse-to-where:hover > span.Mouse-link-mark::before {
      opacity: .8;
    }
    `
    document.body.appendChild(style)
  }
  const siteReg = new RegExp('^https?:\\/\\/'+window.location.host.replace(/\./g, '\\.'), 'i')
  const mark2Where = ()=>{
    document.body.querySelectorAll('a').forEach(a=>{
      if(a.classList.contains('Mouse-to-where')) return
      if(!a.href) return
      let isOuterLink = true
      if(!/^\w+:\/\//.test(a.href)) isOuterLink = false
      if(siteReg.test(a.href)) isOuterLink = false
      a.classList.add('Mouse-to-where')
      if(!/^_(parent|top)/i.test(a.target)){
        a.target = openInSelf ? '_self' : '_blank'
      }
      const linkMark = document.createElement('span')
      linkMark.classList.add('Mouse-link-mark')
      if(isOuterLink) linkMark.classList.add('Mouse-link-outer')
      linkMark.addEventListener('contextmenu', ()=>{
        window.open('https://api.pwmqr.com/qrcode/create/?url='+encodeURIComponent(a.href), '_blank')
      })
      a.appendChild(linkMark)
    })
  }
  window.addEventListener('load', ()=>{
    addStyle()
    mark2Where()
    const targetNode = document.body
    const config = {
      attributes: true,
      childList: true,
      subtree: true
    };
    let totalTimes= 0
    const callback = function(mutationsList, observer) {
      if(totalTimes++ >= 1e4){
        observer.disconnect()
      }
      mark2Where()
    };
    const observer = new MutationObserver(callback);
    observer.observe(targetNode, config);
  })
})()