// ==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);
})());