Как стать автором
Обновить

ScrollAll (скрипт для Greasemonkey)

Время на прочтение3 мин
Количество просмотров1K
Читаю Хабраленту в Google Reader, и давно заметил, что в ней с завидной регулярностью появляются блоки с прокруткой на пару пикселей, которые не дают скроллить дальше всю ленту. Приходится отводить мышу к скроллбару окна — не трудно, конечно, но раздражает, особенно когда читаешь «по диагонали». Поэтому был написан скрипт, который находит все такие элементы и временно блокирует скроллинг, когда элемент прокручен до конца, тем самым позволяя прокручивать страницу вниз.



// ==UserScript==
// @name ScrollAll
// @version 0.4
// @namespace http://zij.habrahabr.ru
// @description Позволяет скроллить страницу, когда курсор находится над элементом с прокруткой
// @author ZIJ
// @include http://www.google.com/reader/*
// @include https://www.google.com/reader/*
// ==/UserScript==

// <параметры>
var maxScrolls = 4        // количество скроллов "в холостую", штук
var hideTime = 4000        // время без скроллбаров, ms
var checkInterval = 2000    // минимальный интервал проверки DOM, ms
// </параметры>

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() {    // поиск элементов с прокруткой
  if (DOMModified) {
    DOMModified = false
    for each (element in document.getElementsByTagName("*")) {
      if (IsScrollable(element)) {
        element.addEventListener("DOMMouseScroll", handleScroll, false)
      }
    }
  }
}

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

function handleScroll(event) {    // определение скроллов "в холостую"
  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) {    // блокировка скроллинга на время
  var prev = window.getComputedStyle(element, null).overflow
  element.style.overflow = "hidden"
  setTimeout(function() { element.style.overflow = prev }, hideTime)
}


* This source code was highlighted with Source Code Highlighter.


Скачать Greasemonkey можно здесь
Имя файла скрипта обязательно должно заканчиваться на .user.js
Скрипт устанавливается драг-н-дропом в окно ФФ (при включенном Greasemonkey), после чего страницу нужно обновить

UPD: Сделал более наглядную и правильную проверку модификации документа
Теги:
Хабы:
+3
Комментарии7

Публикации