Учитывая набор верхних / нижних диапазонов пикселей, как мне найти, в какой из них был прокручен? - PullRequest
1 голос
/ 22 июля 2010

Проблема

Когда страница прокручивается сверху вниз, пользователь будет проходить через эти диапазоны. Предположим, что они являются значениями в алфавитной адресной книге: по мере их прокрутки сверху вниз они переходят от А к 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) - даже в некоторых случаях - это будет иметь большое значение, учитывая, что это происходит при каждой прокрутке документа.

1 Ответ

2 голосов
/ 22 июля 2010

Поскольку ваши данные отсортированы, вы можете перейти к O (log (N)) с немного измененным двоичным поиском , который возвращает значение на основе порога вместо точного соответствия. Тем не менее, я сомневаюсь, что поиск этих 12 элементов - это то, что замедляет вас, так как вы не делаете ничего дорогого, как поиск DOM. Вы должны использовать Javascript Profiler, например Firebug, чтобы увидеть, где на самом деле происходит замедление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...