dragscroll

By jaek rich Last update May 4, 2008 — Installed 231 times. Daily Installs: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1
// ==UserScript==
// @name           dragscroll
// @description    scroll by dragging whitespace
// @include        *
// ==/UserScript==

var dragging = null;
var lastX = 0;
var lastY = 0;
var lastMouseDownTime = null;
var doubleClickInterval = 500;
var minDragInterval = 500;


window.addEventListener('mousedown', function(event) {

  var element = event.target;

  var now = new Date();
  if ((lastMouseDownTime == null || now - lastMouseDownTime > doubleClickInterval)
    && element.nodeName != 'INPUT' 
    && element.nodeName != 'TEXTAREA' 
    && element.nodeName != 'BUTTON' 
    && element.nodeName != 'SELECT') {

    lastMouseDownTime = now;
    event.preventDefault();
  }
  else {

    lastMouseDownTime = now;
    return;
  }

  // find scrollable element 
  while (element.parentNode != document) {

    //var css = document.defaultView.getComputedStyle(element, null);
    if (element.scrollHeight 
        && element.scrollHeight != element.offsetHeight
        && element.scrollWidth != element.offsetWidth) {

      break;
    }
    element = element.parentNode;
  }

  //GM_log(element.nodeName);

  dragging = element;

  lastX = event.clientX;
  lastY = event.clientY;

}, false);

window.addEventListener('mouseup', function(event) {

  dragging = null;

}, false);

window.addEventListener('mousemove', function(event) {

  if (dragging) {


    dragging.scrollLeft += lastX - event.clientX;
    dragging.scrollTop += lastY - event.clientY;

    lastX = event.clientX;
    lastY = event.clientY;
  }
}, false);

window.addEventListener('click', function(event) {

  // lets cancel clicks on links when we are dragging
  if (event.target.nodeName != 'A') {

    return;
  }

  var now = new Date();

  if (now - lastMouseDownTime > minDragInterval) {

    event.preventDefault();
  }

}, false);