2015-12-14 4 views
11


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

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

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

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

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

Datapoint деталь:

Element: #pageData > tbody > tr:eq(3) > td:eq(4) > a:eq(0)
Y:0.6546159
X:0.4444231

Псевдо сценарий убывание потока .:

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).

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

enter image description here

enter image description here

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

+0

Спасибо за редактирование. @TotaloDotoNeto. – Anymoify

+0

запустить профайлер и опубликовать результаты?возможно, это даст некоторое представление о том, что происходит так долго. – epoch

+0

спасибо за профиль, это так, как я, селекторы убивают вашу страницу, вам нужно будет подумать о другом способе этого, возможно, путем сохранения состояния элемента при сборе данных – epoch

ответ

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; 
} 
+0

Сохранение свойства 'display' не делает много, так как некоторые элементы могут быть видны при сборе данных, но не при отображении тепловой карты. Вот почему мне нужно пройти каждую точку (клик) исключительно. Селектор синтаксического анализа не занимает столько времени, что его функция 'is. (" Hidden ")'. Допустим, у нас есть 2k очков для проверки. И каждый раз .is («: hidden»)) условие проверяется, он проходит через все элементы на странице и может быть около 100. Это означает, что оценка состояния 2000 * 100. – Anymoify

+0

Как насчет того, чтобы не использовать 'is (" hidden ")' там, попробуйте запустить DOM вручную, чтобы увидеть, действительно ли элемент скрыт, плохой пост отредактировать быстро – epoch

+0

Спасибо, я собираюсь попробовать это, но есть. (" hidden ") не только проверяет свойство отображения. Но также оценивает другие возможности элемента, чтобы он не был виден. Как нулевая ширина и высота .. и т. Д. https://api.jquery.com/hidden-selector/ – Anymoify

Смежные вопросы