2011-01-30 7 views
16

Ho un'applicazione Web che non funziona correttamente in chrome. Funziona perfettamente in Firefox. Ho una pagina con un numero elevato di voci di elenco, 316 per la precisione. Ogni elemento dell'elenco contiene una grande quantità di HTML. Il mio problema è quando voglio nascondere o mostrare questi elementi della lista.Jquery hide() e show() vengono eseguiti troppo lentamente in google chrome

Ho una pagina di test su jsFiddle per mostrare il problema che sto avendo. Ho ridotto la pagina HTML a una lista non ordinata per contenere tutti i 316 elementi dell'elenco. Ho due pulsanti che richiamano semplicemente jQuery hide o show quando si fa clic. Di nuovo questo funziona velocemente in Firefox, Opera, persino IE, piuttosto bene in Safari, ma in Google Chrome ci possono volere più di 30 secondi che fanno apparire la finestra di dialogo che chiede se si vuole uccidere la pagina perché uno script è in esecuzione a lungo.

Ecco il link per jsFiddle

http://jsfiddle.net/oumichaelm/UZCZc/3/embedded/result/

Grazie per ogni ingresso. jmm

+0

Beh, questo è insolito. Chrome è più lento con un'operazione dinamica. Hai provato a profilarlo, vedere con quali operazioni è lento? – Orbling

+0

Stranamente, se si utilizza l'ispettore Web per nasconderlo tramite CSS ci vuole molto tempo, quindi il problema non è il Javascript. Visibilità: nascosto è veloce, ma suppongo che questo non risolva il tuo problema. – Duopixel

risposta

11

Sembra che questo non abbia nulla a che fare con jQuery ed è solo un problema con Chrome che nasconde un elemento genitore che ha un numero ENORME di elementi figli.

Questo solo utilizza JavaScript di base per nascondere l'elemento sul documento pronto:

document.getElementById('sortable-lines').style.display="none"; 

e ci vuole ancora per sempre dopo che il documento è pronto.

http://jsfiddle.net/petersendidit/UZCZc/10/embedded/result/

Aperto un bug Chrome per questo: http://code.google.com/p/chromium/issues/detail?id=71305

+0

Puoi per favore segnalare un bug in Chrome a riguardo? http://crbug.com/new e fammi sapere # che file. Lo farò con la squadra giusta. Le prestazioni dovrebbero essere migliori. Non è accettabile per questo, si rompe uno dei tre s in Chrome che è "velocità" –

+0

@Mohamed http://code.google.com/p/chromium/issues/detail?id=71305 – PetersenDidIt

+1

Il tuo javascript sicuramente dimostra che non è un problema da jquery. Grazie per aver dedicato del tempo a guardare questo. – jmm

9

Quando nascondere, rimuovere l'elemento dal DOM è più veloce rispetto all'utilizzo di hide().

var sortableLines = $('#sortable-lines'); 
$('#hide').click(function() { 
    $('#timer').text("Hiding");   
    sortableLines.remove(); 
}); 

E 'ancora lento quando si append() di nuovo al DOM.

Una possibile soluzione è quella di mostrare i primi 10 oggetti quando si fa clic sul pulsante di visualizzazione, quindi setInterval per visualizzarli progressivamente.


Edit: Trovato un altro mod:

È necessario impostare il contenitore per overflow: hidden:

#linecontainer { overflow: hidden; } 

Quando nascondere, spostare l'elemento fino alla parte superiore di gran lunga, impostando margin-top a un grande numero negativo.

$('#hide').click(function() { 
    $('#timer').text("Hiding"); 
    sortableLines.css('margin-top', '-1000000px'); 
}); 

Durante la visualizzazione, reimpostare il valore margin-top.

$('#show').click(function() { 
    $('#timer').text("Showing"); 
    sortableLines.css('margin-top', '0'); 
}); 

E it shows and hides instantly.

+0

Thai - Grazie per aver lavorato su questo. La mia più grande domanda era perché la differenza di velocità in cromo. Ma sicuramente esplorerò l'impostazione della proprietà margin-top. – jmm

+0

Grazie per l'hack "margin-top', funziona meravigliosamente. Era in corso lo stesso problema in chrome – MikeM

+1

Qualcos'altro da aggiungere, ho avuto una seconda situazione in cui margin-top non funzionava, si stava spostando l'intera lista di elementi a causa di alcuni dei miei requisiti di stile. Tuttavia, 'position: absolute' e' top: -10000px' hanno funzionato come seconda opzione – MikeM

0

Grazie per la risposta sopra, funziona alla grande e accelera il processo.

Tuttavia non funziona sempre - Funziona bene quando gli elementi di cui ho bisogno sono in cima alla lista. Tuttavia, non li mostra tutti se scelgo qualcosa dal centro della lista.

Credo di sapere perché si comporta male.

Quando il valore di un lungo elenco di elementi è impostato per nascondere/mostrare gli elementi nascosti vengono rimossi dal flusso e posizionati nella parte inferiore della pagina nell'ordine in cui sono stati rimossi.
Ciò rende la rimozione degli elementi notevolmente veloce.

Tuttavia, provare a renderli nuovamente visibili è un problema per il rendering poiché chrome deve ricordare l'ordine in cui questi elementi sono stati inclusi e sembra ricalcolare i valori associati.

Oltre alla maggior parte degli altri browser, lo spot per il componente non viene perso, quindi non si spreca tempo in questo ordinamento non necessario. La risposta di cui sopra funziona molto bene in quanto evita il problema di disordine di Chrome.