ScrollAll

By ZIJ Last update Aug 21, 2009 — Installed 180 times.
// ==UserScript==
// @name ScrollAll
// @version 1.0
// @namespace http://zij.habrahabr.ru
// @description Allows to scroll page with mouse being over a scrollable element.
// @author ZIJ
// @include http://www.google.com/reader/*
// @include https://www.google.com/reader/*
// ==/UserScript==

// <settings><параметры>
var maxScrolls = 4          // number of stalled scrolls // количество скроллов "в холостую", 1s
var hideTime = 4000         // time without scrollbars   // время без скроллбаров, ms
var checkInterval = 2000    // minimal DOM scan interval // минимальный интервал проверки DOM, ms
// </параметры></settings>

var DOMModified = false
var scrollCount = 0
var lastScrollTop = -1
var lastScrollTime = 0

document.addEventListener("DOMSubtreeModified", function() { DOMModified = true }, false)

var I = setInterval(scan, checkInterval)

function scan() {    // searching scrollable elements // поиск элементов с прокруткой
  if (DOMModified) {
    DOMModified = false
    for each (element in document.getElementsByTagName("*")) {
      if (IsScrollable(element)) {
        element.addEventListener("DOMMouseScroll", handleScroll, false)
      }
    }
  }
}

function IsScrollable(element) {    // checking against scrollability // проверка на скроллибельность
  if (element.scrollHeight > element.clientHeight) {
    with (window.getComputedStyle(element, null)) {
      return (overflow == "scroll") || (overflow == "auto")
    }
  } else return false
}

function handleScroll(event) {    // detecting stalled scrolls // определение скроллов "в холостую"
  if (event.timeStamp != lastScrollTime) {
    var newScrollTop = event.currentTarget.scrollTop
    if (newScrollTop == lastScrollTop) {
      scrollCount++
      if (scrollCount >= maxScrolls) {
        scrollCount = 0
        hideScrollbars(event.currentTarget)
      }
    }else {
      scrollCount = 0
      lastScrollTop = newScrollTop
    }
    lastScrollTime = event.timeStamp
  }
}

function hideScrollbars(element) {    // locking scrolling for a while // блокировка скроллинга на время
  var prev = window.getComputedStyle(element, null).overflow
  element.style.overflow = "hidden"
  setTimeout(function() { element.style.overflow = prev }, hideTime)
}