martedì 31 luglio 2007

Pillole di incompetenza Javascript pt1

Rispetto al post precedente, per ora abbiamo deciso di aggirare il tutto ed affrontare il problema nientemeno che con python e interfaccia COM per pilotare Exploder. La ditta è decisamente refrattaria alle mie insistenze di OpenSource, ma vabbè.

Partendo dal fatto che il sito in questione è di una azienda le cui bollette sono note a tutti e che si parla di un sottodominio di pubblicazione dei dati dei consumi aziendali, vi cito delle ottime parti di codice javascript, presenti nella pagina che sto cercando di navigare automaticamente per arrivare a scaricare i dati dei consumi.

In un form compaiono e scompaiono dei campi in base alla selezione di un radio button, il cui valore viene salvato nella variabile n.

// x Netscape non vi e` la gestione campi a scomparsa
if (!document.all)
return;

Prima cazzata, se non sai come fare una cosa almeno cerca su internet e lascia perdere questi assiomi, soprattutto se poi il sito non è assolutamente comprensibile sotto altri browser.
In base al valore di del radio button si vanno a nascondere e visualizzare alcuni campi:

if (n==1)
{
document.download2.gg1.style.display="";
document.download2.mm1.style.display="";
document.download2.aa1.style.display="";
document.download2.aa2.style.display="none";
document.download2.mm2.style.display="none";
document.download2.aa3.style.display="none";
document.download2.mm3.style.display="none";
document.download2.ss3.style.display="none";
return;
}

Ovviamente il codice prosegue con tanti altri if sul valore di n in base al quale si nascondono o visualizzano diversi campi. Il tutto programmato con la regola del copia-incolla. Molto più intuitivo e meno dispendioso in termini di byte sarebbe stato inizializzare il display di tutti a "none" (ma anche visibility hidden, se proprio siamo persone serie e sappiamo come far scomparire le cose in netscape) e poi con l'if si vanno cambiare due o tre property. Sicuramente più leggibile. E poi il colpo di genio: gestione delle date, si vuole avere il giorno precedente ad oggi, quindi controllando se devo scalare di mese, per cui devo sapere quanti giorni ha il mese precedente

gg = 31; <-- giorno corrente, stampato nella pagina da jsp
mm = 6 + 1; <-- mese corrente, stampato 0-based da jsp, incrementato per averlo 1 based
yy = 2007;

// calcolo giorno precedente
gg = gg - 1;
if (gg == 0) <-- Se ero al primo giorno, devo andare all'ultimo del mese precedente
{
if (mm == 1)
{
gg = 31;
mm = 12;
yy = yy - 1;
}
if (mm == 2)
{
gg = 31;
mm = 1;
}
if (mm == 3)
{
if ((yy % 4) > 0)
gg = 28;
else
gg = 29;
mm = 2;
}
if (mm == 4)
{
gg = 31;
mm = 3;
}

[.. e così fino a 12]

Ora, quanto ci vuole a fare dei controlli con un "or" sui mesi da 31 e su quelli da 30? Oppure una cosa più simpatica ma abbastanza fine a se stessa di un array di 12 valori, uno per ogni mese? e non puoi fare un generico mm--; ad inizio di tutta questa puttanata? Ma soprattutto, non hai mai sentito la parola ELSE???

Nessun commento: