JavascriptProva

domenica 31 marzo 2013

Parametri relativi alla posizione del blocco di caselle.

Ultimo aggiustamento: la posizione del blocco di caselle.

Una semplice aggiunta: le coordinate del blocco:
function CreaCaselle(X,Y,numero,altezzaColonna,classe,matrice){
 var casella;
 for(var n=0;n<numero;n++){  
  //codice che crea una casella di tipo div e l'appende al documento
  casella=document.createElement("div");
  document.body.appendChild(casella);
  
  //codice che "conforma" la casella attribuendole una classe del CSS
  casella.className=classe;
  
  //Codice che stabilisce le coordinate della casella in base all'altezza della colonna
  casella.style.top=Y+(EN(casella.currentStyle.height)*(n%altezzaColonna))+"px";
  casella.style.left=X+(EN(casella.currentStyle.width)*(Math.floor(n/altezzaColonna)))+"px"; 
  if(matrice) matrice.push(casella); 
 }
}
in modo da posizionarle dove meglio si ritiene.

Aggiungere le caselle a un Array (facoltativo)

Aggiungiamo anche un Array al quale aggiungere le caselle.
function CreaCaselle(numero,altezzaColonna,classe,matrice){
 var casella;
 for(var n=0;n<numero;n++){  
  //codice che crea una casella di tipo div e l'appende al documento
  casella=document.createElement("div");
  document.body.appendChild(casella);
  
  //codice che "conforma" la casella attribuendole una classe del CSS
  casella.className=classe;
  
  //Codice che stabilisce le coordinate della casella in base all'altezza della colonna
  casella.style.top=(EN(casella.currentStyle.height)*(n%altezzaColonna))+"px";
  casella.style.left=(EN(casella.currentStyle.width)*(Math.floor(n/altezzaColonna)))+"px"; 
  if(matrice) matrice.push(casella); 
 }
}
Così, se viene fornito l'ultimo parametro, ossia il nome di un Array al quale aggiungere le caselle, le caselle vi vengono aggiunte, altrimenti se non viene fornito il parametro, l'istruzione di aggiunta viene ignorata.
Si tratta di un parametro facoltativo.

Posizionamento in libreria della funzione creaCaselle, e successivi aggiustamenti.

Ora devo isolare la funzione che crea un gruppo di caselle... e porla in libreria.

Vediamo come si può fare...

Ecco: isolato il codice, e creata una funzione avente per parametri il numero totale di caselle e l'altezza della colonna (se per numero ho 10 e per altezza della colonna ho 3, mi creerà tre colonne da 3 caselle più una di una casella... e così via...
function CreaCaselle(numero,altezzaColonna){
        var casella;
 for(var n=0;n<numero;n++){  
  //codice che crea una casella di tipo div e l'appende al documento
  casella=document.createElement("div");
  document.body.appendChild(casella);
  
  //codice che "conforma" la casella attribuendole una classe del CSS
  casella.className="casella";
  
  //Codice che stabilisce le coordinate della casella in base all'altezza della colonna
  casella.style.top=(EN(casella.currentStyle.height)*(n%altezzaColonna))+"px";
  casella.style.left=(EN(casella.currentStyle.width)*(Math.floor(n/altezzaColonna)))+"px";  
 }
}
La posso mettere nella libreria, adesso.

Ci metto anche la funzione che crea la proprietà indexOf per i vecchi browser IE:
Array.prototype.indexOf=function(oggetto){
 for(var i=0;i<this.length;i++){
  if(this[i]==oggetto) return i;
 }
 return -1;
}
Così facciamo un po' d'ordine e la pagina principale diventa così (senza il problema degli Array e delle date, ancora):
<html>
<head>
<style>
.casella{
 border:1px solid blue;
 width:120px;
 height:15px;
 font-size:8px;
 position:absolute;
}
</style>

<script src="../librerie/funzioni.js"></script>
<script>
window.onload=main;

function main(){ 
 CreaCaselle(20,6); 
}
</script>
</head>
<body>
</body>
</html>

Però bisogna specificare nei parametri della funzione CreaCaselle anche la classe del foglio di stile che si vuole dare alle caselle: essa non può essere predefinita nella funzione!
Poca difficoltà nel fare questo: modifichiamo in modo che il nome della classe venga passato come parametro.
function CreaCaselle(numero,altezzaColonna,classe){
 var casella;
 for(var n=0;n<numero;n++){  
  //codice che crea una casella di tipo div e l'appende al documento
  casella=document.createElement("div");
  document.body.appendChild(casella);
  
  //codice che "conforma" la casella attribuendole una classe del CSS
  casella.className=classe;
  
  //Codice che stabilisce le coordinate della casella in base all'altezza della colonna
  casella.style.top=(EN(casella.currentStyle.height)*(n%altezzaColonna))+"px";
  casella.style.left=(EN(casella.currentStyle.width)*(Math.floor(n/altezzaColonna)))+"px";  
 }
}
cosicchè, avendo due stili nella sezione CSS, posso, variando il parametro, avere due formati completamente diversi delle mie caselle:
<html>
<head>
<style>
.casella{
 border:1px solid blue;
 width:120px;
 height:15px;
 font-size:8px;
 position:absolute;
}

.casella2{
 border:1px solid red;
 width:300px;
 height:20px;
 font-size:8px;
 position:absolute;
}
</style>

<script src="../librerie/funzioni.js"></script>
<script>
window.onload=main;

function main(){ 
 CreaCaselle(20,6,"casella2"); 
}
</script>
</head>
<body>
</body>
</html>
Ecco, cambiando la stringa passata come parametro posso far sì che le caselle abbiano lo stile casella o casella2.

Creazione della proprietà indexOf degli Array nei vecchi browser IE (come io posseggo su questo computer)

Ecco risolto il modo di individuare, a ogni oggetto di un array che venga cliccato, l'individuazione del suo indice nell'ambito della matrice, superando il problema dei vecchi browser IE che non implementano la proprietà indexOf.

Usando il prototipo dell'oggetto Array:
Array.prototype.indexOf=function(oggetto){
 for(var i=0;i<this.length;i++){
  if(this[i]==oggetto) return i;
 }
 return -1;
}
ottengo come risultato, nell'Array che creerò successivamente, l'esistenza di una proprietà indexOf che mi restituisce l'indice dell'elemento passato come parametro se il parametro è presente, altrimenti mi restituisce -1.

Cliccando su una casella dell'array, l'evento onmousedown viene recepito dall'oggetto document (l'evento "bubbla" e viene recepito da quello gerarchicamente superiore), ma event.srcElement mi offre l'elemento su cui si è avuto l'evento. Quindi posso scrivere:
document.onmousedown=function(){alert(Nomi.indexOf(event.srcElement))};
e ottengo l'indice dell'elemento nell'ambito dell'Array!

Creazione di Array di caselle del calendario.

Adesso cerchiamo di incasellare queste caselle in un Array!

<script src="../librerie/funzioni.js"></script>

<script>
var casella;
var CaselleInColonna;
var NumeroCaselle;

window.onload=main;
NumeroCaselle=30;
CaselleInColonna=30;
var dat;
function main(){
 dat=new Date();
 dat.setDate(1);
 
 var Nomi =new Array();
 
 for(var n=0;n<NumeroCaselle;n++){
  casella=document.createElement("div");
  document.body.appendChild(casella);
  casella.className="casella";
  casella.style.top=(EN(casella.currentStyle.height)*(n%CaselleInColonna))+"px";
  casella.style.left=(EN(casella.currentStyle.width)*(Math.floor(n/CaselleInColonna)))+"px";
  casella.innerHTML=dataString(dat,WDLETTERALE);
  Nomi.push(casella);
  dat.setDate(1+dat.getDate());  
 }
 alert(Nomi[3].innerHTML);
}



</script>
La riga in verde è una riga-test che mi restituisce il contenuto della quarta casella...

sabato 30 marzo 2013

Miglioramento della funzione che esprime la data di oggi in vari formati.

...ma meglio farlo definendo delle costanti, anzichè delle stringhe:
var WeekDays=new Array("domenica","lunedi","martedi","mercoledi","giovedi","venerdi","sabato");
var Months=new Array("gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre");
 
var WDLETTERALE=0;
var WDNUMERICO=1;
var LETTERALE=2;
var NUMERICO=3;

 
function dataString(formato){
 var D,WD,M,Y
 var dat=new Date();
 D=dat.getDate();
 WD=dat.getDay();
 M=dat.getMonth();
 Y=dat.getYear();
 if(formato==WDLETTERALE){
  return (WeekDays[WD]+" "+D+" "+Months[M]+" "+Y);
 }else if (formato==WDNUMERICO){
  return (WeekDays[WD]+" "+D+" "+(M+1)+" "+Y);
 }else if (formato==LETTERALE){
  return (D+" "+Months[M]+" "+Y);
 }else if (formato ==NUMERICO){
  return (D+" "+(M+1)+" "+Y);
 }else if(formato==null){
  return (D+" "+(M+1)+" "+Y);
 }
}
richiamandole così:
<script src="../librerie/funzioni.js"></script>

....................

function main(){
 alert(dataString(WDLETTERALE));
 alert(dataString(WDNUMERICO));
 alert(dataString(LETTERALE));
 alert(dataString(NUMERICO));
 alert(dataString());
}

Una funzione che esprime la data di oggi in vari formati.

Ecco! Ho creato una funzione che mostra la data di oggi nel formato voluto a seconda del parametro. Inserendola nelle librerie, non appesantisce il codice principale:
var WeekDays=new Array("domenica","lunedi","martedi","mercoledi","giovedi","venerdi","sabato");
var Months=new Array("gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre");
 
 
function dataString(formato){
 var D,WD,M,Y
 var dat=new Date();
 D=dat.getDate();
 WD=dat.getDay();
 M=dat.getMonth();
 Y=dat.getYear();
 if(formato=="weekday letterale"){
  return (WeekDays[WD]+" "+D+" "+Months[M]+" "+Y);
 }else if (formato=="weekday numerico"){
  return (WeekDays[WD]+" "+D+" "+(M+1)+" "+Y);
 }else if (formato=="letterale"){
  return (D+" "+Months[M]+" "+Y);
 }else if (formato =="numerico"){
  return (D+" "+(M+1)+" "+Y);
 }else{
  return (D+" "+(M+1)+" "+Y);
 }
}
richiamata dal programma principale in questo modo:
<script src="../librerie/funzioni.js"></script>

..........

function main(){
 alert(dataString("weekday letterale"));
 alert(dataString("weekday numerico"));
 alert(dataString("letterale"));
 alert(dataString("numerico"));
 alert(dataString());
}
Buono!