Greasy Fork is available in English.
按Alt复制链接上文字;select_link_text_with_AltKey
// ==UserScript== // @name 按Alt复制链接上文字 // @namespace http://tampermonkey.net/ // @version 0.1 // @include http://* // @include https://* // @description 按Alt复制链接上文字;select_link_text_with_AltKey // @author You // @match http://*/* // @grant none // ==/UserScript== //按住 Alt 时屏蔽链接, 方便选择 ((function () { 'use strict'; var LINKTARGET = null; //记录链接 var LINKHREF = null //记录原 href var TIMER = null; var COORD = { 'x': null, 'y': null }; //用于判断 HASMOVED var HASMOVED = false; //触发后鼠标是否移动过 //是否只按住 Alt function isMatchCondition(evt) { if (evt.altKey && !evt.ctrlKey && !evt.shiftKey) { //只按住 Alt return true; } return false; } //鼠标按下时取消链接 function cancelLinkDetector(evt) { if (isMatchCondition(evt) === false || LINKTARGET !== null) { return; } if (evt.stopPropagation) { //非 IE & IE9+ if (evt.button !== 0) { //左键 return; } } else { //IE 6-8 if (evt.button !== 1) { //左键 return; } } var target = evt.target || evt.srcElement; var nodeName; for (var i = 0; i < 3; i++) { //只往上找 3 层 nodeName = target.nodeName; if (nodeName === 'IMG' || nodeName === 'OBJECT') { //不处理图片 return; } else if (nodeName === 'A') { LINKTARGET = target; LINKHREF = target.getAttribute('href'); if (LINKHREF === null) { return; } COORD.x = evt.clientX; COORD.y = evt.clientY; HASMOVED = false; target.removeAttribute('href'); addEvent(document, 'mousemove', enableCancelLink, true); //只有移动过鼠标才取消链接 addEvent(document, 'mouseup', restoreLinkDetector, true); addEvent(window, 'blur', restoreLinkDetector); //拖到外面 return false; } target = target.parentNode; if (target === null) { return; } } } //只有移动过鼠标才取消链接 function enableCancelLink(evt) { if (Math.sqrt(Math.pow(evt.clientX - COORD.x, 2) + Math.pow(evt.clientY - COORD.y, 2)) < 3) { //鼠标移动距离小于 3 则忽略 return; } COORD.x = null; COORD.y = null; HASMOVED = true; delEvent(document, 'mousemove', enableCancelLink, true); stopBubble(evt); } //松开鼠标还原 function restoreLinkDetector(evt) { if (LINKTARGET === null) { return; } if (event.type === 'blur') { if (document.hasFocus()) { //IE 下可能会奇怪的触发 blur return; } } else { //mouseup if (evt.stopPropagation) { //非 IE & IE9+ if (evt.button !== 0) { //左键 return; } } else { //IE 6-8 if (evt.button !== 1) { //左键 return; } } } delEvent(document, 'mousemove', enableCancelLink, true); delEvent(document, 'mouseup', restoreLinkDetector, true); delEvent(window, 'blur', restoreLinkDetector); if (HASMOVED) { HASMOVED = false; addEvent(document, 'click', restoreLink, true); TIMER = setTimeout(restoreLink, 10); stopBubble(evt); preventDefault(evt); return; } restoreLink(); //没移动过则立即还原, 以触发标准行为 } //还原链接 function restoreLink(evt) { delEvent(document, 'click', restoreLink, true); if (evt) { var e; try { clearTimeout(TIMER); } catch (e) {} stopBubble(evt); preventDefault(evt); } TIMER = null; if (LINKHREF !== null) { LINKTARGET.setAttribute('href', LINKHREF); LINKTARGET = null; LINKHREF = null; } } function addEvent(elem, type, func, useCapture) { if (elem.addEventListener) { elem.addEventListener(type, func, useCapture || false); } else { elem.attachEvent('on' + type, func); } } function delEvent(elem, type, func, useCapture) { if (elem.removeEventListener) { elem.removeEventListener(type, func, useCapture || false); } else { elem.detachEvent('on' + type, func); } } //阻止冒泡 function stopBubble(evt) { if (evt.stopImmediatePropagation) { evt.stopImmediatePropagation(); } else if (evt.stopPropagation) { evt.stopPropagation(); } else { evt.cancelBubble = true; } } //阻止默认行为 function preventDefault(evt) { if (evt.preventDefault) { evt.preventDefault(); } else { evt.returnValue = false; } } addEvent(document, 'mousedown', cancelLinkDetector); })());