Guida A Javascript

Attenzione prima di imparare il Javascript

Il Javascript e' un linguaggio di programmazione che può essere inserito in un sito per renderlo animato o fare dei programmi che girano sul web. Al contrario del PHP, il Javascript ha dei limiti di sicurezza enormi:

  • il PHP viene eseguito dal server; browser e utenti non vedono il codice e non possono alterarlo
  • il Javascript manda il codice in chiaro al browser, è il browser che lo elabora e quindi puo' essere modificato o hackerato dall'utente

questo significa che se dovete scrivere programmi che hanno a che fare con transazioni economiche o dati sensibili, il javascript va evitato.

Il tallone d'Achille del Javascript e' anche il suo punto forte, il codice è mandato direttamente al browser; il browser fa da interprete e lo renderizza ed esegue, quindi è possibile fare programmi molto piu' interattivi del PHP.

Come si scrive il codice?

Il codice si scrive o nella pagina HTML o in un file a parte. Esempi:

 <script>
 alert("Ciao Mondo!");
 </script> 

oppure indicando il percorso relativo o assoluto:

 <script src="/path/to/script.js"></script>

Il punto e virgola alla fine di ogni comando non e' obbligatorio, basterebbe anche solo andare a capo, ma se non lo mettete certe volte avvengo dei bug difficilissimi da trovare. Prendete l'abitudine di mettere sempre il punto e virgola alla fine di ogni comando come in PHP.

Commenti

I commenti si scrivono mettendo // e il resto della riga e' un commento.

 //questo e' un commento 

Si può fare anche con /*...*/:

 /* commento 
 molto 
 lungo */

Variabili

Le variabili la prima volta vanno inizializzate con let. Esempio:

 <script>
 let nome="Mario";
 nome="Giovanni";
 nome="Luigi";
 alert(nome); // appare Luigi
 </script>

Si possono usare apici, virgolette o backstic. Il backstick e' utile per inserire variabili:

 let nome="Mario";
 let nome2='Giovanni';
 let nome3=`${nome} e ${nome2} sono ${1 + 1} persone`;
 alert(nome3); // appare Mario e Giovanni sono 2 persone

Interagire con l'utente

Per interagire con l'utente ci sono tanti modi. I piu' semplici sono: alert, prompt e confirm.

Alert

Alert e' una semplice finestra che appare con una scritta:

 alert("Ciao!");

Prompt

Prompt e' una finestra con una scritta che un campo da compilare, cosi' potete chiedere informazioni all'utente. Il campo puo' essere precompilato:

 let anni = prompt('Quanti anni hai?', 20);
 alert(`Hai ${anni} anni!`); 

Confirm

Confirm serve per avere una risposta si o no. Il risultato sara' true o false.

 let mare = confirm("Ti piace il mare?");
 alert( mare ); 

Concatenazione stringhe

Per unire le stringhe si può usare il segno +:

 let mare="Il mare contiene " + "acqua" + " e sale";

IF

Il comando IF serve per le scelte:

 if (nome == "Mario") { alert("Ciao Mario"); }

 if (nome == "Luigi") {
    alert("Ciao Luigi");
    alert("Come stai?");
  } else {
    prompt("Come ti chiami?");
  }

Abbiamo usato la comparazione ==, ma per essere più sicuri è meglio === che controlla contenuto e tipo di dato.

WHILE

WHILE esegue finche' e' vera una condizione:

 let i = 0;
 while (i < 3) { // shows 0, then 1, then 2
   alert( i );
   i++;
 }

DO... WHILE

Do...While vi assicura che almeno una volta venga eseguito il comando:

 let i = 0;
 do {
  alert( i );
  i++;
 } 

FOR

FOR serve per ripetere un comando, o più comandi, un certo numero di volte:

 for (let i = 0; i < 3; i++) { 
  alert(i);
 }

BREAK e CONTINUE

Se bisogna interrompere un ciclo basta

 let sum = 0;
 while (sum < 11) {
  sum = sum + 1; 
  if (sum == 5) break;
  alert(sum);
 }
 alert("Ciclo finito!");

Se bisogna saltare il ciclo in andare al prossimo si puo' usare CONTINUE:

Se bisogna interrompere un ciclo basta

 let sum = 0;
 while (sum < 7) {
  sum = sum + 1; 
  if (sum == 3) continue;
  alert(sum);
 }
 alert("Ciclo finito!");

Etichette dei cicli

Siccome possiamo avere piu' cicli annidati, allora possiamo etichettare i cicli per dire a BREAK e CONTINUE qual ciclo interrompere o passare all'iterazione successiva.

 outer: for (let i = 0; i < 3; i++) {
  for (let j = 0; j < 3; j++) {
    let input = prompt(`Value at coords (${i},${j})`, '');
    // if an empty string or canceled, then break out of both loops
    if (!input) break outer; // (*)
    // do something with the value...
   }
 }
 alert('Done!');

Per fare un'operazione con tutti gli elementi di un oggetto, usare anche IN:

 for (key in object) {
  // executes the body for each key among object properties
 }

SWITCH

SWITCH fa scegliere direttamente fra piu' casi, e' come scrivere molti IF in maniera piu' semplice:

 switch(x) {
  case 'PANE':  
    alert("Grazie, mi piace il pane");
    break
  case 'ACQUA': 
    alert("Grazie, avevo sete.");
    break
  default:
         alert("Non mi piace, puoi offrirmi altro?");
    break
 }

Funzioni

Le funzioni si impostano cosi', e si possono anche impostare dei parametri di default se l'utente non ce li da':

 function (parametro1, parametro2="default2") {
  alert( 'Hello everyone!' );
 return parametro1;  //return non è obbligatorio
 }

Oggetti

Gli oggetti sono solo dei recipienti di valori:

 let user = {     // an object
  name: "John",  // by key "name" store value "John"
  age: 30        // by key "age" store value 30
 };

 alert( user.name ); // John
 alert( user.age ); // 30

Cancellare

Per cancellare un elemento in un oggetto basta usare delete:

 delete user.age;

Verificare se c'è una chiave

Bisogna usare IN:

 alert( "age" in user ); // se  user.age esiste, allora esce vero

OBJECT.KEYS / OBJECT.VALUES / OBJECT.ENTRIES

La proprietà keys vi dice le chiavi di un oggetto:

 alert(Object.keys(user)); //[]
 alert(Object.values(user)); //[]
 alert(Object.entries(user)); //],[

Copiare gli oggetti

Non fatelo. Gli oggetti in Javascript sono solo delle etichette per la stessa cella di memoria, se alterate un oggetto, aterate anche la sua copia.

THIS

Il testo this rappresenta l'oggetto usato nella funzione usata, ad esempio:

 let utente = {
   nome: "Mario",
   cognome: "Rossi",
   salutare() {
      alert(this.nome);
      }
   };
 utente.salutare();  //esce "Mario"

Matrici (array)

Per fare una matrice basta usare le parentesi quadre, cominciano la numerazione da zero:

 let frutti = ["Mela", "Pera", "Arancia"];
 alert(frutti[0]);  //Mela

Si possono fare anche muldidimensionali:

 let ricette = [
   [ "Sale", "Olio", "Peperoncino"],
   [ "Pasta", "Pomodoro", "Sale"]
   ];
 alert(ricette[1][0]); //Pasta

AT

La proprietà AT indica a quale posizione e si può indicare anche dal fondo:

 alert(frutti.at(-1); //Arancia

length

La proprietà length permette di sapere di quanti elementi è una matrice:

 alert(frutta.length);

JSON.stringify

Trasforma un oggetto in una stringa JSON:

 let student = {
  name: 'John',
  age: 30,
  isAdmin: false,
  courses: ['html', 'css', 'js'],
  spouse: null
 };

 let json = JSON.stringify(student);

 alert(json);
 /* JSON-encoded object:
 {
  "name": "John",
  "age": 30,
  "isAdmin": false,
  "courses": ["html", "css", "js"],
  "spouse": null
 }
 */

JSON.parse

Trasforma un testo JSON in un oggetto:

 let userData = '{ "name": "John", "age": 35, "isAdmin": false, "friends": [0,1,2,3] }';
 let user = JSON.parse(userData);

La data

La data è un oggetto, tra parentesi si mette la data in timestamp epoch; va scritto con la D maiuscola:

 let adesso = new Date();
 alert(adesso); // l'ora corrente

 let DueGenn1970 = new Date(24 * 3600 * 1000);
 alert(DueGenn1970); // Fri Jan 02 1970 01:00:00 GMT+0100

Comparazione: uguale e disuguale

Per uguale bisogna usare i caratteri di uguale == oppure ===, mentre per disuguale != oppure !==; le espressioni più lunghe controllano anche il tipo di dato oltre al contenuto.

Classi

Premessa

Le classi sono una delle complicazioni della programmazione a oggetti. Per chi scrive la programmazione a oggetti e' cercare di rendere estremamente piu' complessa la programmazione. Nella programmazione classica ci sono variabili e funzioni. Una funzione agisce su variabili o esegue un'operazione. Nella programmazione a oggetti abbiamo oggetti che possono essere qualsiasi cosa e dobbiamo esplorarle e studiarle per capire tutte le cose che possono fare e come; e poi abbiamo le classi che sono delle funzioni con un altro nome che hanno una marea di metodi, o sottofunzioni da poter chiamare. Tutto questo rende la programmazione uno sforzo mnemonico enorme e porta a fare molti piu' errori; per esempio una classe o un oggetto potrebbe avere una funzione che ci risolve subito il nostro compito, ma se non lo sappiamo otterremo il risultato con un enorme sforzo computazionale utilizzando solo le cose che conosciamo. Rendere le funzioni annidate dentro altre funzioni, in pratica, porta per un essere umano a scrivere pessimo codice. E' molto difficile avere un programma efficiente in Java o Javascript, e' molto piu' facile trovarlo in altri linguaggi non a oggetti; tutto questo perchè avere un indice con lista di funzioni da imparare è estremamente piu' semplice che: studiare gli oggetti, con i loro contenuti e poi le classi con i metodi all'interno. E' la stessa differenza tra imparare l'alfabeto (programmazione con le funzioni) e imparare tutta la piantina di una citta con tutti gli indirizzi e i nomi in cui vivono in ogni palazzo della citta' le persone (programmazione a oggetti).

Definizione di una classe

Ecco una definizione di una classe:

 class User {
  constructor(name) {
    this.name = name;
  }
  sayHi() {
    alert(this.name);
  }
 };
 // Usage:
 let user = new User("John");
 user.sayHi();

Oggetto Document (DOM)

L'oggetto document è utilizzato per cambiare la pagina HTML. E' un oggetto con un sacco di proprietà/metodi.

document.getElementById(id)

document.getElementsByTagName(name)

document.getElementsByClassName(name)

document.title

document.URL

document.lastModified

document.bgColor

document.fgColor

document.linkColor

document.vlinkColor

document.images.length

document.links.length

document.write()

document.writeln()

document.querySelector()

document.querySelectorAll()

document.createElement()

document.createTextNode()

document.element.innerHTML

document.element.attribute

document.element.style.property

document.element.setAttribute()

document.createElement()

document.removeChild()

document.appendChild()

document.replaceChild()

document.write()

document.getElementById().onclick

document.baseURI

document.body

document.cookie

document.doctype

document.documentElement

document.documentMode

document.documentURI

document.embeds

document.forms

document.head

document.images

document.implementation

document.inputEncoding

document.links

document.readyState

document.referrer

document.scripts

onclick

Qualunque elemento può avere la funzione onclick per attivare del codice javascript:

 <html>
 <body>
 <h1>JavaScript HTML Events</h1>
 <h2>The onclick Attribute</h2>

 <h2 onclick="this.innerHTML='Ooops!'; this.style.color='blue';">Clicca qui!</h2>

 </body>
 </html>