Selectorator.js - селектор всех скрытых элементов на странице


Я использую Heatmap для отображения всех пользователей, которые нажимают на мою страницу, используя heatmaps.js от Патрика Вида. Heatmap загружается из коллекции "datapoints" для каждого элемента. Но загрузка занимает слишком много времени... Ошибка выпуска:

Каждый datapoint имеет координаты X, Y и селектор (полученный с помощью selectorator.js) элемента HTML на странице. В настоящее время я получаю около 5 тыс. Точек для каждой страницы и Мне нужно проверить, не скрыты ли какие-то элементы, поэтому мы не будем отображать тепловую карту для скрытых элементов.

В настоящее время я использую:

element = $(data.points[i].Element);
element.is(":hidden"))

но это занимает около 7 секунд, чтобы проверить все те точки, которые довольно длинные. У меня закончились идеи, как избежать/оптимизировать эту проблему.

Подробное описание:

Элемент: #pageData > tbody > tr: eq (3) > td: eq (4) > a: eq (0)
  Y: 0.6546159
  X: 0.4444231

Pseudo script поток desc.:

FOREACH(point in allDatapoints)
{
 ...
   calculation of some parameters needed to show on heamapat
 ...
  if (point.element.is(":hidden"))
  {
    continue;
  }
  pointsToDisplay.push(point)
}

Я также попытался получить селектора всех скрытых элементов, но GetSelector() в selectorator.js, а затем просто пройти через этот массив, но он принимает почти то же время, что и функция is(:hidden).

Надеюсь, это имеет смысл.

введите описание изображения здесь

введите описание изображения здесь

Факт: получение селектора элемента может занять немного времени, но обратный процесс (получение и элемент на основе селектора) занимает почти нет времени. - > поэтому я не могу просто отправить массив селекторов скрытых элементов и фильтровать те, которые будут намного быстрее.

Ответ 1

смотрящий на источник selectorator, кажется, указывает, что он генерирует селектора с помощью индекса; т.е. pageData > tbody > tr:eq(3) > td:eq(4) > a:eq(0)

Теперь извлечение элемента через этот селектор выглядит довольно сложным (я предполагаю, что что-то потребуется для его анализа и выполнить селектор для извлечения фактического элемента;

Я предполагаю, что это так долго, как я уже сказал в комментариях, профиль действительно поможет.

Итак, не пытаясь исправить эту точную проблему, можете ли вы сохранить свойство display элемента? это устранит необходимость проверки через jQuery.

Пример проверки вручную

element = $(element);
while (element.tagName.toLowerCase() !== 'body') {
    if (element.style.display === 'none') {
        return false;
    }

    element = element.parentNode;
    if (!element) break;
}