Dynamische Tabellen -> Zellfarben per JS -> history.back

O

Olaf Rabbachin

Hi *,

ich erzeuge zur Laufzeit in einer ASP-Tabelle Tabellenzellen. Im Großteil
dieser Zellen befinden sich Checkboxes. Per JS ändere ich beim Click auf
eine solche Zelle oder deren Checkbox die Farbe der Zelle. Problem: Bei
einem history.back (oder Back-Button am Client) gehen die Client-seitig
geänderten Zellfarben verloren. Ich suche nun einen möglichst performanten
Weg, diese per StartupScript dort wiederherzustellen.
Mein letzter Versuch war das Durchlaufen der Zellen per:
for (var i=0; i<document.getElementsByTagName(""td"").length; i++) {...}
Für einen Vergleich müsste ich prüfen, ob eine Checkbox darin enthalten ist
und dann den Status dieser Checkbox abfragen - das bekomme ich nicht hin.
Andererseits könnte ich mir vorstellen, dass aufgrund der möglichen Anzahl
der Checkboxes dies relativ langsam werden würde.

Sprich - gibt es a) Alternativen zu einer Schleife über alle Zellen
und/oder gibt es einen passenderen Weg, dies anzugehen?

TIA & Gruß,
Olaf
 
L

Laurent Bugnion

Hallo Olaf,

Olaf said:
Hi *,

ich erzeuge zur Laufzeit in einer ASP-Tabelle Tabellenzellen. Im Großteil
dieser Zellen befinden sich Checkboxes. Per JS ändere ich beim Click auf
eine solche Zelle oder deren Checkbox die Farbe der Zelle. Problem: Bei
einem history.back (oder Back-Button am Client) gehen die Client-seitig
geänderten Zellfarben verloren. Ich suche nun einen möglichst performanten
Weg, diese per StartupScript dort wiederherzustellen.
Mein letzter Versuch war das Durchlaufen der Zellen per:
for (var i=0; i<document.getElementsByTagName(""td"").length; i++) {...}
Für einen Vergleich müsste ich prüfen, ob eine Checkbox darin enthalten ist
und dann den Status dieser Checkbox abfragen - das bekomme ich nicht hin.
Andererseits könnte ich mir vorstellen, dass aufgrund der möglichen Anzahl
der Checkboxes dies relativ langsam werden würde.

Sprich - gibt es a) Alternativen zu einer Schleife über alle Zellen
und/oder gibt es einen passenderen Weg, dies anzugehen?

TIA & Gruß,
Olaf

Du hast den grössten Nachteil von JavaScript auf Web Applikationen
entdeckt: Den "Back" button geht kaputt, wenn man mit JavaScript den
Inhalt der Seite modifiziert. Das ist auch wahr in AJAX, und natürlich
hier in DHTML auch.

Deine Idee ist gut und soll funktionieren. Es ist wahr, dass es am
Anfang ein bisschen zeit braucht, ich denke aber, dass es nicht so
schlimm wird. Um sicher zu sein muss man aber testen.

Du musst vermeiden, jedes Mal document.getElementsByTagName aufzurufen,
das braucht zu viel Zeit und ist nicht nötig. Du musst die Methode nur
einmal aufrufen, und das Ergebnis speichern:

var anTds = document.getElementsByTagName( "td" );
for ( var index = 0; index < anTds.length; index++ )
{
// ...
}

Wenn du die TD hast kannst du die childNodes collection überprüfen, und
schauen, ob da eine Checkbox gefunden wird.

Der Style der TDs kann aber auch auf dem Server gesetzt werden. Da du
einen Roundtrip hast werden die Werte der Checkboxes am Server
übermittelt. Dort kannst du dynamisch den Style setzen.

HTH,
Laurent
 
O

Olaf Rabbachin

Hi Laurent,

Laurent said:
Du musst vermeiden, jedes Mal document.getElementsByTagName aufzurufen,
das braucht zu viel Zeit und ist nicht nötig. Du musst die Methode nur
einmal aufrufen, und das Ergebnis speichern:

var anTds = document.getElementsByTagName( "td" );
for ( var index = 0; index < anTds.length; index++ )
{
// ...
}

darauf hätte ich wohl schon kommen können. :)
Wenn du die TD hast kannst du die childNodes collection überprüfen, und
schauen, ob da eine Checkbox gefunden wird.

Klasse, das war der "missing link" - hab's hinbekommen.
Der Style der TDs kann aber auch auf dem Server gesetzt werden. Da du
einen Roundtrip hast werden die Werte der Checkboxes am Server
übermittelt. Dort kannst du dynamisch den Style setzen.

Im Falle des history.back habe ich ja eben *keinen* roundtrip. Die Styles
der Tabellenzellen werden server-seitig über ein .skin-File gesteuert.
Client-seitig jedoch soll eine farbliche Hervorhebung von jenen Zellen
erfolgen, die der Benutzer manipuliert hat (und was nun auch funktioniert).
Das halte ich für nötig, weil sich in dem Form (kalendarische Übersicht),
je nach Anwendungseinstellung, durchaus 150 Boxen befinden können. Der
Benutzer will dann in aller Regel nur ein paar anklicken - das farbliche
Hervorheben bringt da eine wesentlich bessere Übersichtlichkeit. Sprich, es
geht rein um die client-seitige Anpassung.

Danke auch! :)

Gruß,
Olaf
 
O

Olaf Rabbachin

Hi,

Olaf Rabbachin wrote:

FYI - sorry for the German, I just recognized that I actually posted to the
wrong NG! This posting was really meant to be sent to a German ASP.net
group!

So here's the translation for the original posting:

--- 8< ---
at runtime I create cells within an ASP-table. In most of these cells
there'll be a checkbox-control. Via JS I'm changing a checkbox's
parent-cell's backcolor. The problem comes with history.back (or the user
clicking the back-button): the changed colors will be reset to their
original color (coming from a skin-file). I'm looking for a (possibly well
performing) way to restore those colors, i.e. using a StartupScript.

My last approach was to loop through all cells using:
for (var i=0; i<document.getElementsByTagName(""td"").length; i++) {...}
For a comparison I need to check as to whether there's a checkbox within
the so found cells, which I couldn't succeed in.
Also, looping through all controls could, due to the potentially large
count of checkboxes (up to ~100) impose a performance-problem which is why
I'd like to see whether there's any alternative to the loop-approach.

So - is there a) alternatives to looping through all table-cells and/or a
more appropriate approach?
--- 8< ---

Laurent then gave me hints concerning using a variable for the
cells-collection plus the childNodes-collection that I now utilized in
order to identify table-cells with checkboxes, so - with a loop -
everything's working as should now. If there's a more appropriate approach,
let me know!

Cheers,
Olaf
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,001
Messages
2,570,250
Members
46,848
Latest member
Graciela Mitchell

Latest Threads

Top