level 15
大司马郭祀
楼主
尝试着修改了一下,发现不知道怎么去掉轨迹显示,来求教一下,谢谢大家
// ==UserScript==
// @name Mousegestures.uc.js
// @namespace [email protected]
// @description 自定义鼠标手势,自用 DIY版
// @author 紫云飞&黒仪大螃蟹
// @homepageURL http://www.cnblogs.com/ziyunfei/archive/2011/12/15/2289504.html
// @include chrome://browser/content/browser.xul
// @charset UTF-8
// ==/UserScript==
(() => {
'use strict';
let ucjsMouseGestures = {
lastX: 0,
lastY: 0,
directionChain: '',
isMouseDownL: false,
isMouseDownR: false,
hideFireContext: false,
shouldFireContext: false,
GESTURES: {
'L': {name: '后退', cmd: () => getWebNavigation().canGoBack && getWebNavigation().goBack()},
'R': {name: '前进', cmd: () => getWebNavigation().canGoForward && getWebNavigation().goForward()},
'U': {name: '向上滚动', cmd: () => goDoCommand('cmd_scrollPageUp')},
'D': {name: '向下滚动', cmd: () => goDoCommand('cmd_scrollPageDown')},
'UD': {name: '刷新当前页面', cmd: function() {document.getElementById("Browser:Reload").doCommand();}},
'LU': {name: '转到页首', cmd: () => goDoCommand('cmd_scrollTop')},
'LD': {name: '转到页尾', cmd: () => goDoCommand('cmd_scrollBottom')},
},
init: function() {
let self = this;
['mousedown', 'mousemove', 'mouseup', 'contextmenu', 'DOMMouseScroll'].forEach(type => {
gBrowser.mPanelContainer.addEventListener(type, self, true);
});
gBrowser.mPanelContainer.addEventListener('unload', () => {
['mousedown', 'mousemove', 'mouseup', 'contextmenu', 'DOMMouseScroll'].forEach(type => {
gBrowser.mPanelContainer.removeEventListener(type, self, true);
});
}, false);
},
handleEvent: function(event) {
switch (event.type) {
case 'mousedown':
if (event.button == 2) {
this.isMouseDownR = true;
this.hideFireContext = false;
[this.lastX, this.lastY, this.directionChain] = [event.screenX, event.screenY, ''];
}
if (event.button == 0) {
this.isMouseDownR = false;
this.stopGesture();
}
break;
case 'mousemove':
if (this.isMouseDownR) {
let[subX, subY] = [event.screenX - this.lastX, event.screenY - this.lastY];
let[distX, distY] = [(subX > 0 ? subX : (-subX)), (subY > 0 ? subY : (-subY))];
let direction;
if (distX < 10 && distY < 10) return;
if (distX > distY) direction = subX < 0 ? 'L' : 'R';
else direction = subY < 0 ? 'U' : 'D';
if (!this.xdTrailArea) {
this.xdTrailArea = document.createElement('hbox');
let canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
canvas.setAttribute('width', window.screen.width);
canvas.setAttribute('height', window.screen.height);
this.xdTrailAreaContext = canvas.getContext('2d');
this.xdTrailArea.style.cssText = '-moz-user-focus: none !important;-moz-user-select: none !important;display: -moz-box !important;box-sizing: border-box !important;pointer-events: none !important;margin: 0 !important;padding: 0 !important;width: 100% !important;height: 100% !important;border: none !important;box-shadow: none !important;overflow: hidden !important;background: none !important;opacity: 0.9 !important;position: fixed !important;z-index: 2147483647 !important;';
this.xdTrailArea.appendChild(canvas);
gBrowser.selectedBrowser.parentNode.insertBefore(this.xdTrailArea, gBrowser.selectedBrowser.nextSibling);
}
if (this.xdTrailAreaContext) {
this.hideFireContext = true;
this.xdTrailAreaContext.strokeStyle = '#0065FF';
this.xdTrailAreaContext.lineJoin = 'round';
this.xdTrailAreaContext.lineCap = 'round';
this.xdTrailAreaContext.lineWidth = 3;
this.xdTrailAreaContext.beginPath();
this.xdTrailAreaContext.moveTo(this.lastX - gBrowser.selectedBrowser.boxObject.screenX, this.lastY - gBrowser.selectedBrowser.boxObject.screenY);
this.xdTrailAreaContext.lineTo(event.screenX - gBrowser.selectedBrowser.boxObject.screenX, event.screenY - gBrowser.selectedBrowser.boxObject.screenY);
this.xdTrailAreaContext.closePath();
this.xdTrailAreaContext.stroke();
this.lastX = event.screenX;
this.lastY = event.screenY;
}
if (direction != this.directionChain.charAt(this.directionChain.length - 1)) {
this.directionChain += direction;
XULBrowserWindow.statusTextField.label = this.GESTURES[this.directionChain] ? '手势: ' + this.directionChain + ' ' + this.GESTURES[this.directionChain].name : '未知手势:' + this.directionChain;
}
}
break;
case 'mouseup':
if (this.isMouseDownR && event.button == 2) {
if (this.directionChain) this.shouldFireContext = false;
this.isMouseDownR = false;
this.directionChain && this.stopGesture();
}
break;
case 'contextmenu':
if (this.isMouseDownR || this.hideFireContext) {
this.shouldFireContext = true;
this.hideFireContext = false;
event.preventDefault();
event.stopPropagation();
}
break;
case 'DOMMouseScroll':
if (this.isMouseDownR) {
this.shouldFireContext = false;
this.hideFireContext = true;
this.directionChain = 'W' + (event.detail > 0 ? '+' : '-');
this.stopGesture();
}
break;
}
},
stopGesture: function() {
if (this.GESTURES[this.directionChain]) this.GESTURES[this.directionChain].cmd();
if (this.xdTrailArea) {
this.xdTrailArea.parentNode.removeChild(this.xdTrailArea);
this.xdTrailArea = null;
this.xdTrailAreaContext = null;
}
this.directionChain = '';
setTimeout(() => XULBrowserWindow.statusTextField.label = '', 2000);
this.hideFireContext = true;
}
};
ucjsMouseGestures.init();
})();
2018年01月11日 15点01分
1
// ==UserScript==
// @name Mousegestures.uc.js
// @namespace [email protected]
// @description 自定义鼠标手势,自用 DIY版
// @author 紫云飞&黒仪大螃蟹
// @homepageURL http://www.cnblogs.com/ziyunfei/archive/2011/12/15/2289504.html
// @include chrome://browser/content/browser.xul
// @charset UTF-8
// ==/UserScript==
(() => {
'use strict';
let ucjsMouseGestures = {
lastX: 0,
lastY: 0,
directionChain: '',
isMouseDownL: false,
isMouseDownR: false,
hideFireContext: false,
shouldFireContext: false,
GESTURES: {
'L': {name: '后退', cmd: () => getWebNavigation().canGoBack && getWebNavigation().goBack()},
'R': {name: '前进', cmd: () => getWebNavigation().canGoForward && getWebNavigation().goForward()},
'U': {name: '向上滚动', cmd: () => goDoCommand('cmd_scrollPageUp')},
'D': {name: '向下滚动', cmd: () => goDoCommand('cmd_scrollPageDown')},
'UD': {name: '刷新当前页面', cmd: function() {document.getElementById("Browser:Reload").doCommand();}},
'LU': {name: '转到页首', cmd: () => goDoCommand('cmd_scrollTop')},
'LD': {name: '转到页尾', cmd: () => goDoCommand('cmd_scrollBottom')},
},
init: function() {
let self = this;
['mousedown', 'mousemove', 'mouseup', 'contextmenu', 'DOMMouseScroll'].forEach(type => {
gBrowser.mPanelContainer.addEventListener(type, self, true);
});
gBrowser.mPanelContainer.addEventListener('unload', () => {
['mousedown', 'mousemove', 'mouseup', 'contextmenu', 'DOMMouseScroll'].forEach(type => {
gBrowser.mPanelContainer.removeEventListener(type, self, true);
});
}, false);
},
handleEvent: function(event) {
switch (event.type) {
case 'mousedown':
if (event.button == 2) {
this.isMouseDownR = true;
this.hideFireContext = false;
[this.lastX, this.lastY, this.directionChain] = [event.screenX, event.screenY, ''];
}
if (event.button == 0) {
this.isMouseDownR = false;
this.stopGesture();
}
break;
case 'mousemove':
if (this.isMouseDownR) {
let[subX, subY] = [event.screenX - this.lastX, event.screenY - this.lastY];
let[distX, distY] = [(subX > 0 ? subX : (-subX)), (subY > 0 ? subY : (-subY))];
let direction;
if (distX < 10 && distY < 10) return;
if (distX > distY) direction = subX < 0 ? 'L' : 'R';
else direction = subY < 0 ? 'U' : 'D';
if (!this.xdTrailArea) {
this.xdTrailArea = document.createElement('hbox');
let canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
canvas.setAttribute('width', window.screen.width);
canvas.setAttribute('height', window.screen.height);
this.xdTrailAreaContext = canvas.getContext('2d');
this.xdTrailArea.style.cssText = '-moz-user-focus: none !important;-moz-user-select: none !important;display: -moz-box !important;box-sizing: border-box !important;pointer-events: none !important;margin: 0 !important;padding: 0 !important;width: 100% !important;height: 100% !important;border: none !important;box-shadow: none !important;overflow: hidden !important;background: none !important;opacity: 0.9 !important;position: fixed !important;z-index: 2147483647 !important;';
this.xdTrailArea.appendChild(canvas);
gBrowser.selectedBrowser.parentNode.insertBefore(this.xdTrailArea, gBrowser.selectedBrowser.nextSibling);
}
if (this.xdTrailAreaContext) {
this.hideFireContext = true;
this.xdTrailAreaContext.strokeStyle = '#0065FF';
this.xdTrailAreaContext.lineJoin = 'round';
this.xdTrailAreaContext.lineCap = 'round';
this.xdTrailAreaContext.lineWidth = 3;
this.xdTrailAreaContext.beginPath();
this.xdTrailAreaContext.moveTo(this.lastX - gBrowser.selectedBrowser.boxObject.screenX, this.lastY - gBrowser.selectedBrowser.boxObject.screenY);
this.xdTrailAreaContext.lineTo(event.screenX - gBrowser.selectedBrowser.boxObject.screenX, event.screenY - gBrowser.selectedBrowser.boxObject.screenY);
this.xdTrailAreaContext.closePath();
this.xdTrailAreaContext.stroke();
this.lastX = event.screenX;
this.lastY = event.screenY;
}
if (direction != this.directionChain.charAt(this.directionChain.length - 1)) {
this.directionChain += direction;
XULBrowserWindow.statusTextField.label = this.GESTURES[this.directionChain] ? '手势: ' + this.directionChain + ' ' + this.GESTURES[this.directionChain].name : '未知手势:' + this.directionChain;
}
}
break;
case 'mouseup':
if (this.isMouseDownR && event.button == 2) {
if (this.directionChain) this.shouldFireContext = false;
this.isMouseDownR = false;
this.directionChain && this.stopGesture();
}
break;
case 'contextmenu':
if (this.isMouseDownR || this.hideFireContext) {
this.shouldFireContext = true;
this.hideFireContext = false;
event.preventDefault();
event.stopPropagation();
}
break;
case 'DOMMouseScroll':
if (this.isMouseDownR) {
this.shouldFireContext = false;
this.hideFireContext = true;
this.directionChain = 'W' + (event.detail > 0 ? '+' : '-');
this.stopGesture();
}
break;
}
},
stopGesture: function() {
if (this.GESTURES[this.directionChain]) this.GESTURES[this.directionChain].cmd();
if (this.xdTrailArea) {
this.xdTrailArea.parentNode.removeChild(this.xdTrailArea);
this.xdTrailArea = null;
this.xdTrailAreaContext = null;
}
this.directionChain = '';
setTimeout(() => XULBrowserWindow.statusTextField.label = '', 2000);
this.hideFireContext = true;
}
};
ucjsMouseGestures.init();
})();