Firefox

индекс
178,09

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

Читаю Хабраленту в 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
21 августа 2009, 13:22
1
ZIJ

комментарии (7)

+2
homm #
с завидной регулярностью появляются блоки с прокруткой на пару пикселей
А что это за блоки? (Google Reader не пользуюсь, но очень интересно).

И вот еще что, «@include *» смущает. Это точно нужно включать на всех сайтах?

Ого! И это по таймеру на всех страницах??:
for each (element in document.getElementsByTagName("*")) {

0
ZIJ #
Конкретно в Reader-е это DIV с overflow=auto. Инклюд поправил, спасибо :) А по таймеру только ставится хэндлер на DOMSubtreeModified, и при первом срабатывании убирается
+1
homm #
А по таймеру только ставится хэндлер
Кажется понял, это защита от срабатывания чаще чем раз в секунду? Имхо, слишком запутанно и если последнее изменение было до срабатывания таймера, это изменение не обработается.
0
ZIJ #
в ридере это событие повторяется очень часто, так что вся эта путаница почти эквивалентна таймеру, однако на менее динамичных страницах не будет всё время проверяться весь ДОМ
0
ZIJ #
Зделал правильнее, спасибо
0
ZIJ #
ой, Сделал
0
sapsan #
Может стоит добавить на userscripts.org Заодно, там есть возможность проверять обновления скрипта. Спасибо

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.