JavascriptProva

Visualizzazione post con etichetta javaScript. Mostra tutti i post
Visualizzazione post con etichetta javaScript. Mostra tutti i post

domenica 6 marzo 2016

Una griglia di numeri in JavaScript

Vorrei creare una tastiera mediante la quale sia possibile prelevare cifre per poi deporle in uno spazio a creare numeri.

(nota: provato solo per Firefox)

Proverei con il JavaScript...

Comincio con il creare due DIV ognuno dei quali porta un numero da 1 a 3.
Cliccando sul DIV dovrebbe apparire al puntatore del mouse un "cartellino" contenente il numero rappresentato dal DIV.

Come si può creare un DIV a runtime? Rinfreschiamoci le idee...

<style>
.numero{
 font-size:60px;
 background-color:#AACCFF;
 width:100px;
 height:100px;
}

</style>


<script>
function creaDiv(){
 var mioDiv=document.createElement('div');
 mioDiv.className="numero";
 mioDiv.innerHTML=1;
 document.getElementsByTagName("body")[0].appendChild(mioDiv); 
}
</script>

<body onLoad="creaDiv()">


</body> 
Adesso vediamo di creare dei DIV affiancati, in file di tre.
Ricordo un classico schema per creare delle griglie di elementi...


Ecco, l'ho messo in pratica, ho rinunciato ad andare per passettini creando solo 1, 2 e 3, e ho fatto di getto tutto, ed ecco la funzione grid(left, top) che mi crea una griglia di elementi che ha la posizione specificata dai parametri:
<style>
.numero{
 font-size:100px;
 background-color:#AAEEDD;
 width:100px;
 height:100px;
 border: 2px solid green;
 line-height:100%;
 text-align:center;
 vertical-align:text-middle;
}

</style>


<script>
function main(){
 grid(300,50);
}
function grid(left,top){
 var x,y;
 for(n=0;n<9;n++){
  x=n%3;
  y=Math.floor(n/3);
  creaDiv(x,y,left,top,n);
 }
  
}
function creaDiv(x,y,left,top,n){
 var mioDiv=document.createElement('div');
 mioDiv.className="numero";
 mioDiv.innerHTML=n+1;
 mioDiv.style.position="absolute";
 mioDiv.style.left=left+x*parseInt(getComputedStyle(mioDiv).getPropertyValue("width"));
 mioDiv.style.top=top+y*parseInt(getComputedStyle(mioDiv).getPropertyValue("height"));
 document.getElementsByTagName("body")[0].appendChild(mioDiv); 
}
</script>

<body onLoad="main()">


</body>
Ecco la griglia:



Mi piace, ogni tanto, ripassare e approfondire il JavaScript!

sabato 9 gennaio 2016

Ereditarietà prototipale in JavaScript.

Uso Javascript in modo un po' "strano": non ho mai affrontato seriamente la questione dell'ereditarietà.

Vediamo di capirci qualcosa...

Creo una funzione, come costruttore dal quale istanziare oggetti.
function Prima(){
 this.uno=10;
 this.due=20; 
}
Ora creo un'altra funzione:
function Prima(){
 this.uno=10;
 this.due=20; 
}

function Seconda(){}
Istanzio...
function Prima(){
 this.uno=10;
 this.due=20; 
}

function Seconda(){}

var prima=new Prima();
var seconda=new Seconda();
e do il comando di mettere a video il valore delle proprietà uno e due del primo oggetto, istanziato dalla classe Prima, e del secondo oggetto, istanziato dalla classe Seconda.
function Prima(){
 this.uno=10;
 this.due=20; 
}

function Seconda(){}

var prima=new Prima();
var seconda=new Seconda();

document.write("prima.uno "+prima.uno);
document.write("prima.due "+prima.due);
document.write("seconda.uno "+seconda.uno);
document.write("seconda.due "+seconda.due);
e ottengo:
prima.uno 10
prima.due 20
seconda.uno undefined
seconda.due undefined


Ora istituisco la classe Seconda come erede della classe Prima, usando la funzione prototype:
function Prima(){
 this.uno=10;
 this.due=20; 
}

function Seconda(){}

Seconda.prototype=new Prima();

var prima=new Prima();
var seconda=new Seconda();


document.write("prima.uno "+prima.uno+"
"); document.write("prima.due "+prima.due+"
"); document.write("seconda.uno "+seconda.uno+"
"); document.write("seconda.due "+seconda.due+"
");
...ed ecco il risultato:
prima.uno 10
prima.due 20
seconda.uno 10
seconda.due 20
La riga marcata in rosso, che usa il prototype, è dunque il modo di rendere una classe erede di un'altra: essa presenta le stesse proprietà di un'altra classe, che quindi diventa genitrice come nei classici linguaggi orientati agli oggetti.

Un "overloading" di costruttori per JavaScript

Un'idea per fare una specie di overloading dei costruttori in JavaScript...


function funzione(){
 alert(arguments.length);
}
funzione(1,2,3);
Con questa prova, variando il numero dei parametri passati alla funzione ottengo un valore diverso di arguments.length, mentre se metto un qualunque numero di parametri attesi dalla funzione arguments.length resta sempre zero.
Ecco che quindi posso manipolare la mia funzione della retta per due punti;
function RettaPerDuePunti(Punto1,Punto2,Colore)
può diventare anche
function RettaPerDuePunti(X1,Y1,X2,Y2,Colore)
...che permette di tracciare una retta per due punti senza bisogno di istanziare i punti.

Provo ad eseguire la manipolazione...

function RettaPerDuePunti(){
 var matrice=[];
 var prevY;
 var Y;
 var Z;
 var H=1;
 var delta;
 if(arguments.length==3){
  this.pt1=arguments[0];
  this.pt2=arguments[1];
  this.X1=this.pt1.X;
  this.Y1=this.pt1.Y;
  this.X2=this.pt2.X;
  this.Y2=this.pt2.Y;
  this.Colore=arguments[arguments.length-1];
 }
 else if (arguments.length==5){
  
  this.X1=arguments[0];
  this.Y1=arguments[1];
  this.X2=arguments[2];
  this.Y2=arguments[3]
  this.Colore=arguments[arguments.length-1];
 }
 
 
 
 this.lunghezza=Math.sqrt(Math.pow((this.Y2-this.Y1),2)+Math.pow((this.X2-this.X1),2));
 this.traccia=function(){
  
  //se la coordinata X del primo punto è minore della coordinata X del secondo punto...
  if(this.X1<this.X2){ 
   for(var i=this.X1;i<=this.X2;i++){
    var elemento=document.createElement("DIV");
    matrice.push(elemento);
    
    //per la X di ogni punto dell'intervallo si calcola Y 
    //secondo la formula:
    /* (y-y1)/(y2-y1) = (x-x1)/(x2-x1)
    
       (y-y1) = (x-x1)/(x2-x1)*(y2-y1)
       
       y=(x-x1)/(x2-x1)*(y2-y1)+y1
       
    */
    Y=(i-this.X1)/(this.X2-this.X1)*(this.Y2-this.Y1)+this.Y1
    Z=Y;
    
    //CODICE PER TRACCIARE UNA LINEA RIPIDA CONTINUA
    // Si traccia un DIV di ordinata Y = y1 e di altezza calcolata in base alla
    //differenza fra y2 e y1
    /*
    Se y2 è maggiore di y1 si deve tracciare un DIV che parta dal pixel appena superiore a y1 e che sia di altezza pari alla differenza
    fra y2 e y1 diminuita di un pixel
    
    Se y2 è minore di y1 si deve tracciare un DIV che parta dal pixel in questione (Z resta uguale a Y) (ordinata Z) e che abbia un'
    altezza pari alla differenza fra y2 e y1.
    */
    //CALCOLO della differenza (delta) fra la coordinata Y di un punto e quella del punto precedente (prevY)
    if(prevY!=null) {
     delta=Y-prevY;
     
    
     if(delta>1) {
      Z=Y-delta+1;
      H=delta;
     }
     if(delta<-1) H=-delta;
    }
   
    elemento.setAttribute("style","width:1px;height:"+H+"px;background-color:"+this.Colore+";position:absolute;left:"+i+"px;top:"+Z+"px;");
    prevY=Y;
    document.body.appendChild(elemento);
  
    
   }
  }
  
  //se la coordinata X del secondo punto è minore di quella del primo punto
  else if(this.X1>this.X2){ 
   for(var i=this.X1;i>=this.X2;i-=1){
    var elemento=document.createElement("DIV"); 
    matrice.push(elemento);
    Y=(i-this.X1)/(this.X2-this.X1)*(this.Y2-this.Y1)+this.Y1
    Z=Y;
    //CALCOLO
    if(prevY!=null) {
     delta=Y-prevY;
     if(delta>1) {
      Z=Y-delta+1;
      H=delta;
     }
     if(delta<-1) H=-delta;
    }
   
    elemento.setAttribute("style","width:1px;height:"+H+"px;background-color:"+this.Colore+";position:absolute;left:"+i+"px;top:"+Z+"px;");
    prevY=Y;
    document.body.appendChild(elemento);
   }
  }
  else if(this.X1==this.X2){
   if(this.Y1<this.Y2){
    var e=Traccia(this.X1,this.Y1,1,Y2-this.Y1,this.Colore);
    matrice.push(e);
   }
   else if(this.Y1>this.Y2){
    var e=Traccia(this.X2,this.Y2,1,this.Y1-this.Y2,this.Colore);
    matrice.push(e);
   }
  }
  
  
 }
 this.traccia();
 
 this.cancella=function(){
  for(var n=0;n<matrice.length;n++){
   document.body.removeChild(matrice[n]);
  }
 }
} 

sabato 26 dicembre 2015

Disegnare rette di DIV su una pagina web

Creiamo un DIV.
<style>
#oggetto{
 position:absolute;
 width:100px;
 height:100px;
 background-color:red;
}
</style>

<script>
function init(){
 var elemento=document.createElement("div");
 elemento.setAttribute("id","oggetto");
 elemento.setAttribute("style","left:200px");
 document.body.appendChild(elemento);
}
</script>
<body onload="init()">

</body> 
Ecco.
Gli attributi di stile spaziali sono resi come formato stringa.
Devo dare un valore numerico e convertirlo.
Proviamo...

Ecco:
function CreaDiv(left){
 var elemento=document.createElement("div");
 elemento.setAttribute("class","oggetto");
 elemento.setAttribute("style","left:"+left.toString()+"px");
 document.body.appendChild(elemento);
}
function init(){
 CreaDiv(100);
}


Andiamo con le due coordinate.
function CreaDiv(left,top){
 var elemento=document.createElement("div");
 elemento.setAttribute("class","oggetto");
 elemento.setAttribute("style","left:"+left.toString()+"px;top:"+top.toString()+"px;");
 document.body.appendChild(elemento);
}
function init(){
 CreaDiv(500,200);
}
Perfetto!!!

Ora costruiamo una funzione...

function CreaDiv(left,top){
 var elemento=document.createElement("div");
 elemento.setAttribute("class","oggetto");
 elemento.setAttribute("style","left:"+left.toString()+"px;top:"+top.toString()+"px;");
 document.body.appendChild(elemento);
}
function init(){
 for(var i=100;i<500;i++){
  CreaDiv(i,i);
 }
}
Ed ecco una retta con angolo di 45 gradi, ossia con tangente 1, dato che x e y sono uguali.
Rendiamo puntiforme il DIV...
<style>
.oggetto{
 position:absolute;
 width:1px;
 height:1px;
 background-color:red;
}
</style> 
E il gioco è fatto! Ecco una retta a 45 gradi!



E via con la grafica di DIV!!!

sabato 19 dicembre 2015

Javascript: comparsa di un quadrato verde trascinabile col mouse, che sparisce al rilascio.

Bene.
Iniziamo con il programma.

Ho bisogno di creare un elemento al click del mouse.
Disponiamo che al click sulla pagina si crei un DIV in una determinata posizione.
Ed ecco che ho creato il codice che fa apparire, al click del mouse, dei div quadrati verdi con l'angolo superiore sinistro corrispondente alla posizione del mouse:
function crea(e){
 var elemento=document.createElement("div");
 elemento.className="classe";
 elemento.style.left=e.clientX+"px";
 elemento.style.top=e.clientY+"px";
 document.body.appendChild(elemento);
}
document.onmousedown=crea;


Però adesso mi serve che l'elemento si distrugga quando lascio il mouse.
Proviamo...

Sono andato abbastanza avanti!
Ecco il codice che fa apparire un quadrato verde al click del mouse, lo trascina intorno liberamente e poi lo distrugge al rilascio del mouse:
<script>
var elemento;
function crea(e){
 elemento=document.createElement("div");
 elemento.setAttribute("id","nome");
 elemento.className="classe";
 elemento.style.left=e.clientX-50+"px";
 elemento.style.top=e.clientY-50+"px";
 document.body.appendChild(elemento);
}
function OnMouseMove(e){
 elemento.style.left=e.clientX-50+"px";
 elemento.style.top=e.clientY-50+"px";
}

function distruggi(e){
 var genitore=document.body;
 elemento=e.target;
 genitore.removeChild(elemento);
}
document.onmousedown=crea;
document.onmouseup=distruggi;
document.onmousemove=OnMouseMove;
</script> 
Va un po' perfezionato, forse...

martedì 15 dicembre 2015

Ripasso e modifica del codice per il DragDrop di un DIV in JavaScript.

E se riprendessi a postare qui i miei progressi? Questo enorme blocco di appunti mi è prezioso...


E infatti vi ho ritrovato il codice per realizzare il drag-drop.

Facciamolo con la sintassi buona per Firefox.

Prendo un DIV e lo rendo quadrato, colorandolo in modo diverso dallo sfondo.
<html>
<head>

<style>
#oggetto{
 background-color:green;
 height:100px;
 width:100px;
}
</style>


<script>

</script>

<body>
<div id="oggetto"></div>

</body>
</html> 


Ecco il risultato:


Bene.
Ora rendo la posizione assoluta...

<html>
<head>

<style>
#oggetto{
 position:absolute;
 background-color:green;
 height:100px;
 width:100px;
}
</style>


<script>

</script>

<body>
<div id="oggetto"></div>

</body>
</html>
E adesso ottengo la posizione, salvandola in variabili.
Iniziamo con il solo asse delle X.

Per prima cosa, definisco una variabile che contiene l'oggetto bersaglio degli eventi, quindi creo le routines degli eventi.
<script>
var dragElement;

function OnMouseDown(event){
 alert(event.target.style.left);
}


document.onmousedown=OnMouseDown;


</script> 
La casella di dialogo non mi restituisce assolutamente nulla.
Forse devo estrarne il numero mediante la funzione ExtractNumber. Come la creo?
Ma un momento... ricordo che le impostazioni di posizione date tramite il CSS non appaiono quando rilevate tramite il JavaScript...


Ecco: ho ricostruito il programma, con qualche ritocco, ossia la capacità di leggere in JavaScript le impostazioni fornite con il CSS mediante ComputedStyle.
<html>
<head>

<style>
#oggetto{
 position:absolute;
 left:100px;
 background-color:green;
 height:100px;
 width:100px;
}
</style>
<script>
var dragElement;
var OffsetX;
var OffsetY;
var StartX;
var StartY;

function Sinistra(oggetto){
 var risultato=parseInt(getComputedStyle(oggetto).left); 
 return isNaN(risultato)==true? null: risultato;
}

function Alto(oggetto){
 var risultato=parseInt(getComputedStyle(oggetto).top); 
 return isNaN(risultato)==true? null: risultato;
}
function OnMouseDown(e){
 dragElement=e.target;
 OffsetX=Sinistra(dragElement);
 OffsetY=Alto(dragElement);
 StartX=e.clientX;
 StartY=e.clientY;
 document.onmousemove=OnMouseMove; 
}

function OnMouseMove(e){
 dragElement.style.left=OffsetX+e.clientX-StartX;
 dragElement.style.top=OffsetY+e.clientY-StartY;
}

function OnMouseUp(){
 document.onmousemove=null;
}
document.onmousedown=OnMouseDown;
document.onmouseup=OnMouseUp;

</script>

<body>
<div id="oggetto"></div>

</body>
</html>
E funziona!!! Incollando su Blocco Note questo codice, e salvando con un'estensione .HTML, col browser Firefox, funziona! Con Internet Explorer sicuramente non funziona, mentre con altri non lo so.

venerdì 5 aprile 2013

Salvataggio vecchia versione per inserimento voci del menu nelle caselle del calendario

Ho modificato la parte del programma che inserisce le voci del menu troncate all'interno delle caselle del calendario. La parte commentata è quella precedente, che non voglio perdere per eventualmente analizzarla in seguito; la parte in rosso è quella nuova, basata sulla funzione di servizio stringArray(elemento,numero) che ho inserito nella libreria "funzioni di servizio" di questo programma.
//la funzione che trascrive il contenuto del menu popup sulla casella (ha per parametro la casella sulla quale
//è stato evocato il menu popup)
function trascrivi(cas){
  var voce=document.createElement("span");
  voce.className="menu";
  voce.style.left=0+"px";
  
  voce.innerHTML=stringArray(event.srcElement,15);
  /*var stringArray=event.srcElement.innerHTML.split("");
  for(var i=0;i<8;i++){
   voce.innerHTML+=stringArray[i];
  }*/
  cas.appendChild(voce);
  
  

  rimuoviMenuPopup();
 
 
}

giovedì 4 aprile 2013

Funzione che identifica il capostipite di un elemento

Mi serve che cliccando su un figlio si debba confrontare il genitore con una serie di parametri per vedere se questo genitore è l'elemento giusto per avere una certa risposta.
Se non ci fosse la necessità di questo, l'evento potrebbe essere percepito dal genitore ed essere attuato sull'event.srcElement senza problemi.
Per questo mi serve una funzione che identifichi il capostipite:
//identifica il capostipite
function capostipite(elem){
 while(elem.parentNode!=document.body){
  elem=elem.parentNode;
 }
 return elem;
}
Banale.

Studio eventi fra padri, figli e bolle...

Creiamo un elemento e un elemento figlio.
function main(){
 elemento=document.createElement("div");
 elemento.className="classe1";
 document.body.appendChild(elemento);
 
 figlio=document.createElement("div");
 figlio.className="classe2";
 elemento.appendChild(figlio);
}
In base alle impostazioni del foglio di stile, ho ottenuto un quadrato più grande con all'interno un quadratino "figlio" più piccolo, sito in alto e a sinistra.

Con questa aggiunta, io "attacco un evento" all'elemento padre, dicendo che allo scattare di quell'evento l'elemento origine dell'evento deve diventare blu.
Vediamo che succede.
window.onload=main;
function main(){ 
 elemento=document.createElement("div");
 elemento.className="classe1";
 document.body.appendChild(elemento);
 
 figlio=document.createElement("div");
 figlio.className="classe2";
 elemento.appendChild(figlio);
 elemento.attachEvent("onmousedown",function(){event.srcElement.style.backgroundColor="blue"});
}
Ecco: se io clicco sul "padre", l'evento viene recepito dal padre, cui è "attaccato" l'evento, e diventa blu il padre, che è l'"elemento origine" dell'evento.
Ma se io clicco sul "figlio", l'evento viene recepito anche dal padre, perchè bubbla, ma diventa blu il figlio, perchè stavolta l'elemento origine dell'evento è lui.

martedì 2 aprile 2013

Calendario: progressi, usando le funzioni da me create e immesse in libreria

Ecco il codice, finora:
<html>
<head>
<style>
.casella{
 border:1px solid black;

 font-size:10px;
 position:absolute;
}

.casella2{
 border:1px solid red;

 font-size:8px;
 position:absolute;
}
</style>

<script src="librerie/funzioni.js"></script>
<script>
window.onload=main;
var Nomi=new Array(); 
var Mattine=new Array();
var Pomeriggi=new Array();
var Notti=new Array();
function main(){
 var larghezza=100;
 CreaCaselle(0,0,30,30,15,larghezza,"casella",Nomi);
 CreaCaselle(larghezza,0,30,30,15,larghezza,"casella",Mattine);
 CreaCaselle(larghezza*2,0,30,30,15,larghezza,"casella",Pomeriggi);
 CreaCaselle(larghezza*3,0,30,30,15,larghezza,"casella",Notti); 
 var dat=new Date();
 dat.setDate(1);
 for(var n=0;n<Nomi.length;n++){
  Nomi[n].innerHTML=dataString(dat,WDLETTERALE);
  if(dat.getDay()==0) Nomi[n].style.backgroundColor="#FFAAAA";
  dat.setDate(dat.getDate()+1);
 }
}

</script>
</head>
<body>
</body>
</html>


Sfuocata, ma comprensibile...

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!

venerdì 29 marzo 2013

Gestiamo le date per creare un calendario...

Ora voglio delle caselle disposte in forma di calendario, con le date di un mese.

Ripassiamo come gestire le date con Javascript...

Ecco il codice che mi mette in una casella di dialogo la data scritta per esteso in italiano:
function main(){
 var D,WD,M,Y
 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 dat=new Date();
 D=dat.getDate();
 WD=dat.getDay();
 M=dat.getMonth();
 Y=dat.getYear();
 alert(WeekDays[WD]+" "+D+" "+Months[M]+" "+Y);
}

giovedì 28 marzo 2013

Ecco la disposizione delle caselle in colonne ben realizzata!

Per prima cosa definire il numero delle caselle che si vuole, quindi l'altezza delle colonne.

Ecco: trovata la soluzione: 30 caselle disposte in 4 colonne di 7 elementi col resto di due.
<html>
<head>
<style>
.casella{
 border:1px solid red;
 width:200px;
 height:20px;
 position:absolute;
}
</style>

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

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

window.onload=main;
NumeroCaselle=30;
CaselleInColonna=7;
function main(){
 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";
 }
}
</script>
</head>
<body>

</body>
</html>

martedì 26 marzo 2013

Righe e colonne.

Una nuova implementazione di un calendario...

<html>
<head>
<style>
.casella{
 border:2px solid blue;
 width:200px;
 height:100px;
 position:absolute;
}
</style>


<script>
var casella;
window.onload=main;
function main(){
 
 casella=document.createElement("div");
 casella.className="casella";
 document.body.appendChild(casella);
}
</script>
</head>
<body>

</body>
</html>
Questo crea una semplice casella ex novo... come già sapevamo...
Possiamo anche creare una funzione ex novo...
<html>
<head>
<style>
.casella{
 border:2px solid red;
 width:200px;
 height:100px;
 position:absolute;
}
</style>


<script>
var casella;
window.onload=main;
function main(){
 
 creaCasella("div","casella");
}
function creaCasella(tipo,classe){
 casella=document.createElement(tipo);
 casella.className=classe;
 document.body.appendChild(casella);
}
</script>
</head>
<body>

</body>
</html>
Bene. Ovviamente funziona... Ora introduciamo le coordinate...

Ma dobbiamo calcolare le righe e le colonne.

Ecco un modo di usare l'operazione modulo per calcolare il numero delle celle contenute in una colonna:
<html>
<head>
<style>
.casella{
 border:2px solid red;
 width:200px;
 height:10px;
 position:absolute;
}
</style>

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

<script>
var casella;
window.onload=main;
function main(){
 for(var n=0;n<7;n++){
  creaCasella("div","casella",0,30*(n%7));
 }
}
function creaCasella(tipo,classe, sinistra, alto){
 casella=document.createElement(tipo);
 casella.className=classe;
 casella.style.top=alto+"px";
 casella.style.left=sinistra+"px";
 document.body.appendChild(casella);
}
</script>
</head>
<body>

</body>
</html>