Discussione:
Come svuotare un div?
(troppo vecchio per rispondere)
Ugo
2007-07-31 11:29:05 UTC
Permalink
Salve a tutti,

qual è il modo migliore per svuotare il contenuto di un div?
Apparentemente un bel
rif.innerHTML = '';
sembrerebbe la strada più indolore

Ma lo è effettivamente per i browser? Viene liberata per bene la memoria o
rimangono dei "cadaveri" che velocemente diventano dei "cimiteri" mostruosi
con zombi indistruttibili (mi sono un po' lasciato andare con l'analogia :)
Oreste
2007-07-31 16:48:23 UTC
Permalink
Post by Ugo
Salve a tutti,
qual è il modo migliore per svuotare il contenuto di un div?
Apparentemente un bel
rif.innerHTML = '';
sembrerebbe la strada più indolore
Ma lo è effettivamente per i browser? Viene liberata per bene la memoria o
rimangono dei "cadaveri" che velocemente diventano dei "cimiteri" mostruosi
con zombi indistruttibili (mi sono un po' lasciato andare con l'analogia :)
Ti propongo uno script che mi da soddisfazione, lo puoi adattare:

--------------------------
function scrivi(id,cn){
if (document.getElementById && !document.all){
rg = document.createRange();
el = document.getElementById(id);
rg.setStartBefore(el);
fr = rg.createContextualFragment(cn);
while (el.hasChildNodes())
el.removeChild(el.lastChild);
el.appendChild(fr);
}
else {document.getElementById(id).innerHTML = cn}
}
--------------------------
id = id del div
cn = testo da inserire nel div
--------------------------
Ugo
2007-08-01 13:53:40 UTC
Permalink
Post by Ugo
qual è il modo migliore per svuotare il contenuto di un div?
Provo a riformulare meglio:

c'è un modo per svuotare il contenuto di un div (caricato dinamicamente e
nel tempo di un grossa quantità di immagini) causando anche il benefico
effetto di liberazione della ram accumulata dal browser?

Tendenzialmente i modi credo che siano 2:

while( ref.lastChild )
ref.removeChild( ref.lastChild );

op

ref.innerHTML = '';

in termini di tempo si possono considerare equivalenti (un po' + veloce il
secondo testato con un enorme/eccessiva quantità di img)
in termini di liberazione della ram mi sembrano equivalenti pero' in IE
viene liberata in FF quasi niente :(

come posso fare?
Alessandro Pellizzari
2007-08-01 14:06:59 UTC
Permalink
Post by Ugo
in termini di tempo si possono considerare equivalenti (un po' + veloce
il secondo testato con un enorme/eccessiva quantità di img) in termini
di liberazione della ram mi sembrano equivalenti pero' in IE viene
liberata in FF quasi niente :(
Non puoi farci niente. E` una "feature" che i programmatori di FF
rifiutano di correggere, sostenendo che se ti servono di nuovo, quelle
immagini sono gia` in RAM.
Secondo me, semplicemente, non sanno come farlo perche` il codice e`
troppo incasinato.
FF, purtroppo, sta peggiorando dal punto di vista tecnico (nonostante sia
ancora il miglior browser per sviluppatori esistente, e abbia ancora il
miglior motore di rendering/js. Ma se non si da` una mossa KHTML/WebKit lo
superano).

Bye.
Ugo
2007-08-01 21:03:57 UTC
Permalink
Post by Alessandro Pellizzari
Post by Ugo
in termini di tempo si possono considerare equivalenti (un po' + veloce
il secondo testato con un enorme/eccessiva quantità di img) in termini
di liberazione della ram mi sembrano equivalenti pero' in IE viene
liberata in FF quasi niente :(
Non puoi farci niente. E` una "feature" che i programmatori di FF
rifiutano di correggere, sostenendo che se ti servono di nuovo, quelle
immagini sono gia` in RAM.
Mmmm, ma cavolo nel mio caso l'immagine è la stessa :(
cloc3
2007-09-08 21:06:28 UTC
Permalink
Post by Ugo
Salve a tutti,
qual è il modo migliore per svuotare il contenuto di un div?
Apparentemente un bel
rif.innerHTML = '';
sembrerebbe la strada più indolore
Ma lo è effettivamente per i browser?
stavo provando a svuotare un tbody allo stesso modo, e ho scoperto che
in konqueror non funziona proprio.
naturalmente, non mi pongo problemi sofisticati di uso della memoria
come nel tuo caso, ma di mera funzionalità.

qui: http://cloc3.dyndns.org/index.html/doku.php/macchia_e_smacchia ho
collocato un programmino banale dove si vede il problema.
konqueror-3.5.7 si blocca sulla funzione reset, inibendo il pulsante
Azzera.

in firefox, invece, il codice sembrerebbe andare.
il ciclo while di Ugo, invece, mi funziona in entrambi i browser.
ZER0
2007-09-10 06:16:48 UTC
Permalink
On Sat, 08 Sep 2007 21:06:28 -0000, cloc3 wrote:

[innerHTML]
Post by cloc3
stavo provando a svuotare un tbody allo stesso modo, e ho scoperto che
in konqueror non funziona proprio.
Aridaje. :)
Non si deve usare innerHTML per modificare parti di strutture, come le
table.
Dato che non è uno standard ogni browser lo implementa un po' come gli
pare.
E se ci dovessero essere problematiche legate alla loro infrastruttura
precedente, non ne fanno quindi un dramma.
Post by cloc3
naturalmente, non mi pongo problemi sofisticati di uso della memoria
come nel tuo caso, ma di mera funzionalità.
Potresti rimuovere il tbody incriminato e "appenderne" uno ex-novo. O,
se dovesse avere diversi attributi, potresti clonarlo senza nodi figli
e poi rimuovere l'originale.
--
~ "Ho avuto la fortuna di unire mestiere e passione,
che secondo Stendhal equivale alla felicità."
(Roland Barthes)
cloc3
2007-09-10 14:47:45 UTC
Permalink
Post by ZER0
Aridaje. :)
:) scusa. è evidente che la mia è un domanda da programmatore
inesperto. ma ho usato appositamente un thread che (a mio parere)
discuteva di un problema analogo.

non sapevo che le table avessero comportamenti particolari.
ma non capisco il senso in cui tu dici che non costituiscano standard:
http://www.itistorriani.it/accessibilita/risorse/w3c/html401/struct/tables.html#edef-TBODY

in ogni caso, ho notato che i problemi possono essere anche maggiori
di quelli che ho indicato sopra.
con mia sorpresa, infatti, ho notato che il mio programma non gira
affatto su IE (o forse, gira un 50%), nemmeno se uso una versione
completamente priva di innerHTM (purtroppo non ho IE e per testarlo
devo andare a fuori casa).

può dipendere esclusivamente dal fatto che ho usato una tabella?
le uniche istruzioni che usato sono:
document.getElementById
document.createElement
rif.setAttribute
rif..appendChild
Boolean
e cose di di stile.

ciao e grazie.
ZER0
2007-09-10 15:00:40 UTC
Permalink
Post by cloc3
Post by ZER0
Aridaje. :)
:) scusa. è evidente che la mia è un domanda da programmatore
inesperto. ma ho usato appositamente un thread che (a mio parere)
discuteva di un problema analogo.
Tranquillo, è che se ne era parlato neppure troppo tempo fa, solo per
quello. :)
Post by cloc3
non sapevo che le table avessero comportamenti particolari.
Non le table in sé, ma l'innerHTML usato per modificarne delle parti.
C'è stato un "quiquoquà": non sono le "table", ma è l'innerHTML a non
costituire uno standard.
Post by cloc3
con mia sorpresa, infatti, ho notato che il mio programma non gira
affatto su IE (o forse, gira un 50%), nemmeno se uso una versione
completamente priva di innerHTM (purtroppo non ho IE e per testarlo
devo andare a fuori casa).
Ottimo, direi. :)

Se ho tempo e modo magari domani ci butto un occhio; adesso purtroppo
devo scappare.
Post by cloc3
può dipendere esclusivamente dal fatto che ho usato una tabella?
Indubbiamente dipenderà dal fatto che IE, con gli standard, non è che
vada molto d'accordo..
Post by cloc3
document.getElementById
document.createElement
rif.setAttribute
rif.appendChild
Boolean
e cose di di stile.
Tutte cose con cui IE può causare potenzialmente problemi.
Oddio, tranne il Boolean, forse.
Post by cloc3
ciao e grazie.
De nada, a presto.
--
~ "Quando ti rifiuti di imparare una lezione in un modo,
ti verrà ripresentata sotto un altro aspetto." (E.Caddy)
Cristiano Larghi
2007-09-10 15:10:33 UTC
Permalink
Post by cloc3
con mia sorpresa, infatti, ho notato che il mio programma non gira
affatto su IE (o forse, gira un 50%), nemmeno se uso una versione
completamente priva di innerHTM (purtroppo non ho IE e per testarlo
devo andare a fuori casa).
document.createElement
createElement crea problemi con IE...
dato che stai aggiungendo righe-colonne anziché usare
createElement("tr")/"td" usa cloneNode per "duplicare" una riga "fake"
(attenzione al parametro):
http://developer.mozilla.org/en/docs/DOM:element.cloneNode
cambi l'innerHTML delle celle e usi appendChild sul tbody:
http://developer.mozilla.org/en/docs/DOM:element.appendChild

(per il loro utilizzo, anche se l'esempio non usa una tabella, guarda qua:
http://www.criosoftware.it/default43.aspx
)
--
"Affacciati affacciati benedici, guardaci
guardaci...guardaci!
Tanto sono quasi duemila anni che stai a guardare!"
E.B.
Continua a leggere su narkive:
Loading...