2015-12-14 13 views
11


Sto implementando heatmap per visualizzare tutti gli utenti che fanno clic sulla mia pagina utilizzando heatmaps.js di Patrick Wied. Heatmap viene caricato dalla collezione di "datapoints" per ogni elemento. Ma richiede troppo tempo per caricare ....
desc emissione .:Selectorator.js - selettore di tutti gli elementi nascosti a pagina

Ciascun punto dati ha coordinate X, Y e selettore (recuperato utilizzando selectorator.js) dell'elemento HTML a pag. Attualmente sto ottenendo circa 5k punti per ogni pagina e Ho bisogno di controllare se alcuni elementi non sono nascosti quindi non mostreremo heatmap per gli elementi nascosti.

Attualmente sto usando:

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

ma questo richiede circa 7 secondi per controllare tutti quei punti che è abbastanza lungo. Ho esaurito le idee su come evitare/ottimizzare questo problema.

Datapoint dettaglio:

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

Pseudo script del flusso di disc .:

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

Ho anche cercato di ottenere i selettori di tutti gli elementi nascosti, ma GetSelector() in selectorator.js e poi basta andare attraverso quella matrice ma richiede quasi la stessa ora della funzione is(:hidden).

Spero che abbia senso.

enter image description here

enter image description here

Fatto: Ottenere il selettore di un elemento potrebbe richiedere un po 'di tempo, ma il processo inverso (ottenendo ed elemento base di selettore) richiede pochissimo tempo. -> quindi non posso semplicemente inviare array di selettori di elementi nascosti e filtrare quelli che sarebbero molto più veloci.

+0

Grazie per la modifica. @TotaloDotoNeto. – Anymoify

+0

esegui un profiler e pubblichi i risultati?forse questo darà un'idea di cosa ci vuole da così tanto tempo – epoch

+0

grazie per il profilo, è come se pensassi che i selettori stanno uccidendo la tua pagina, dovrai pensare a un altro modo per farlo, eventualmente salvando lo stato dell'elemento quando raccolgo i dati – epoch

risposta

1

guardando la sorgente di selectorator sembra indicare che genera selettori utilizzando un indice; cioè pageData > tbody > tr:eq(3) > td:eq(4) > a:eq(0)

Ora, recuperando l'elemento tramite il selettore che sembra piuttosto complicato (suppongo che qualcosa avrà bisogno di analizzarlo, ed eseguire il selettore per recuperare l'elemento effettivo;

Sto indovinando qui che questo è quello che sta prendendo così tanto tempo, come ho detto nei commenti, un profilo sarà davvero d'aiuto.

Quindi, senza provare a risolvere questo problema esatto, puoi piuttosto salvare la proprietà display dell'elemento? questo eliminerà la necessità di controllo via jQuery

Esempio di controllo manuale

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

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

Il salvataggio della proprietà 'display' non farà molto, poiché alcuni elementi potrebbero essere visibili quando i dati vengono raccolti ma non quando viene visualizzata heatmap. Ecco perché ho bisogno di passare attraverso ogni punto (click) esclusivamente. Il selettore di parsing non impiega molto tempo alla funzione 'is. (" Hidden ")'. Diciamo che abbiamo 2k punti da controllare. E ogni volta che viene verificata la condizione .is (": hidden")) passa attraverso tutti gli elementi a pagina e potrebbe essere intorno a 100. Il che significa valutazione delle condizioni di 2000 * 100. – Anymoify

+0

che dire di non usare 'is (" hidden ")' lì, prova a eseguire manualmente il DOM per vedere se l'elemento è effettivamente nascosto, inserisci subito una modifica velocemente – epoch

+0

Grazie, ho intenzione di provarlo, ma lo è. " hidden ") non controlla solo la proprietà display. Ma valuta anche altre possibilita 'di elemento per non essere visibile. Come zero larghezza e altezza ... ecc. https://api.jquery.com/hidden-selector/ – Anymoify

Problemi correlati