// ==UserScript== // @name dragLikeAdobeReader // @namespace http://d.hatena.ne.jp/javascripter/ // @include http* // ==/UserScript== (function() { document.documentElement.style.cursor = '-moz-grab'; var grabbing = null; var x = null; var y = null; var rule = /^(?:input|textarea|button|select|a)$/; var select = null; var sRange = window.getSelection(); window.addEventListener('mousedown', function(e) { if (select && e.button == 0) { sRange.removeAllRanges(); select = false; } if (rule.test(e.target.tagName.toLowerCase()) || e.altKey || e.button != 0) { document.documentElement.style.cursor = 'auto'; select = true; return; } grabbing = true; document.documentElement.style.cursor = '-moz-grabbing'; x = e.clientX, y = e.clientY; e.preventDefault(); }, false); window.addEventListener('mouseup', function(e) { if (rule.test(e.target.tagName.toLowerCase()) || !grabbing || e.button != 0) return; grabbing = false; document.documentElement.style.cursor = '-moz-grab'; x, y = null; e.preventDefault(); }, false); window.addEventListener('mousemove', function(e) { if (grabbing && e.button == 0) { scrollDocument(e); e.preventDefault(); } }, false); function scrollDocument(e) { window.scrollBy(x - (x = e.clientX), y - (y = e.clientY)); } })();