Проблема
Когда страница прокручивается сверху вниз, пользователь будет проходить через эти диапазоны. Предположим, что они являются значениями в алфавитной адресной книге: по мере их прокрутки сверху вниз они переходят от А к Z. На боковой стороне имеются вкладки, помеченные названиями разделов в документе, помеченные «Aa-An», Am-As 'и др.
Что мне нужно, так как пользователь прокручивает сверху вниз, обработчик прокрутки определяет, в какой из этих разделов в данный момент прокручивается и выделяет вкладку, связанную с текущим разделом.
В Javascript в событии прокрутки документа мне нужно определить, находится ли вертикальная прокрутка документа между одним из набора значений. Значения выглядят так:
var indices = {
'Aa-An': [{id: 92, name: 'Aardvark'}, {id: 13, name: 'Affable'}, ...],
'Am-As': [{id: 28, name: 'Amber'}, ...],
...
}
var heights = {
'item_92': {top: 170, bottom: 380},
'item_28': {top: 380, bottom: 600},
...
}
Ключи в heights
являются атрибутами id
первого элемента в каждом массиве в indices
. top
- это местоположение на странице первого элемента в этом списке, а bottom
- это местоположение на странице нижнего края последнего элемента в этом списке.
Текущее решение
Мой обработчик прокрутки:
var scroll = get_vertical_scroll();
for(var key in heights) {
var top = heights[key].top;
var bottom = heights[key].bottom;
if(scroll >= top && scroll < bottom) {
select('.index_tab').removeClass('selected');
get('index_'+key).addClass('selected');
return;
}
}
Самое большее, в heights
будет всего 12 ключей для итерации, так что это эффективное линейное решение. Но событие прокрутки уже довольно медленное, и если есть умный способ сделать это O (1) - даже в некоторых случаях - это будет иметь большое значение, учитывая, что это происходит при каждой прокрутке документа.