App Unti
App Unti
Quando un dispositivo chiede una risorsa da un’altra parte, viene usato il routing, che va a vedere qual è la strada/il
percorso più breve per attivare all’informazione.
L’INDIRIZZO (URL)
Ogni informazione su internet ha un indirizzo in cui ogni parte ha una specifica funzione. Noi attraverso l’indirizzo,
chiamiamo una risorsa e il web browser sa dove andare a cercarla grazie al sistema DNS.
2. Top Level Domain: chiedo dove devo andare. Es dove si trova Google e lui mi dirà Google si trova su questo
indirizzo IP
3. Nome dominio: ciao Google dove si trova www? www si trova si questo indirizzo IP
IL DNS:
Il DNS è il sistema che permette di tradurre i nomi di dominio in indirizzo IP. Gli indirizzi IP sono blocchi di 4 numeri
da 0 a 255. Dove si trova un indirizzo va fatto una richiesta. Tutti i dispositivi hanno dei cash dove vengono salvate
le informazioni più richieste.
APPLICAZIONE WEB
Un’applicazione web è composta da:
• Disponibilità
o Ovunque
o Mobile e desktop
• Condivisione
o Tanti utenti, stessi dati
• Facilità d’uso: interfacce sono tutte alle st3esso modo. Siamo abituati ad avere sempre delle interfacce fatte
allo stesso modo e siamo abituati a usare quelle. Es vado su un sito mobile e mi aspetto di avere 3 trattini in
alto per il menù, mi aspetto di poter scorre con il dito una pagine
o Attraverso i browser
• Tecnologie standard
o Sviluppo semplice: non ci sono un mucchio di linguaggi di programmazione per fare un sito web ma
c’è né uno:
• HTML: per fare la struttura della pagina
• CSS: fogli di stile
• JAVA: per la parte dinamica del sito
Le web app nascono (come le conosciamo oggi) nel 1989 con Tim Barners-Lee.
URI [uniform resource identifier] è il sistema che consente di dare un identificatore (un nome) a qualsiasi risorsa
su internet. (indirizzi unici per andare ad una pagina)
HTML [hypertext markup language] è un linguaggio che definisce la struttura della pagina web (markup) e gli
hyperlink (grazie all'uri).
HTTP [hypertext transfer protocol] è il protocollo di scambio dati di alto livello tra client e server.
Questi elementi hanno consentito lo sviluppo del primo web server e del primo editor e browser, costituiti da:
pagine statiche, markup e hyperlink (ho una pagina, clicco su qualcosa e vado su un alta pagina)
Esempio:
• Contenuti dinamici
• Liste infinite (caricare pezzi di pagina che
prima non c’erano senza dover ricaricare la
pagina come scorre pagina instagram)
• Aggiornamenti in sottofondo (char,…) es
usare app da browser come whatapp se mi
arriva notifica la vedo subito
Ajax è una single page application: ovvero un app che carica tutta la struttura al primo click, una sola volta e poi
ogni azione del siti si svolge su quella singola pagina senza essere ricaricata.
APPLICAZIONI MOBILE
Dal 2007 nascono poi gli IPhone e Android, che consentono di accedere al web anche da cellulare. Questo
richiede una flessibilità delle dimensioni dell’interfaccia (responsive design). Per questo motivo nascono i
framework, che consentono di creare interfacce adattive e standardizzate in poco tempo.
ERA DEI FRAMEWORK
Implementazione logica di uno o più design pattern che facilito lo sviluppo di software.
COMPONENTI
Creo un unico oggetto e poi lo uso in vari modi a seconda delle proprietà che gli assegno. I componenti sono
quindi:
IL WEB OGGI
L’esame è ORALE. All’orale chiede quello che c’è nel codice, dobbiamo essere consapevoli di quello che
mettiamo perché ogni pezzo del codice può essere una domanda d’esame.
NB: queste sono le cose basi per il 30 se si vuole di + bisogna mettere cose extra come: animazioni
HTML
INTRODUZIONE
HTML: Hypertext Markup Language. HTML non è un linguaggio di programmazione, ma di markup. Markup termine
che viene ereditato dalla tipografia. Marcatori che vengono inseriti all’interno del testo e dicono come questo testo
deve essere visualizzato.
markup= tutto quello che c'è dentro è testo e quindi viene visualizzato. Posso mettere temi qua e là per dare del
informazione aggiuntiva al testo.
HTML è il primo linguaggio per realizzare pagine web. È nato nel 1989 al CERN di Ginevra.
HTML 5 serve a descrive il contenuto (struttura), ma non la forma. Però fino a qualche anno fa gestiva anche la
forma, dopo si è deciso di separare le due cose.
HTML è:
• Insieme di marcatori: HTTML è una lista di marcatori (tag(, cioè una lista di parole che si possono mettere
tra < > all'interno di un test. È un insieme di marcatori (tag) che si associano al testo per identificarne la
funzione.
• Non è case-sensitive: posso usare sia maiuscolo e minuscolo. per convenzione si usa tutto minuscolo. È
molto flessibile, e il browser ancora di più. Quindi se ci sono dei piccoli errori (es. una virgola mancante)
il browser tendenzialmente capisce comunque, ma è sempre meglio fare tutto perfettamente.
• Il documento contiene solo testo e marcatori: testo viene visualizzato sulla pagina
• Simile a XML, ne esiste un dialetto chiamato XHTML.
HTML TAG
Unità fondamentale dell’HTML, definisce il ruolo. Il tag (marcatore) parola, che viene inserita tra <…>
Normalmente i tag sono a coppie: tag di apertura e tag di chiusura, per es <html> </html>.
I tag possono avere degli attributi (parametri). Esempio: <a href=“http://www.ilmiosito.it/”>link</a> ---> quello che
vedo sarà scritta link che posso cliccare per andare a www.ilmiosito.it
I tag possono essere annidati. (Quelli che apro dopo gli chiudo prima) (es testo grassetto e corsivo, prima apro tag
grassetto e poi tag corsivo poi dovrò prima chiudere tag corsivo e tag grasetto)
FILE HTML
Normale file di testo, estensione .htm o .html
STRUTTURA HTML
Una pagina HTML è costituita da:
• tag <html>: racchiude l’interno documento. Ogni documento inizia con <html> e finirà con </html>. Primo tag
aperto e ultimo tag chiuso
è un tag singolo. Serve per comunicare al browser la tipologia di file che sta
ricevendo e far sì che legga i dati in modo corretto.
tutto ciò al di fuori di questi tag verrà ignorato
tutto ciò che sta qui non verrà visualizzato sulla pagina
Titolo pagina che vedo nel tab della pagina, posso mettere icona
pagina, riferimenti pagine di stile, file java, tutti i riferimenti non
inclusi nella pagina
tutto ciò che c’è in questo tag verrà visualizzato nella pagina
TIPI DI TAG
Abbiamo due tipologie di tag:
• Elementi contenitori: hanno tag di apertura e chiusura. Esempio <html> </html> Alcuni tag si aprono e si
chiudono e quindi conterranno delle informazioni
• Elementi vuoti: hanno solo tag di apertura. Sono quei tag che non prevedono l’inserimento di un testo al
loro interno. Esempio tag <br> (o <br/>(usare questa forma)) che indica vai a capo oppure va usato quando
devo inserire un immagine
• Block elements (quando metto un tag in quell’elemento dopo browser va a capo): generano una nuova riga e
possono contenere altri block elements (oltre che inline elements)(vengono inseriti uno sotto l’altro) es
paragrafo o titolo
• Inline elements (elementi non vanno a capo): possono contenere solo testo o altri inline elements e vengono
visualizzati sulla riga corrente (non vanno a capo) es testo in grassetto o in corsivo (non necessitano di andare
a capo)
• In generale ogni elemento ha una formattazione di default.
Esempio tag inline e tag block
apro paragrafo
COMMENTI:
I commenti non vengono letti dal browser, ma sono utili per una comprensione del codice sia per il programmatore
stesso sia per chi guarda il codice. I commenti possono essere su più righe. Utili magari per separare le varie
funzioni del sito
• Sei tag di intestazione (da <h1> a <h6>) : permette di creare 6 livelli di titoli diversi es h1 titolo, h2
sottotitolo,… hanno già una formattazione. Esempio: <h1> titolo </h1> (tipo block, va a capo quando
chiuso, è un contenitore)
• <p> testo </p>: paragrafo (tipo block, va a capo quando chiuso, è un contenitore)
• <pre> testo </pre> : testo pre-formattato (compresi gli a capo). (copia e incolla il testo così com'è, compresi
gli a capo, e di default ha un font di macchina da scrivere). (tipo block, va a capo quando chiuso, è un
contenitore)
• <span>< /span> [delinea una parte di testo che sarà gestibile dal CSS in maniera diversa dal resto del testo]
• <div>: consente di dividere varie parti di testo. Può contenere ad esempio diversi paragrafi e di default non
ha margini. Va a capo.
• <span>: elemento inline dei default. consente di trattare con CSS una parte di testo diversamente dal resto.
Ha più o meno la stessa funzione di, ma sulla stessa riga.
• <font> elemento inline in disuso. Riguarda le caratteristiche estetiche del font nel codice HTML. Non si usa
con HTML5 più perché viene usato in CSS.
Elementi block di default, hanno margine inferiore e superiore pre-impostati che posso però essere sovrascritti
con i fogli di stile.
Tag che non necessitano di chiusura:
ELENCHI
Gli elenchi sono tutti tag block, quindi tutti i tag vanno a capo da soli
NB: se non si mette nulla come attributo type, cioè se si mette solo ol di default ho elenco con i numeri,
viceversa se si mette solo ul di default ho un elenco a pallini neri
Esempio: href, in questo caso, è un attributo del tag <a>. Il testo contenuto tra <a> e </a> sarà quello che l'utente
visualizza e che se viene cliccato verrà reindirizzato al link indicato nell'attributo (può essere una pagina interna o
esterna al sito oppure con servizi esterni, ad esempio una mail a cui scrivere).
In css:
alt: testo alternativo. es letto da assistenze vocale.Con l'attributo alt si inserisce il testo alternativo. È importante
che ogni immagine abbia un testo alternativo così che il sito possa essere certificato come accessibile.
title: utilizzato per fornire ulteriori informazioni sull'immagine, appare al lettore quando passa il mouse sopra
l'immagine, tipo tooltip
TABELLE
Attributi:
• Attributo rowspan: numero di righe su cui estendere la cella. Esempio: <td rwospan= “2”> (unire due
colonne in senso verticale) (coinvolte + righe)
• Attributo colspan: numero di colonne sui estendere la cella. Esempio: <td colspan = “2”> (unire due
colonne in senso orizzontale)
• <caption> serve per dare una didascalia alla tabella.
Esempio:
ID: identifica in modo univoco un singolo elemento. PROPRIETÀ A SENSO PER UN OGGETTO SOLO. Identifica un
solo elementi all’interno della pagina.
CLASS: identifica un gruppo di elementi. È molto utile per modificare tutti gli elementi di una categoria in unica
vola. PROPRIETÀ A SENSO PER PIÙ OGGETTI. Può essere usato per più tag. Può identificare un gruppo di tag
HTML
Esempi:
CARATTERI SPECIALI
Si usa il simbolo & seguito dal codice del carattere e dal segno di punto e virgola. Oppure in alternativa, si può
usare il codice numerico dei simbolo, in decimale o esadecimale.
< (minore)
• <title> indica il titolo della pagina. Lo vediamo nella schede del browser come nome della pagina
• <link> collega un file esterno o un’altra pagina (es linkare CSS. In CSS le regole sono in un altro file)
• <style> specifica un blocco di istruzioni CSS
• <script> specifica un blocco o include un file esterno JS (funziona come style)
• <meta> delimita i metadati della pagina. Informazioni aggiuntive che si possono dare alla pagina
HTML5
HTML nato nel 1989 con il web da Tim Bermers-Lee.
SEMANTIC WEB
HTML esprime la sintassi, non la semantica. È nato per gestire pagine con link. Non è attento all’accessibilità.
HTML5 ha separato completamente la sintassi con la semantica. I “vecchi” tag HTML (così come le proprietà) che
stabilivano regole estetiche sono stati resi obsoleti. HTML5 si dedica alla semantica delle pagine. Pagina web deve
vedersi bene anche se senza i fogli di stile
tag <font>: proprietà align, proprietà color ecc resi obsoleti con nascita di HTML5
ELEMENTI DI STRUTTURA
HTML4: tanti div che avessero dei nomi, poi chiamati e poi usando
CSS venissero intercettati per farli divertare: sidebar, menù,…
mentre con HTML5 creati dei tag apposti. In particolare, si sono
creati:
ELEMENTI INLINE
VIDEO
Il tag <video> definisce un video, includendo l’interfaccia necessaria per la sua riproduzione. Include i codec
standard (h.264, ogg, ecc.). Se il browser lo supporta, include anche l’accelerazione hardware e l’encoding GPU.
Con il tag <video> vengono inclusi tutti i pulsanti.
AUDIO:
Il tag <audio> definisce un clip audio, includendo l’interfaccia necessaria per la sua riproduzione. Include i codec
standard (mp3, aac, ecc.). Completamente programmabile: si può decidere per esempio di farlo partire con la
pagina, di mettere i controlli,…usando determinati attributi.
ALTRO di HTML5
Geolocalizzazione Nuovi strumenti per l’integrazione di JS
CSS [Cascade Style Sheet] nasce nel 1996 e si usa per gestire la grafica (e quindi la forma) di una pagina web
attraverso delle regole (a cascata, secondo un ordine di priorità) e dei template.
Selettore: parola che sono i selettori ovvero elenco degli elementi HTML su cui lo stile si applica. Nell’esempio
sopra stiamo definendo uno stile per tutti i tag HTML chiamati h1
In CSS le regole sono racchiuse nelle parentesi graffe, che vengono applicate al selettore.
La proprietà è separata dal valore tramite i due punti : . Ogni dichiarazione termina con il punto e virgola ;
SELETTORI
Non utilizza i tag, come HTML, ma i selettori ovvero delle parole chiave che selezionano l'elemento HTML a cui
applicare la regola CSS. I selettori possono essere di 3 tipi:
Esempio2: CLASSE
• file esterno dove ho inserito tutte le regole. Per includere file CSS devo usare tag link va messo all’interno di
head.
Regole CSS
</style>
• regole inline nei tag HTML (sconsigliato, utile per debug), difficile capire dove sono inseriti CSS. Le regole
CSS si perdono per il codice HTML
Esempio: <h1 style=’font-size: 36pt: ‘> Questo testo è 36 pt </h1>
<h2 id=’sottotitolo’ style=’color:blue;’> questo testo è blue </h2>
ORDINE DI APPLICAZIONE
1. browser default: regole browser vengono sovrascritte, quelle del browser 1. tag (meno imp.)
sono meno importanti (es H1 se non mette niente ha regole di default) 2. class
2. file esterno o regole interne: nel file esterno va a vedere se ci sono regole con
sovrascrivono quelle del browser,
3. regole inline nei tag HTML (sconsigliato, utile per debug): poi va a vedere se ci 3. ID: regola id vince
sono regole inline che sovrascrivono quelle sopra del file esterno o regole sulla regola della
interne. Inline vince su file esterno e browser
class
• regole più specifiche vincono su quelle più generiche (es: voglio che regola valgo su tutti gli h1 vs voglio che
questa regola valga su tutti gli h1 che però sono in ID,.... la seconda è più specifica e vince quella)
• a parità di diffusione, vince l’ultima regola definita (es metto prima colore blu e come ultimo metto verde,
viene applicato il verde)
Se una regola con priorità minore non vogliamo che sia sovrascritta scriviamo !IMPORTANT dopo la regola.
EREDITARIETÀ
• Le regole relative a testo ed estetica sono ereditate (font, colori, sfondi, ecc.)
• Le regole relative al boxing model non sono ereditate (bordi, margini, ecc.)
SELETTORI COMBINATI
* * Tutti i tag
ESEMPIO
Esempio Descrizione
Tutti gli elementi di <p> che hanno classe “mia
p.miaclasse
classe”
#header p Tutti i <p> dentro il tag con ID “header”
Tutti i tag <h1> con classe “evidenziato” che si
#footer h1.evidenziato
trovano dentro il tag con id “footer”
div#dontent Il <div> con ud “content” (abbastanza inutile)
ALTRI SELETTORI
https://www.w3schools.com/css/css_pseudo_classes.asp
Esempio:
h2:hover{
I COLORI IN CSS
• Usando il nome del colore, es. blue, yellow Ce ne sono 140.
• Usando i tre valori RGB: rgb(red, green, blue), es. rgb(0, 0, 0) I tre valori RGB vanno da 0 a 255.
• Usando il valore esadecimale di RGB, es. #FF0000 I tre valori vanno da 00 a FF (da 0 a 255 in base 16)
• Usando RGBA (se inserisco opacità): rgba(red, green, blue, alpha). Es. rgba(0, 0, 0, 0) Il quarto valore va da
0 (invisibile) a 1 (opaco)
• Come HSL: hsla(hue, saturation, lightness) es. hsl(0, 100%, 50%), oppure hsla(hue, saturation, lightness,
alpha). Parametro alpha indica l’opacità e si indica con un numero compreso tra 0.0 (completamente
trasparente) e 1.0 (completamente opaco)
Esempi:
LE UNITÀ DI MISURA
• Unità di misura assolute: cm, mm, in (2.54 cm), px (1/96 di in), pt (1/72 di in), pc (12 pt) (per px dipende dal
dispositivo) (dimensioni uguali su tutti gli schermi)
• Unità di misura relative: (dipendo da qualche altra misura che c’è nella pagina)
- em (relativo alla dimensione del font) 1em= uguale al testo mentre per esempio se mettiamo 1.2em più
grande del testo
- % (in percentuale rispetto al default o al parent)
- ex, ch, rem, vw, vh, vmin, vmax
ALTRE AMANITÀ
• per linkare file esterni si usa url(). Esempio: url(‘pippi-calzelunghe.jpg’), si usa ad esempio per mettere come
sfondo ad un id una certa immagina oppure per elenco puntati pallino
• Initial: rimette il valore iniziale di quel attributo e non eredita.
#myh1{
font-size:initial;
• Inherit: forza l’elemento a ereditare la proprietà dal padre (anche se di natura non l’ho erediterebbe)
BACKGROUND
https://www.w3schools.com/cssref/tryit.asp?filename=trycss_background
Proprietà Descrizione
Tutte le proprietà insieme. Sette sfondo di un certo
background
oggetto
background-attachment Indica se lo sfondo scorre con la pagina
Esempio:
body {
BORDI
Ci sono un’infinità di proprietà, che aggregano qualsiasi combinazione (per es. border per tutte le proprietà
insieme, border-color per il colore, border-left-color per il colore di quello sinistro).
ordine 4 valori: sopra, destra, sotto, sinistra 3 valori: sopra, sinistra/destra, sotto 2 valori: sopra/sotto,
destra/sinistra 1 valore: tutti
Esempio: Parte CSS
h1 {
border color:red;
border width: 5px(sopra), 10 px (sx/dx), 20px (sotto) | border-radius: 5px (angoli arrotondati)
PROPRIETÀ BORDI
https://www.w3schools.com/cssref/tryit.asp?filename=trycss_border
TESTO
https://www.w3schools.com/cssref/tryit.asp?filename=trycss_font
Proprietà Descrizione
Tutte le proprietà insieme
font
font-style, font-variant, font-weight, font-size/line-height, font-family
Stile del font
font-style
normal|italic|oblique|initial|inherit
Variante
font-variant
normal|small-caps|initial|inherit
Spessore del test
font-weight
normal|bold|bolder|lighter|number (100-900)|initial|inherit
Dimensione del testo
font-size medium|xx-small|x-small|small|large|x-large|xx-large |smaller|larger|length|
initial |inherit
Interlinea
line-height
normal|number|length|initial|inherit
Il font (si può importare da Google Fonts o simili)
font-family family-name|generic-family|initial|inheri
FONT
Per usare un font di google devo: copiare codice per includerlo nella pagina in head. Codice ha tag link() Poi
prendo nome famiglia che andrò ad usare in css.
PROPRIETÀ DISPLAY
https://www.w3schools.com/cssref/tryit.asp?filename=trycss_display
POSIZIONE
https://www.w3schools.com/cssref/tryit.asp?filename=trycss_position_absolute
Esempio:
Background-color: yellow;
posiotion: absolute;
Esempio:
DIMENSIONI E MARGINI
Esempio:
PROPRIETÀ OVERFLOW
https://www.w3schools.com/cssref/tryit.asp?filename=trycss_overflow
Stabilisce come gestire gli elementi che sforano. Esistono anche overflow-x e overflow-y per gestire i singoli assi.
• visible: nulla viene nascosto; se l’elemento ha una dimensione fissata, il contenuto sborda.
• hidden: il contenuto dell’elemento viene nascosto
• scroll: il contenuto dell’elemento viene nascosto, ma vengono inserite barre di scorrimento per poterlo
vedere
• auto: come scroll, ma se il contenuto non esce non vengono visualizzate le barre di scorrimento. Barre
di scorrimento solo se necessarie compaiono
• initial|inherit: come sempre
PROPRIETÀ FLOAT
https://www.w3schools.com/cssref/tryit.asp?filename=trycss_float
https://www.w3schools.com/cssref/tryit.asp?filename=trycss_float5
< p style= “clear : right”> nuovo paragrafo e non voglio che stia affianco ad immagina ma sotto
VARIE ED EVENTUALI
• mask-image:
• table-layout: dimensioni tabella. Stabilisce come browser deve generare la tabella. Può assumere valori:
auto (suddivide in base ai testi le colonne. Tabella generata in base al contenuto)| fixed(colonne larghe uguali)
| initial | inherit
Proprietà Descrizione
::BEFORE E ::AFTER
• Si usano per aggiungere codice prima e/o dopo al tag
• Per il contenuto si usa la proprietà content
• Si usa (per esempio) per le icone a fianco dei link oppure per le briciole (briciole=quando vado su un sito e
mi dice dove sono)
VARIABILI
• Permettono di settare parametri una volta in tutto il progetto
• Il nome della variabile inizia per - - ed è case-sensitive (esempio: --blue:#6495ed; --white:#af0e6
• Per settarle si usa la sintassi CSS standard
• Per richiamarle si usa var()
ALTRE FUNZIONI
COUNTER
• Permettono di avere contatori all’interno delle pagine
• Il compito può essere svolto anche da JS (ma con CSS è più snello)
• Esempio: usato per contare sezioni di una pagina
Possibili media: all, print (stampante), screen, speech (strumenti di lettura per non vedenti)
https://www.w3schools.com/csSref/tryit.asp?filename=trycss3_media2
https://www.w3schools.com/csSref/tryit.asp?filename=trycss3_media_menu
PROPRIETÀ DI @MEDIA
@media non si usa solo per la dimensione dello schermo ma anche per altre cose tra cui:
IL VIEWPORT (METTERE PER ESAME/CONTROLLARE CHE SIA INSERITO)
• È un tag che è stato aggiunto successivamente dopo la nascita dei telefoni.
• NB: quando faccio un sito per il telefono devo usare questo tag. Questa parte va messa in alto (in head)
sempre altrimenti sito si vede come se fossimo sempre su un computer. Stabilisce come il browser dovrà
iniziare la visualizzazione del sito in base a quello che gli dico io.
• Va aggiunto questo snippet:
<meta name=“viewport"
content="width=device-width, initial-scale=1">
FLEXBOX
• Serve per migliorare la distribuzione di oggetti nel layout della pagina. Rende obsoleto l’uso dei float per il
layout del sito. Flex dispone automaticamente gli oggetti. Per attivarlo basta mettere display: flex sul padre
• Ambiente di CSS che permette di gestire l’accatastamento degli oggetti in orizzontale e in verticale. Flex
permette di creare un div e dentro disporre delle scatole in un modo che decidiamo noi.
flex item: contiene gli elementi che ci interessa posizionare all’interno della pagina
FLEXBOX
container= padre item=figli (oggetti)
FLEX-DIRECTION:
stabiliscono in quale direzione vengono accatastati gli oggetti. I valori possibili sono:
.container {
flex-flow: column wrap;}
JUSTIFY-CONTENT (si riferisci a come container deve allineare box)
Valori possibili sono: flex-start | flex-end | center | space-between | space-around | space-evenly
ALTRE PROPRIETÀ
• flex-shrink: Definisce la capacità di un elemento flessibile di ridursi, se necessario. Accetta solo numeri
positivi e no numeri negativi. Quanto viene ridimensionato oggetto
• flex-basis: dimensione di base dell’elemento
• align-self: (dice ad un oggetto come disporsi. NB: lo dico al figlio e no al padre)
https://css-tricks.com/snippets/css/a-guide-to-flexbox/
GRID
Serve per organizzare il layout di un sito a griglia. Feature mancante per lungo tempo (sic!). Separa la semantica
dall’estetica. Il padre dovrà avere display: grid . Con display-grid si risolve il problema della responsive.
Flex: comodo per sito con le card, elenco di oggetti (es carrello della spesa)
Grid: layout per un sito intero. Grid è alternativo a flex e serve per dare un layout a griglia.
GRIGLIA TERMINOLOGIA
Esempio:
Esempio:
.container{
display: grid;
grid-template-rows: 150px auto 150px; //1 riga cala 150px, 2 riga auto=spazio che resta, 3 riga vale 150 px
grid-template-areas: //specifico elementi griglia che ho definito sopra che è di 3 righe e 2 colonne. Dico cosa
c’è in ogni pezzo.
"header header" //1° riga unico oggetto, 1 cella sola, è come un
unisci cella e per farlo metto stesso nome
ESEMPIO:
https://codepen.io/Andrea_Barghigiani/embed/PGZGLW
DARE I NUMERI
SELEZIONARE LE CELLE
Figura 6:usando le coordinate: es item a inizia dalla colonna Figura 7: usando le coordinate: es item b parte da 1 vai fino
2, finisce con colonna five (posso usare sia numero che a col4start, poi parti da 2 e vai avanti di 2 (span-2)
nome usato) poi faccio stessa cosa con righe da row1 start
(1) fino a 3 (thrid line)
Figura 8: parti da 3, vai avanti di 2 per le colonne mentre per Figura 8: tutto in un comando per creare una griglia
le righe parti da third-line e arriva fino a 4
ANIMAZIONI E TRANSIZIONI
• In principio c’erano le GIF
• Poi è arrivato Flash
• Poi è arrivato CSS3 (con transizioni e animazioni)
• Poi sono tornate di moda le GIF
TRASIZIONI
• Permettono transizioni soft nelle modifiche di regole CSS
• Si attivano con la proprietà transform
• La proprietà transition stabilisce le proprietà transition: property duration timing-function delay
• timing-function può essere:
- linear: vado dal punto A al punto B in modo lineare, ogni pezzo fatto alla stessa velocità
- ease-in: c’è una accelerazione e poi una parte costante
- ease-out: prima c’è una parte in velocità costante e poi una decelerazione alla fine
- ease-in-out: accelera all’inizio e poi c’è una decelerazione alla fine
Esempio: https://jsfiddle.net/ahnpt6y8/
div {
width: 300px;
height: 100px;
background-color: yellow;
transition: transform 1s; //transizione: da tutte le proprietà: durata, delay
}
div:hover { //hover=quando ci passo sopra
transform: translate(10px, 10px); //translate= nome transizione}
TRANSZIONI
Quando c’è z, lavora con 3 dimensioni
Esempi di transizioni:
https://www.w3schools.com/cssref/css3_pr_transform.asp
ANIMAZIONI (gli metto i vari frame dove voglio andare: da questo frame a questo frame; e lui crea animazioni
per arrivare all’inizio alla fine). Molto complesse da fare.
ICONE
https://fontawesome.com/
CERCANDO ICONA E CLICCANDO SU ESSA OTTENGO POI CODICE HTML. PRIMA DEVO INSERIRE CDN:
CDN = link fisso a cui ci sono una serie di pacchetti, che possono essere utilizati
ESEMPIO
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>HTML + CSS</title>
<link rel="stylesheet" href="styles.css" />
<style type="text/css" >
#container{
display:flex;
background-color: purple;
flex-direction:row ;
flex-wrap: wrap; /*quando finisce lo spazio va capo*/
justify-content: space-between; /*dico come allinerare box dentro il contenitore*/
align-content: space-evenly;
padding: 20px; /*bordo all'interno di flex*/
height: 100px;
align-items: center;
}
.box{
background-color: orange;
width:180px; /*domensione box*/
padding:5px; /*margine all'interno dell'oggetto*/
flex-grow:1;
}
#box2{
background-color: blue;
flex-grow: 2;
</style>
</head>
<body>
<div id="container"> <!--contenitore -->
<div class="box"> Ciao1</div> <!--elementi box contenuti nel conteinitore-->
<div class="box" id="box2"> Ciao2</div>
<div class="box"> Ciao3</div>
<!-- <div class="box"> Ciao4</div>
<div class="box"> Ciao5</div>
<div class="box"> Ciao6</div> -->
</div>
</body>
</html>
BOOTSTRAP
https://getbootstrap.com/docs/5.3/getting-started/introduction/
https://getbootstrap.com/docs/4.0/components/
Bootsrap dà la possibilità di costruire siti completi e interessanti senza scrivere una sola riga di CSS.
È un framework per sviluppo di applicazione front-end (usa solo HTML e CSS, con un pizzico di JS) che permette
di costruire interfacce molto velocemente. Rilasciato da Twitter nel 2011 ed è infatti molto simile alla grafica di
twitter. Open source. Pensato per essere responsive, punto di forza di bootstrap. È il framework di questo tipo più
usato nel mondo.
Bootstrap da la possibilità di costruire siti complete e interessante, neanche complessi senza scrive una sola riga
di CSS.
PERCHÉ USARLO?
• Accelera lo sviluppo di applicazioni web: è molto rapito
• Responsive e orientato al mobile: permette di ottenere visualizzazioni diverse in base al dispositivo che si sta
usando
• Compatibilità garantita con tutti i browser: se usiamo comando bootstrap si vede d’appertutto
• Estensibile (temi)
• Non serve scrivere una riga di JS o CSS
• Documentato e supportato
INCLUDERE BOOTSTRAP
per poter usare bootstrap, vanno inserita questa CDN nella head di HTML:
OGGETTO CONTENITORE
Bootstrap= è elenco di classi che noi passiamo ad un oggetto. È un elenco di classi che noi possiamo usare
all’interno del nostro sito.
Il contenitore è quello dentro cui dobbiamo mettere il resto. Noi dobbiamo sempre avere un div, che è il nostro
contenitore. Ne abbiamo di due tipi di contenitore:
- Larghezza fissa: container. Container è una classe che da una larghezza massima al sito.
<div class="container">
<h1>This is a simple HTML + CSS template!</h1>
</div>
La prima da applicare è container o container-d che possiamo dare al nostro div più grosso per capire se il nostro
sito a una larghezza fissa (container) oppure si espande in base allo schermo (container fluid).
GRID SYSTEM
Una cosa molto importante di bootstrap è il sistema di griglie (grid system) basato su flexbox.
Ogni oggetto è idealmente diviso in 12 colonne (innestabili) e noi stabiliamo ogni volta quante colonne volgiamo
che un div, pezzo di testo, immagine, ...occupi. Es questo oggetto occupa 3 colonne e questo 9 colonne. ogni
oggetto a cui volta è suddivisibile in 12 colonne.
Figura 1: esempio grid system. La prima riga sono 12 celle da uno, la seconda sono
6 celle da 2, poi una cella da 4 e una da 8...posso sommare le celle come più mi
piace, l'importante è che la somma sia 12
BREAKPOINT
Servono per la responsivness. Ci sono 6 break points* che vanno bene per la maggior parte dei dispositivi XS,
SM, MD, LG, XL, XXL, non è obbligatorio usarli tutti, ma anche solo i 3 centrali. Funzionano un po' come @media:
in base al breakpoint selezionato le regole grafiche saranno diverse. Se lo schermo è più piccolo del breakpoint
messo, tutte le colonne andranno ad occupare 12 colonne.
Figura 2: quando vogliamo fare un sito internet abbiamo delle classi che possiamo usare.
Quando mettiamo per esempio .col- classe per indicare le colonne senza mettere nessun
suffisso, questa cosa vale sempre anche per i dispositivi extra small. Se mettiamo un
suffisso come sm, md, lg, xl o xxl noi diciamo che sovrascriviamo quella classe per quando il
display supera una certa dimensione. Noi abbiamo sempre 12 colonne. Se vogliamo che un
componente occupi tutto lo schermo dobbiamo dirgli che occupa 12 colonne: col-12. Se
invece vogliamo ci siamo 2 colonne da 6 mettiamo col-6 e col-6
ADATTABILITÀ
• Quando lo spazio esaurisce (finiscono le 12 colonne a disposizione) il blocco viene spostato in basso (wrap)
• Per indicare velocemente il numero di colonne, usare .row-cols-[N].
DISPLAY
• Classi .d-[breakpoint]-[value] o .d-[value]
• Value è uno dei valori del CSS display (block, inline, ecc.)
• I valori si possono comporre per visualizzare determinati contenuti solo su alcuni dispositivi
• Esiste .d-print-[value] per la stampa
d-breakpoint = se voglio vederla sempre
d-none=se una cosa non voglio vederla mai
d-breakpoint-none= se una cosa voglio che scompaia per solo per un tipo di dispositivo.
Esempio:
<div class="container">
si vede quando è piccolo <!--uno l'ho vedo quando schermo più piccolo del medium-->
si vede quando è grande <!--due l'ho vedo quando schermo più grande del medium-->
</div>
<div class="col">
3 of 3
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col">
1 of 2
</div>
<div class="col">
2 of 2
</div>
</div>
<div class="row">
<div class="d-none d-sm-block col"> <!--si vede quando è small-->
1 of 3
</div>
<div class="d-none d-md-block col"> <!--si vede quando è medium-->
2 of 3
</div>
<div class="col"> <!--nessuna limitazione sul display-->
3 of 3
</div>
</div>
</div>
SPACING (GLUTTER) (spazio tra le colonne. colonne non sono attaccate ma di default uno spazio loro. per
modificarlo posso settarlo con property - lato - dimensione)
[property] [size]
esempio:
<div class="container">
<div class="row">
<div class="col py-md-5">
1 of 2
</div>
<div class="col p-3">
2 of 2
</div>
</div>
</div>
ALLINEAMENTO VERTICALE
• Si inserisce sul div con class row
• align-items-start (all’interno tutti i suoi elementi iniziano dall’alto) , align-items-center (elementi centrati),
align-items-end (elementi allineati in basso)
• align-self-start, align-self-center, align-self-end -->questi comandi gli do al singolo elemento.
Esempio:
<div class="container">
<div class="row"style="height: 200px">
<div class="col align-self-start">
1 of 3
</div>
<div class="col align-self-center">
2 of 3
</div>
<div class="col align-self-end">
3 of 3
</div>
</div>
</div>
Padding= margine
ALLINEAMENTO ORIZZONTALE
• Si inserisce sul div con class row
• justify-content-start, justify-content-center, justify-content-end
• justify-content-around, justify-content-between
OFFSET
• Si usa per lasciare uno spazio grande quanto una cella
• Utilizza la classe offset-[breakpoint]-[size]
<div class="container">
<div class="row" p-3>
<div class="col offset-3"> <!--3 casello occupate da offset mentre le altre 8 dalle celle-->
1 of 3
</div>
<div class="col">
2 of 3
</div>
<div class="col"> offset
3 of 3
</div>
</div>
</div>
md=maggiore/uguale di
TESTO
• Tag h1, …, h6 (e classi .h1, …, .h6)
• text-muted per il titolo secondario, lead per titoletto
esempio <h2 class=“text-muted”> Testo </h2> (testo in grigino rispetto ad un h2 normale)
esempio <h2 class=“text-lead”> Testo </h2> (testo in grigino rispetto ad un h2 normale)
• display-1, …, display-6
Esempio: <div class=“display-3”> Testo </div>
• Classe img-fluid per immagini grandi responsive (l’immagine scala sul suo contenitore)
• Classe img-thumbnail per fare thumbs di 200px
• Classi float-left e float-right per allineare a sx e dx (anche float-[breakpoint]-[where])
• Classe clearfix per azzerare i float
• Classe rounded per fare gli angoli arrotondat
FIGURE
• Sono come le immagini, ma complete di caption (caption si sposta con immagina, quando sposto un
immagine sposta anche caption)
• Classi figure , figure-img e figure-caption
<figure class="figure">
<img src=". Indirizzo immagine.." class="figure-img img-fluid rounded" alt=".titolo per cechi..">
</figure>
TESTI E SFONDI
TABELLE
Esempio: https://jsfiddle.net/tfwynuke/
BORDI
BOTTONI (Buttons · Bootstrap (getbootstrap.com) (se do classe btn diventa bottone anche con div: esempio:
Questo è un <a href =“” class=“btn btn-primary”> link </a> → link diventato bottone e mi da tutte caratteristiche del bottone
hover compreso
• Dimensione: btn-sm e btn-lg: bottoni si possono fare piccolo o grossi Questo è un <a href =“” class=“btn btn-lg
btn-primary”> link </a>
• Active state: active
• Bottoni block (a tutta larghezza) <a href =“” class=“btn btn-block btn-lg btn-primary”> link </a
• Disabled state: attributo disabled: <input type=“sumit” value=“Invia” class=“btn btn warning” disable/>
• l’oggetto button è provvisto anche di JS per l’uso come input checkbox o radio
FORM
• Bootstrap offre molti strumenti per form “belli”
• Label e input sono raggruppati tramite class form-group
• input, textarea e select: usano la classe form-control
• Per i file: form-control-file
• Dimensione: form-control-lg e form-control-sm
<form class="p-3">
<div class="form-group">
<label for="mytext"> Il mio testo </label>
<input placeholder="Inserisci il testo" id="mytext" type="text"
class="form-control"/>
<small class="form-text text-muted"> Scrivi qualcosa </small>
</div>
</form>
form-text: testo piccolino all’interno di una pagina. Es messaggio errore quando non si compila una casella.
CHECKBOX E RADIO
FORM GRID
https://jsfiddle.net/wx3qLufp/
https://jsfiddle.net/5n1cv6pq/
MENU E NAVIGAZIONE
<nav class="navbar navbar-expand-md navbar-light bg-light"> <!--creo oggetto nav, tag HTML per fare i menù
classe principale è navbar che permette di creare la barra di navigazione. Con navbar-expand-md gli stiamo
dicendo qual'è breakpoin in cui componenti cambiano disposizione (da tutti su una linea a menù) navbar-light gli
diciamo che vogliano colore chiro, bg-light è lo sfondo. se la volgio scura basta sostituitr navbar-light e bg-light
con navbar-dark bg-dark-->
INPUT GROUP
• È un add-on che si aggiunge prima o dopo un input
• Si usa la classe input-group
• Dimensioni: input-group-sm e input-group-lg
• Prima: input-group-prepend
• Dopo: input-group-append
• Testo: input-group-text
https://jsfiddle.net/kn6e2q59/
CARD: https://getbootstrap.com/docs/5.3/components/card/
PLACEHOLDER
• Servono durante il caricamento asincrono
• Basta mettere la classe placeholder
ICONE
Inserire nella parte HTML, in head questa parte di codice sotto, per poter utilizzare le icone
cdn.jsdelivr.net/npm/[email protected]/
font/bootstrap-icons.css">
ALTRE AMENITÀ
• Alert: stilizzazione che posso fare con bootstrap di messaggi che posso far comparire all’interno della
pagina. Messaggio che compaia o scompaia va fatto con Java
• Badge: etichette che posso mettere affianco ad una scritta
• Breadcrumb: briciole all’interno del sito per far capire dove sono
• Card:
• Carousel: elenco di immagini che può essere sfogliato automaticamente dopo un certo tempo oppure con
dei tastini. Si usa classe carusel. Posso metterci anche pallini sotto per far saper a quale immagine sono
• Collapse: permette ai menù di comparire quando ci clicco sopra. Può essere usato con qualsiasi oggetti.
• Dropdown: menù a tendina. Compaiono al click di un pulsante
• Jumbotron: template per creare una sorta di homepage. Può essere fluido o larghezza fissa
• List group: elenchi che possono avere varie sottoclassi
• Modal: finestrelle che posso comparire per segnale qualcosa all’utente
• Nav: oggetto generico che può essere inserito all’interno della pagina
• Pagination: tasti di paginazione
• Popover: oggetti che compaiono quando clicco da qualche parte
• Progress: barra di scorrimento. Ci sono anche quelle animate
• Scrollspy: quando io scorro mi scorre anche il menù relativo
• Tooltips: compaiono quando passo sopra un oggetto senza cliccarlo
JAVASCRIPT (https://it.javascript.info/)
COSA È JAVASCRIPT?
• Linguaggio di programmazione di alto livello (non dipende dall’ambiente di esecuzione)
• HTML, CSS, JS sono le tre tecnologie più importanti per lo sviluppo di applicazioni web
• È eseguito client-side su tutti i browser
o Interagisce tramite eventi del browser generati dall’utente
o Può modificare la struttura e il contenuto della pagina
STORIA DI JAVASCRIPT
• 1995: Brendan Eich per Netscape Communications crea un prototipo di linguaggio (LiveScript) per integrarlo
in Netscape Navigator. Inizialmente si chiama LiveScript. Cambia in JavaScript per marketing perché
linguaggio Java diventava molto popolare
• 1996: re-ingegnerizzato da Microsoft per IE3 (internet explorer 3) con nome JScript.
• 1997-1999: standardizzazione del linguaggio sotto il nome di ECMAScript
• 2005-2006: Ajax, Comet
• 2009-presente: Nuove versioni (ES5, ES6)
DICHIARARE JAVASCRIPT
• Inline: direttamente in HTML usando il tag <script> </script> (esempio sopra di Javascript)
• In un file separato, mettendo in head di HTM:
<script src=“main.js”></script>
• Generato da un framework (per es.Vue)
CARATTERISTICHE DI JS
• Linguaggio interpretato:
o Vengono eseguiti i comandi nell’ordine di dichiarazione
o Interprete incluso nel browser che legge codice riga per riga e trasforma il codice nel formato della
macchina e lo esegue
o Errori nel codice si trovano durante l’esecuzione
o L’esecuzione inizia subito dopo il caricamento della pagina
o Può interpretare sé stesso
eval('document.write("Ciao Ciao")'); //cambia contenuto pagina e scrive ciao ciao. Eval indica all’interprete di
eseguire qualsiasi codice che venga passato anche in modo dinamico.
Affianco al linguaggio interpretato in genere troviamo anche il linguaggio compilato. Linguaggio compilato:
SINTASSI DI JAVASCRIPT
INPUT/OUTPUT DI JAVASCRIPT
Input
Output
• prompt() e alert() funzioni predefinite. prompt() usato per chiedere input o visualizzare un messaggio
• console e document oggetti predefiniti. Console non è visibile all’utente finale, vede solo programmatore.
document.write: modifica direttamente il BODY della pagina, sovrascrive tutto il contenuto della pagina
STRUTTURA DI UN PROGRAMMA
• Sequenza di “statement”:
o Dichiarazione di una variabile: let valore = ‘Ciao’; (con let inizializzo una stringa)
o Dichiarazione di una funzione: function myFunction() { console.log('my func'); }
o Chiamata di una funzione myFunction(); allert(), prompt()
o Stratement di controllo flow: if, switch, for, while
ESPRESSIONI:
• Tipi di dato:
o Booleano: true, false
o Numerico: 1, -100, 3.14, 123e4, Nan, Infinity, -Infinity
o Stringhe: “my string”, “str”, ‘l\’apostrofo’, `I am a ${variable} inside` (ES6)
o Valore vuoto: null, undefined
• Variabili:
o Riferimento a una variabile: 100 + myVar
• Funzioni:
o Esecuzione di una funzione: 100 + myFunction()
o Attenzione! 100 + myFunction() non è come 100 + myFunction
STRINGHE
• Tra apici: 'questa è una stringa'
• Tra virgolette: "questa è una stringa"
• Tra backtick: `questa è una stringa
• I primi due sono equivalenti (ricordarsi di usare backslash per fare escape, qualora serva: 'ce n\'è bisogno')
• Il backtick permette di inserire all'interno della stringa variabili o espressioni.
ESPRESSIONI
Operatori:
• Incremento/decremento: ++,--
‘’ ‘’ 0 FALSE
• Bit a bit:
o AND ( & )
o OR ( | )
o XOR ( ^ )
o NOT ( ~ )
o LEFT SHIFT ( << )
o RIGHT SHIFT ( >> )
o ZERO-FILL RIGHT SHIFT ( >>> )
• Virgola
VARIABILI
Dichiarazione:
Inizializzazione/ binding
• Le variabili dichiarate (anche più volte) con var sono visibili ovunque all’interno della funzione o programma
dove è definita, sia prima sia dopo la dichiarazione (hoisting=abilità variabile anche prima della sua
dichiarazione) (variabile dichiarata con var la vedo d’dappertutto ovunque la dichiari)
• Le variabili dichiarate (una sola volta) con let o const sono visibili solamente all’interno del blocco dove sono
dichiarate, e solo dopo la dichiarazione
(let visibile solo nel blocco dov’è
dichiarato e on al di fuori
• Hoisting
CONTROL FLOW:
• IF
if (condizione) { p }
Il blocco p viene eseguito solo se condizione è vera
Nota. Esiste anche versione inline, l’operatore condizionale
Esempio:
• IF/ELSE
if (condizione) { p1 } else { p2 }
Se condizione è vera, viene eseguito blocco p1, altrimenti viene
eseguito il blocco p2
Esempio:
• IF/ELSE IF/ELSE
if (cond1) { p1 }
else if (cond2) { p2 }
else { p3 }
Se cond1 è vera, viene eseguito blocco p1, altrimenti se è vera
cond2 viene eseguito il blocco p2 altrimenti viene eseguito il
blocco p3 Figuur 7:esempio
ESPRESSIONI
Operatori:
CONTROLL FLOW:
• WHILE
while (condizione) { p }
Il blocco p viene eseguito ripetutamente, ma solo se (e finché)
condizione è vera
Esempio:
• DO WHILE
do { p } while (condizione)
Il blocco p viene eseguito ripetutamente, finché condizione è vera
Nota. Il codice viene eseguito almeno una volta!
Esempio:
• FOR
for (init; cond; update) { p }
1. Prima viene eseguito init (dove viene inizializzato varibiale)
2. Finché cond è vera, viene eseguito p
3. poi update (aggiorno variabile)
4. Tutte le parti sono opzionali (se non metto nessun elemento in for, ciclo
viene eseguito all’infinito
• BREAK
Esce immediatamente da un
ciclo
p eseguito una volta solo,
perché dopo esecuzione p si
trova break;
• CONTINUE:
Passa immediatamente alla prossima iterazione
• SWITCH/CASE
o Senza break continua a eseguire il blocco successivo
o Confronto strict (anche tipo)
o Default è opzionale
• ETICHETTE
Si può assegnare una etichetta a un ciclo, in modo da usare break e continue riferiti a quel ciclo
FUNZIONI UTILI
Numeri:
Stringhe:
• x.length: proprietà che rappresenta la lunghezza. Posso usarla per sapere la lunghezza di una stringa
esempio: ‘aaa’.length → 3
• x.indexOf(y, [pos]): posizione di stringa y all’interno di x [cercando dalla posizione pos] esempio:
‘abcd’.indexOf(‘cd’) → 2, ‘abcd’.indexOf(‘ef’) → -1 (risultato non trovato all’interno di una stringa segnalato
con -1)
‘abcd’.indexOf(‘cd’, 3) → -1
• x.substring(start, end): sottostringa che inizia alla posizione start e finisce prima della posizione end
esempio: ‘Banana’.substring(2,4) → ’na’
• x.substr(start, len): sottostringa che inizia alla posizione start e ha lunghezza len
esempio: ‘Banana’.substr (2,4) → ’nana’
• x.replace(s1, s2): ritorna la nuova stringa che uguale a x in cui s1 è sostituita con s2. Supporta espressioni
regolari
esempio: ‘Banana’.replace(‘na’, ’b’) à ’babna’
‘Banana’.replace(/na/g, ’b’) à ’babb’
• x.charAt(pos): ritorna simbolo nella posizione pos
esempio: ‘Banana’.charAt(1) à ’a’
• x.toLowerCase() / x.toUpperCase(): convertire a minuscolo / maiuscolo la stringaò
esempio: ‘Banana’.toLowerCase() à ’banana’
‘Banana’.toUpperCase() à BANANA
Esercizio1:
<!DOCTYPE html>
<html lang="en">
<head>
<script>
let inputString= prompt("Inserisci la tua stringa"); //leggo la stringa
console.log("Lunghezza della stringa è" + inputString.length); //stampo valore stringa
if(inputString.length <=1){ //se lunghezza stringa è minuto uguale a 1 stampo subito la stringa, perché non c’è nulla da
scrivere
alert(inputString);
}else{ //eseguita solo quando condizione sopra falsa, ovvere quando stringa maggiore di 1
let outputString=''; //stringa vuota dove salvare lettere man mano che faccio for
for (let index=inputString.length-1; index>=0; index--){//meno uno perché stringa parte da 0
outputString= outputString + inputString.charAt(index); //charAt() prendere lettere in una certa posizione
}
alert(outputString);
}
Abc
1 passaggio salvo outputstring ‘c’ preso lettera posizione 2
2 passaggio in outputstring ho c, a cui abbgiungo b, lettera posizine 1
3 passaggiou outputstring ho cb, a cui aggiungi lettera posizione 0 che è a
</script>
</head>
<body>
</body>
</html>
Esercizio2:
switch (nome) {
case "Luke Skywalker":
alert("Ciao Luke!");
break;
case "Obi-Wan Kenobi":
alert("Ciao Master!");
break;
case "Anakin Skywalker":
alert("Ciao padawan, che forza sia con te!");
break;
default:
if (!nome) { //quando premo ok senza inserire nulla nella stringa
alert("Non hai inserito un nome");
break;//ciclo termina qui quando questo if è vero
}
let spacePosition = nome.indexOf(" "); //controllo se c'è uno spazio
if (spacePosition === -1) {
alert("Non hai inserito uno spazio");
break; //ciclo termina qui quando questo if è vero
}/*else{
alert("Bravo hai inserito uno spazio")
}*/
let firstletter = nome.charAt(0); //prendo dalla stringa inserita la prima lettera (posizione 0) e la salvo in una variabile
let secondletter= nome.charAt(spacePosition+1); //prendo carattere dopo lo spazio
if (secondletter === " ") {
alert("Ma dai! Hai messo due spazi!");
break;
}
alert(firstletter+secondletter);
}
INTERAZIONI:
• alert(messaggio): mostra un messaggio e mette in pausa l’esecuzione dello script.
• prompt(messaggio, [default]): mostra un messaggio con un campo di testo e due bottoni ok/cancel. Ritorna
null se è stato premuto cancel.
• confirm(messaggio): mostra un messaggio con due bottoni ok/cancel. Ritorna true o false.
FUNZIONI
• La funzione è un blocco di istruzioni associato a un nome, che realizza un comportamento, prendendo dati in
input e opzionalmente producendo altri dati in output.
• Viene dichiarata nel programma
• Può essere utilizzata (chiamata) quante volte si vuole
• Esistono funzioni pre-definite (es., prompt, alert,
parseInt) e funzioni «custom» (definite dallo sviluppatore)
• Per chiamare una funzione si usa il nome con la lista dei parametri
prodotto(100, 200);
• Se si passano meno parametri, i mancanti vengono assegnati a undefined
• Se si passano più parametri, saranno ignorati
• Attenzione: prodotto(100, 200) è una chiamata di funzione, mentre prodotto è il riferimento alla funzione
come oggetto
• Se viene ri-dichiarata, la variabile esterna viene oscurata e non viene toccata dalla funzione
PARAMETRI
• Ai parametri mancanti viene assegnato undefined
• Operatore ||
• Operatore??
https://it.javascript.info/function-basics
OGGETTI
• Struttura che rappresenta una collezione di proprietà
• Ogni proprietà ha un nome (chiave)
• Ogni proprietà può avere un valore
• Si possono avere proprietà di tipo diverso
• Le proprietà si richiamano con il punto o le parentesi quadre
• Le proprietà possono essere stringhe complesse, ma vanno inserite tra virgolette (e richiamate con le
quadre)
• Per comodità, si può lasciare la virgola dopo l’ultima proprietà
OGGETTI
LOOP SU OGGETTI
Esiste un ciclo “for ... in”, diverso da “for(;;)”, che attraversa tutte le chiavi di un oggetto.
ESISTENZA
• L’operatore “in” può essere usato per verificare se una certa chiave esiste in un certo oggetto.
• L’operatore “in” restituisce true quando la proprietà esiste, anche se è valorizzata come undefined o null
JSON
ARRAY
• Struttura dati che rappresenta una sequenza di valori
• Finita (ha una lunghezza, “length”)
• Ordinata (ogni elemento è associato al suo indice)
• Gli indici partono da zero
• Sono oggetti (le chiavi sono gli indici)
ARRAY: METODI
Non cambiano gli indici • array.push(element): aggiunge l’elemento in coda all’array
• array.pop(element): estrae e rimuove l’ultimo elemento dell’array
• array.slice(from, to): restituisce una sottosequenza dall’indice “from” all’indice “to” (se manca “to”, si
intende da “from” alla fine dell’array)
• array.splice(pos, numToDel, elemToIns1, elemToIns2, …): rimuove elementi da un array e ne inserisce altri
o pos: posizione dove fare la modifica
o numToDel: quanti elementi da rimuovere
o elemToIns1, …: nuovi elementi da inserire in quella posizione
• array.sort(sortFunction): Ordina elementi seguendo l’ordine stabilito dalla funzione sortFunction che:
o Prende come input due valori
o Restituisce un numero negativo, 0, o un numero positivo se il primo valore è «minore», «uguale», o
«maggiore» del secondo valore, rispettivamente
JAVASCRIPT/DOM
DOM:
• HTML si occupa dei dati da visualizzare all’interno delle pagine
• JavaScript si occupa di aggiungere dinamismo a questo contenuto
• Il DOM (document object model) fa da collegamento tra i due mondi
• Trasforma il documento in un modello a oggetti
Il DOM usa una serie di istruzioni di JS per dominare l'html, trasforma il documento html in un modello ad albero
di oggetti I nodi di quell'albero. I nodi gialli rappresentano i tag, mentre i verdi il contenuto (i blocchi sotto a quelli
gialli) e gli "a capo" \n, ovvero la separazione tra i vari tag (a fianco dei nodi gialli). Ciò che è sulla stessa linea è a
pari livello, ciò che sta sotto è un figlio di ciò che sta sopra. Il nodo padre è document. Possono avere un id
universale, una classe, ecc. Ci sono una serie di funzioni JS per gestire quei nodi
INTERAZIONI JS-DOM
DOM
SELEZIONARE ELEMENTI
(https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_document_queryselectorall_class)
Metodo Descrizione
MODIFICARE ELEMENTI
Proprietà Descrizione
Metodo Descrizione
CAMBIARE UN ATTRIBUTO
https://www.w3schools.com/js/tryit.asp?filename=tryjs_dom_image
CAMBIARE UNO STILE
https://www.w3schools.com/jsref/dom_obj_style.asp
https://www.w3schools.com/js/tryit.asp?filename=tryjs_change_style
https://www.w3schools.com/js/tryit.asp?filename=tryjs_dom_color2
FUNZIONI SU EVENTI
https://jsfiddle.net/0gdyn3w4/3/
AGGIUNGERE EVENTI
document.getElementById("button").addEventListener("click", pippo);
RIMUOVERE EVENTI
element.removeEventListener("mousemove", myFunction);
ELENCO EVENTI
https://www.w3schools.com/tags/ref_eventattributes.asp
https://www.w3schools.com/js/tryit.asp?filename=tryjs_dom_htmlcollection_loop
COLLEZIONI E NODELIST
https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_htmlcollection_nameditem
• <html> è genitore di
<body> e <head>
• ecc.
• ParentNode
• childNodes[nodenumber] (tutti i nodi figlio)
• children (tutti gli elementi figlio)
• firstChild
• lastChild
• nextSibling
• previousSibling
https://www.w3schools.com/js/tryit.asp?filename=tryjs_dom_nav_innerhtml2
PROPRIETÀ
https://www.w3schools.com/jsref/prop_node_nodetype.asp
https://www.w3schools.com/js/tryit.asp?filename=tryjs_dom_nav_nodetype
https://www.w3schools.com/js/tryit.asp?filename=tryjs_dom_elementremove
https://www.w3schools.com/js/tryit.asp?filename=tryjs_dom_elementreplace
Metodo Descrizione
document.createElement(element) Crea un tag HTML
document.removeChild(element) Elimina un tag HTML
document.appendChild(element) Aggiunge un tag HTML
document.replaceChild(new, old) Rimpiazza un tag HTML
document.write(text) Scrive testo HTML
Evento Descrizione
document.getElementById(id)
Aggiunge un evento
.addEventListener(function(){code})
OGGETTO WINDOW
https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open
OGGETTO SCREEN
https://www.w3schools.com/js/tryit.asp?filename=tryjs_screen_pixelDepth
OGGETTO LOCATION
https://www.w3schools.com/js/tryit.asp?filename=tryjs_loc_assign
OGGETTO HISTORY
• Contiene lo storico del browser (freccette in alto)
• back()
• forward()
ALER, CONFIRM, PROMPT
https://www.w3schools.com/js/tryit.asp?filename=tryjs_prompt
https://www.w3schools.com/js/tryit.asp?filename=tryjs_setinterval2
COOKIES
https://www.w3schools.com/js/tryit.asp?filename=tryjs_cookie_username
EVENTI: https://www.w3schools.com/jsref/dom_obj_event.asp
• addEventListener()
• removeEventListener()
SELEZIONARE ELEMENTI
• getElementById()
• getElementsByClassName()
• getElementsByTagName()
• querySelector()
• querySelectorAll()
NAVIGARE IL DOM
• childElementCount • lastElementChild
• childNodes • parentNode
• children • parentElement
• firstChild • nextSibling
• firstElementChild • nextElementSibling
• hasChildNodes() • previousSibling
• lastChild • previousElementSibling
MODIFICARE IL DOM
• appendChild() • insertAdjacentText()
• cloneNode() • insertBefore()
• insertAdjacentElement() • remove()
• insertAdjacentHTML() • replaceChild()
MODIFICARE UN ELEMENTO
• innerHTML
• innerText
• outerHTML
• outerText
PROPRIETÀ DI UN ELEMENTO
• Attributes • nodeType
• classList • nodeValue
• className • removeAttribute()
• hasAttributes() • setAttribute()
• id • style
• nodeName
JQUERY CDN
Inserire nella parte di HTML, nel tag head o in fondo
<script src=“https://code.jquery.com/
jquery-3.7.1.min.js"></script>
VANTAGGI DI JQUERY
• Separa molto bene il codice dalla visualizzazione
• Usa i selettori CSS
• Moooooooolto più semplice e veloce di JS puro
• Elimina i problemi di compatibilità tra browser
JS PURO VS JQUERY
https://jsfiddle.net/qd9p0m31/
COSA FA JQUERY
• Seleziona elementi del DOM in base a selettori CSS (senza differenze tra uno o molti)
• Applica proprietà a tutti gli elementi selezionati
• Crea, modifica, elimina elementi del DOM
• Definisce eventi
• Ha semplificato le chiamate asincrone (prossima lezione )
L SELETTORE JQUERY ()
• Viene usato per selezionare qualsiasi cosa
• Si può abbreviare con la funzione $()
• $(document): è la ready-function
• $(selector): seleziona elementi in base al selettore CSS
• $(element): seleziona un elemento
• $.function(): esegue la relative funzione di jQuery
• $.fn.function(){}: crea una nuova funzione jQuery
JQUERY(SELECTOR)
https://jsfiddle.net/o8y1bw93/4/
JS VS JQUERY
• document.getElementById(“pippo”) == $(“#pippo”) falso
• document.querySelectorAll(“p”) == $(“p”) falso
• document.getElementById(“pippo”) == $(“#pippo”)[0] vero
• document.getElementById(“pippo”) == $(“#pippo”).get(0) vero
• document.querySelectorAll(“p”)[0] == $(“p”)[0] vero
READY-FUNCTION
https://jsfiddle.net/nx2fjgoz/2/
JQUERY CHAINING
https://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_chaining2
Esempio:
FILTRARE
https://jsfiddle.net/4fq65u3n/1/
Metodo Descrizione
Metodo Descrizione
text([text]) Restituisce tutto il testo o imposta il testo di ogni elemento del set
USARE GLI ATTRIBUTI
Metodo Descrizione
.hasClass(cname) Determina se gli oggetti del set hanno una determinata classe
DIMENSIONI
Metodo Descrizione
Metodo Descrizione
EVENTI
JS puro
document.getElementById("button").addEventListener("click", pippo);
vs
jQuery
$(“#button”).on("click", pippo);
$(“#button”).click(pippo);
EFFETTI
• jQuery include alcuni effetti comodi per visualizzare e nascondere oggetti
• In tutti i casi si può assegnare un tempo, che può essere “slow”, “fast” oppure una durata in millisecondi
• Nelle catene di metodi, gli effetti vengono fatti uno dopo l’altro (sono quindi sincroni) •
• Gli effetti sono asincroni rispetto al resto del codice (a meno che non si riferiscano a un medesimo oggetto)
SHOW/HIDE
https://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_hide_show
FADING
https://www.w3schools.com/jquery/jquery_fade.asp
SLIDING
https://www.w3schools.com/jquery/jquery_slide.asp
ANIMAZIONI
https://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_animation1_multicss
• Il metodo animate() accetta un JSON con tutti i valori CSS da modificare per l’animazione
• Il secondo parametro indica la durata
• Possono essere inseriti valori relativi (+= o -=)
• Possono essere usati valori “show”, “hide”, “toggle”
• Si possono aggiungere opzioni per controllare più in dettaglio l’animazione (per esempio progress)
• jQuery.each(): esegue un ciclo su qualsiasi cosa per cui abbia senso avere un ciclo (oggetto jQuery, array,
ecc.)
• jQuery.extend(): fonde due JSON in uno (il primo)
• jQuery.fn.extend(): aggiunge una funzione a jQuery
• jQuery.globalEval(): esegue codice JS in una stringa
• Query.grep(): filtra una lista in base a una condizione
• jQuery.inArray(): verifica se un determinato valore è contenuto in un array (e restituisce l'indice, -1 se non
c'è)
• jQuery.makeArray(): costruisce un array a partire da un qualsiasi oggetto array-like
• jQuery.get([i]): prende l'elemento i-esimo della lista, oppure restituisce un array con tutti gli elementi
• jQuery.map(): applica una funzione a un array di valori
• jQuery.merge(): fonde due array in uno (il primo)
• jQuery.noop(): è una funzione che non fa nulla
• jQuery.now(): fornisce il timestamp attuale
• jQuery.trim(): elimina gli spazi all’estremità di una stringa
• jQuery.type(): determina la classe di un oggetto
• jQuery.unique(): elimina i duplicati da un array di elementi del DOM
• jQuery.uniqueSort(): elimina i duplicati da un array di elementi del DOM e li ordina
UTILITY DI PARSING
• jQuery.parseHTML()
• jQuery.parseJSON() (deprecated) [usare JSON.parse]
• jQuery.parseXML()
JAVASCRIPT AVANZATO E FORM HTML
JAVASCRIPT AVANZATO
EVENT OBJECT
• È l’oggetto di JavaScript che gestisce tutti gli eventi
• Contiene tutte le informazioni utili per gestire l’evento
• Ce ne sono di molti tipi
• Evento hanno una sorta di gerarchie e alcune proprietà vengono ereditate.es ho un evento di tipo mouse
event sicuramente avrà una coordinata x/y su cui ho cliccato. E in base al click avrò informazioni diverse, per
capirlo mi aiuta java.
• Viene ereditato dagli oggetti padre
• Eventi sono quelli oggetti di javascript che permettono un interazione con l’utente. Quando utente clicca su
un punto della pagina scatena un evento che può essere intercettato da un codice java.
• Evento scatenato quando utente fa qualcosa
LISTA EVENTI
https://www.w3schools.com/tags/ref_eventattributes.asp
GERARCHIA EVENTI
https://www.w3schools.com/jsref/obj_events.asp
• MouseEvent
• DragEvent
<body>
<h1 id="titolo">Ciao</h1>
<script type="text/javascript">
document.getElementById("titolo").onclick = function (e) {
alert("Ciao");
};
</script>
</body>
BUBBLING:
https://jsfiddle.net/sk48jdfp/
Esempio:
Se nel codice soprastante io clicco su P, scateno evento click di P che però il click si
propagherà anche al div e poi al form. (scatena eventi dal più interno al più esterno).
Bubbling funziona all’inverso rispetto agli oggetti innestati
METODI/PROPRIETÀ DI EVENT
https://jsfiddle.net/sk48jdfp/9/
https://www.w3schools.com/jsref/obj_events.asp
Nome Descrizione
True/False (è un bubbling event?) Mi dice se ho cliccato su
bubbles
oggetto o su un figlio di quel oggetto
cancelBubble Imposta o interroga se l’oggetto deve propagare l’evento
Se clicco: avrò alert e poi evento non viene propagato Se clicclo: non visualizza alet ma propagazione evento
fermata subito
TARGET E CURRENTARGET
https://plnkr.co/edit/eiVixZwxlxFG9dyx?preview
STOP BIBBLING
CAPTURING
Il capturing va dall’esterno verso l’interno. Opposto del bubbling.
Quando un evento voglio catturarlo nella fase di andata. Il capturing
è il contrario del bubbling: quando un utente clicca su un oggetto, è
possibile intercettare il click prima che arrivi al target.
• Usato raramente
• Per gestirla basta aggiungere un secondo parametro ad
addEventListener(): capturing:true
CONSOLE
La console serve per fare debug delle applicazioni e deve essere abilitata sul browser (altrimenti non si vede)
METODI DI CONSOLE
https://jsfiddle.net/ejkavyun/
Nome Descrizione
IL TAG <FORM>
Serve per creare un nuovo form:
</form>
Method: GET (opzioni lascia campi visibili nell’URL) o post (invia dati al serve, non vengono visualizzati nell’URL)
ATTRIBUTI DI <FORM>
Attributo Descrizione
INPUT TESTUALE
• Campo testuale di una sola linea
Per es. per nome/cognome o per la ricerca su web. Si usa il tag <input> (è un tag singolo, non ha apertura e
chiusura)
• Password
È un caso particolare del campo precedente, ma l’input e nascosto all’utente. Si usa sempre <input>
type=password: testo digitato non viene visualizzato dall’utente
• Campo di testo multi-linea
Si usa per lunghi testi (per esempio articoli di blog). Il tag è <textarea>
ATTRIBUTI DI <INPUT>
https://www.w3schools.com/html/tryit.asp?filename=tryhtml_elem_input
Attributo Descrizione
maxlength Numero massimo di caratteri che si possono inserire (ma va ricontrollato anche nel backend)
ATTRIBUTI DI <TEXTAREA>
https://www.w3schools.com/html/tryit.asp?filename=tryhtml_elem_textarea
Attributo Descrizione
CHECKBOX
• Si usa sempre il tag
• Indica una scelta multipla in cui sono selezionabili più opzioni
RADIO BUTTON
• Si usa il tag
• È una scelta multipla in cui solo una opzione è selezionabile
LABEL
• Si usa per dare un'etichetta a un elemento di form (in modo che cliccando sull'etichetta il focus vada
sull'elemento)
• Tag
• Attributo for, dove si inserisce l'ID dell'elemento
<INPUT> CHECKBOX/RADIO
https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_input_type_checkbox
Attributo Descrizione
value Il valore che verrà inviato quando la checkbox/radio è selezionata (default on)
https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_input_type_checkbox
FILE UPLOAD
Attributo Descrizione
type “file”
BOTTONI <INPUT>
Type Descrizione
CAMPI NASCOSTI
• si usa il tag <input>
Attributo Descrizione
type “hidden”
value valore
<SELECT>
https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_select
esempio:
<SELECT>
Attributo Descrizione
<OPTION>
Attributo Descrizione
selected Se impostato a “selected”, indica che l’opzione è selezionata all’apertura della pagina
ELEMENTO <BUTTON>
• Definisce un bottone (come <input type=“button”);
• Va gestito con JavaScript
ELEMENTO <DATALIST>
• È una aggiunta al tag
• Fornisce un elenco di scelte che compaiono quando si digitano le prime lettere
• Nel tag <input> l'attributo list indica l'ID del <datalist> da utilizzare
Esempio:
VALIDAZIONE
• Introdotta con HTML5
• Velocizza il lavoro di programmazione
• Tutto andrà comunque validato in backend!
CAMPO OBBLIGATORIO
Esempio: se premo submit, mi dice che devo riempire il campo, senza aver scritta una riga di java
<label for="username">Username:</label>
<input type="text" id="username" name="username" required>
<input type="submit">
ALTRE PROPRIETÀ
• autocomplete: dice al browser se suggerire contenuti immessi in precedenza (auto completamento). Valori
ammessi: on/off. Suggerimenti in base a quello che avevo messo prima.
• autofocus: Il campo è selezionato al caricamento della pagina
• disabled: Il campo è disabilitato (grigio)
• placeholder: Un testo riempitivo quando il campo è vuoto. Testo in grigio che compare prima di completare
casella. Appena clicco su casella per riempirla scompare
• readonly: Rende il campo di sola lettura
JAVASCRIPT AVANZATO
API
L’api sono dei modi in cui un applicazione si interfaccia con il resto del mondo. È un modo di comunicare, è
l’aspetto che ci permette di comunicare con backend.
ESEMPI DI API
• Meteo
(per ottenere informazioni sul tempo)
• Google Maps
(per inserire le mappe sul proprio sito)
• Twitter/X
(per pubblicare autonomamente)
COME FUNZIONA
1. Viene fatta la richiesta (client)
2. Richiesta: è un URL (dove si trova il
Dipartimento di Psicologia e Scienza
Cognitive)
3. Server (es Twitter, Google Maps)
4. Risposta (Lat 45.8936892…risposta è un
json)
Esempio:
richiesta: http://maps.googleapis.com/maps/api/geocode/json?
NB: Ajax è asincrono, cioè sito manda richiesta al server, io intanto faccio altre cose poi quando arrivare la
richiesta ne farò delle altre. Sito funziona mentre sto facendo un richiesta. Esso permette di caricare pezzi di
pagina (e quindi di non ricaricarla tutta). Non interrompe l’esecuzione del resto del codice nell’atteso dei dati. Di
solito viene dato feedback all’utente per dirgli che qualcosa sta cambiando e di solito si usa lo spinner. Ho un
interfaccia utente che carico una sola volta (grafica) tutti i pezzetti che vengono cambiati vengono fatti da AjaX.
VECCHIO PARADIGMA
NUOVO PARADIGMA
Ho interfaccia utente che
carico una volta sola. Quindi
prima cosa che chiedo al
server: dammi la grafica. Poi
tutte le cose capitano in
mezzo le fa Ajax, cambiano
solo i pezzettini che servono
cambiare.
VANTAGGI:
- Risposta più veloce alle richieste
- Miglior esperienza utente: perché non ricarica tutta la pagina
- Traffico rete ridotto
SVANTAGGI:
- Inutilità di tasti avanti/indietro/bookmark
- Bisogna gestire la navigazione (tasti avanti/indietro/bookmark) (in vue la fa vue-router o fi fa
manualmente con la history)
- Richiede JavaScript
- Attenzione all’indicizzazione dei motori di ricerca: motore di ricerca deve trovare contenuto della pagina.
Deve capire se ho un'altra pagina o la stessa di prima
AJAX E JQUERY
• jQuery ha semplificato l’interazione con XMLHttpRequest
• Unico comando $.ajax({ settings }); ($ indica JQuery)
• Esiste anche il comando nativo JS fetch(), introdotto di recente
$.ajax()
https://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajax_async
Setting Description
Method Description
Funzione lanciata prima dell’esecuzione. (prima di
beforeSend
lanciare la funzione fai questo)
Funzione lanciata al termine dell’esecuzione
(qualunque cosa accada falla)(esempio parte
complete
chiamata Ajax e parte spinner e spinner una volta
terminata la richiesta va tolto)
Funzione lanciata quando accade un errore.
error
Richiesta non andata a buon fine
Funzione lanciata quando non accade un errore.
success
Richiesta andata a buon fine
Setting Description
PROMISE: quando faccio una chiamata jAjax mi viene fornito un oggetto che si chiama promise. In pratica io gli
dico fammi questa richiesta e mettimela in una variabile x che è una promessa. Promessa x ad un certo punto
verrà eseguita e verrà eseguita con then() (success) o nel catch se c’è un errore, se metto un altro then() è il
complite
https://jsfiddle.net/sc8qd614/1/
ASYNC/AWAIT
https://jsfiddle.net/sc8qd614/7/
AXIOS
• Libreria che gestisce solamente le connessioni asincrone
• Più snella di jQuery e più completa di fetch()
• Al posto di $.ajax() si usa axios()
• Restituisce una Promise
• Axios CDN: <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
• Axios è usato nello sviluppo web per interagire con le API
Setting Description
GET (quando chiedo un informazione. Mi aspetto che da qualche parte vengano salvati) POST (invio informazione.
No salvati)
Setting Description
Funzione da eseguire se la richiesta va a buon fine (e in ogni caso se successivo
then()
al catch()) (success)
catch() Cattura gli errori, richiesta non va a buon fine (errore)
AXIOS RESPONSE
Setting Description
ALTRO SU AXIOS
• Esistono funzioni specifiche (axios.get(), axios.post(), ...)
• axios.all(): esegue richieste multiple in contemporanea
• axios.create(): crea un'istanza con valori riutilizzabili
• axios.defaults: imposta i valori di default
LINK UTILI
• https://jquery.com/
• https://javascript.info/async-await
• https://www.html.it/pag/65391/promise-native/
• https://github.com/axios/axios
• https://www.html.it/pag/66525/fetch-api/
OGGETTI
• Le proprietà possono essere stringhe complesse, ma vanno inserite tra virgolette (e richiamate con le
quadre)
• Per comodità, si può lasciare la virgola dopo l’ultima proprietà
THIS
• Fa riferimento all’oggetto in cui viene usato:
o Nel caso del metodo: oggetto nel quale il metodo è dichiarato
o Nel caso di funzione: oggetto globale
o Nel caso di evento: elemento DOM che riceve l’evento
• Attenzione alle funzioni callback: “this" fa riferimento all’oggetto dove viene eseguito!
• obj.printme viene applicato all’oggetto $(button) e non all’oggetto obj
• Usare bind per associare l’esecuzione al metodo specificato
GESTIONE ERRORI
• Errore: situazione anomala rispetto all’esecuzione del programma
o Accesso ai campi di oggetti non inizializzati
o Chiamate dei metodi non esistenti
o Eccezioni generati intenzionalmente (es., risultato di validazione di qualche input)
DATA E ORA
• In JavaScript è rappresentata dal tipo Date
• Internamente salvato come millisecondi da 01/01/1970
• Diversi modi per creare oggetto data:
o new Date(): data / ora corrente
o new Date(year, month, day, hours, mins, secs, millis)
o new Date(millis):millisecondi dal 01/01/1970
o new Date(stringFormat): dalla stringa che rappresenta la data/ora [month va da 0 a 11]
• new Date(stringFormat): dalla stringa che rappresenta la data/ora
• Data ISO: YYYY-MM-DD (2020-04-08)
• Data / Ora ISO: YYYY-MM-DDTHH:mm:ss.sssZ
Esempi:
2020-04-08T09:00:00.000
2020-04-08T09:00:00.000+02:00 (Rovereto)
2020-04-08T09:00:00.000-07:00(LosAngeles)
• Altri formati: dipende dal browser
• get/set
o FullYear
o Month (0-11)
o Date (giorno del mese, 1-31)
o Day (giorno del mese, 0-6)
o Hours
o Minutes
o Seconds
o Milliseconds
• getUTC / setUTC
• Formattazione
o toDateString(): ’Fri Apr 10 2020’
o toISOString(): ’2020-04-08T12:00:00.000Z’
o toUTCString(): ’Wed, 08 Apr 2020 21:23:00 GMT’
o toTimeString(): ’23:24:34GMT+0200 (Central European Summer Time)’
o toLocaleString(): ’08/04/2020, 23:25:51’
o toLocaleDateString(): ’08/04/2020’
o toLocaleTimeString(): ’23:25:51’
FRAMEWORK
https://moment.github.io/luxon/
HISTORY
• Oggetto introdotto con HTML5
• È una "pila" di pagine
• Viene popolata di informazioni quando l'utente naviga
• I tastini "indietro" e "avanti" sul browser navigano le pagine della pila
• Può essere usato all'interno del medesimo dominio
METODI DI HISTORY
Metodo Descrizione
LOCATION
• Oggetto JavaScript per ottenere informazione sull'URL della pagina corrente
• L’evento “popstate” serve per intercettare il cambiamento di location (quando l’utente digita un nuovo
indirizzo oppure fa avanti/indietro con la history)
PROPRIETÀ DI LOCATION
Proprietà Descrizione
METODI DI LOCATION
Metodo Descrizione
Single-page-application: un unico oggetto all’interno del quale vengono cambiati i dati senza dover ricaricare la
pagina. Questo lo faccio grazia a JavaScript che cambia la formazione della pagina e Ajax che è dedicato al
caricamento dei contenuti senza dover ricaricare la pagina. I contenuti arrivano dal server che carica solo gli
aspetti che servono.
• Single-Page Application
o Applicazione Web (solo front-end) che interagisce con utente cambiando il contenuto della pagina
senza ricaricarla
o Interazione più fluida e veloce
• Grazie a
o JavaScript: cambiamento dinamico della pagina
o AJAX: caricamento dinamico dei contenuti
• Oggi qualsiasi app web è fatta così (Gmail, Facebook, …)
• Single-Page Application
o Dinamica: contenuti dal server
• Grazie a
o Caricamento modulare delle pagine e del codice: solo quello che serve e solo quando serve («lazy»)
o Utilizzo di «cache»: si recuperano i pezzi già scaricati e salvati sul computer
o Con gli strumenti di «packaging» moderni, il codice, frammenti HTML, e le librerie sono ottimizzate /
«minimizzate»
o API REST: Application Program Interface REpresentation State Transfer: elenco di strategie/paradigmi
comuni
o API: funzioni messe a disposizione su Internet per trasferire comandi e dati al/dal server. Modo per un
oggetto di comunicare con l’esterno
o REST: utilizzando il protocollo HTTP e i suoi metodi come linguaggio di programmazione
• Single-Page Application
o Responsive
• Grazie a
o HTML5 e CSS: elementi adattivi e stili
o Framework: (es., Bootstrap) realizzazione dei pattern
• Single-Page Application
o Standard UX e UI
• Grazie a
o Material Design: linee guida
o Framework: (es., Boostrap Material, Vue Material, Ionic)
RIFERIMENTI
Parte client è
l’interfaccia
REALIZZAZIONE “CLASSICA”
Infrastruttura:
• Hardware
• OS
• Rete
• Sicurezza
Software:
• Ambiente di esecuzione
• Database
• Servizi (es., code, mail)
Deployment e manutenzione:
• Versioni
• Avvio, problemi, scalabilità
IL CLOUD: con cloud si indicano dei servizi online che fanno cose e una azienda può appoggiarsi a questi servizi
offerti e pagare
• On premises: Livello non cloud. Più flessive e più costoso. Io gestisco tutto
• Infrastructure: livello intermedio: faccio gestire hardware a qualcun’altro
• Platform: gestisco solo applicazione e dati. Caso nel cui chiameremo l’API e useremo quei dati.
Infrastructure e Platform è dove operano gli sviluppatori
• Software: zero flessibilità. Costo più basso. Tutto su cloud (es goolge drive, google document)
ESEMPI SaaS
Storage: Elearning: E-Commerce:
• Dropbox • Classroom • BigCommerce
• Google Drive • WooCommerce
• One Drive Payment:
• iCloud
• PayPal
Document Management: • Nexi
• MS Office 365
• Google Suite
IaaS E PaaS
• IaaS: Infrastructure-as-a-Service
o Risorse per realizzare e gestire tutta la mia applicazione
o Macchine virtuali e la rete
• PaaS: Platform-as-a-Service
o Risorse per configurare e eseguire singoli task / elementi della mia applicazione
PaaS
• Database
• Gestione utenti, autenticazione, sicurezza
• Gestione file e multimedia
• Invio mail
• Invio notifiche
• Moduli della logica applicativa
• Strumenti di gestione: analytics, logging, …
DATABASE-AS-A-SERVICE
• Forma «classica»:
o DB tradizionale accessibile con protocolli del DB (rete interna, protocolli specifici)
o Gestita e scalata dal fornitore
• Forma «Web»:
o DB ottimizzati per l’utilizzo aaS (spesso semplificati)
o Accessibili con protocolli HTTP sia su Internet che attraverso una rete interna
o Modello «pay-as-you-go»: pagamento per l’utilizzo effettivo
GOOGLE FIREBASE
CLOUD FIRESTORE
https://console.firebase.google.com/
• DB in cloud:
o Accessibile anche direttamente dal dispositivo / pagina Web / client JavaScript
o Gestito dalla console di sviluppatori Google (basta avere un account)
• NoSQL:
o Non ha uno schema fisso – si possono gestire oggetti JSON arbitrari
o Linguaggio di «query» proprietario, ma molto semplice
• Librerie client:
o SDK per varie linguaggi di programmazione (JS incluso)
• Struttura
o Elementi organizzati in «collezioni»
▪ Es. utenti, prodotti, messaggi, voti, …
o Ogni collezione rappresenta un insieme di oggetti
▪ Non necessariamente omogenei, possono avere anche campi diversi
o Ogni oggetto è un insieme di campi
▪ Semplici (stringhe, numeri, booleani)
▪ Strutturati (array, mappe, date, …)
• Cloud Firestore: creazione di un progetto:
o Includere librerie
o Inizializzare il DB (copiare il codice sul sito)
<script src="https://www.gstatic.com/firebasejs/
10.9.0/firebase-app-compat.js"></script>
<script src="https://www.gstatic.com/firebasejs/
10.9.0/firebase-firestore-compat.js"></script>
INSERIRE DATI
• Tutte le operazioni sono asincrone, restituiscono una
Promise
• A ogni nuovo oggetto viene assegnato un ID univoco
AGGIORNAMENTO DATI
• Singolo record
• Tutta la collezione
QUERY
• where(<CAMPO>, <OPERATORE>, <VALORE> )
o Valore: qualsiasi espressione JavaScript
o Operatore di confronto semplice: , ==, <=, >=
▪ where(‘price’, ‘==’, 100);
o Operatore “array-contains”: campo è un array e contiene valore specificato
▪ where(‘colors’, ’array-contains’, ‘blue’)
o Operatore “in”: campo è uno delle alternative specificate
▪ where(‘preferedColor’, ’in’, [‘blue’, ‘red’, ‘green’])
o Operatore “not-in”
o Operatore “array-contains-any”: campo è un array e contiene valore specificato
▪ where(‘colors’, ’array-contains-any’, [‘blue’, ‘red’])
• Ordinare i risultati:
o orderBy().orderBy(, ‘desc’)…
• Limitare il numero dei risultati:
o limit()
• Paginazione:
o Indicare inizio pagina successiva usando l’ultimo oggetto trovato precedentemente startAfter(obj),
startAt(obj), endBefore(obj) o endAt(obj)
ELIMINARE UN RECORD
VUE
V&E - IMPORT ED EXPORT
- Si usano per dividere il codice in moduli
- I moduli sono normalmente singoli file
- Import ed export vengono usati dai moduli per comunicare e scambiarsi funzionalità
- Export espone una funzionalià
- Import la utilizza
CDN VUE
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
alert(sayHi); // function...
V&E - SOFTWARE
• Stackblitz: https://stackblitz.com/
• VsCode: https://vscode.dev/
VUE.JS
• Framework js per interfacce web interattive
• Separazione tra vista e dati (parte di HTML e JAVA separata rispetto a jQuery che veniva tutto mescolato)
• Astrazione rispetto al DOM
• Leggero e facile da integrare
• Frontend suggerito da Laravel
• Vue si occupa solo del frontend
Ha l'obiettivo di creare interfacce interattive e migliorare l'interazione con l'utente. Separa la visualizzazione (html
e css) e i dati che lo fanno funzionare. Questo consente di non mescolare (come fa ad esempio jQuery) le due
dimensioni. È considerabile un'astrazione del DOM. è leggero e facile da integrare (come Bootstrap con il CDN).
Rispetto a jQ è più leggero, ma permette di fare molte cose che fa jQ, è più leggibile e flessibile (quindi possiamo
non usare jQ se usiamo Vue). Per quanto riguarda Ajax, vue non è fatto per gestirla, ma è meglio usare Axios per le
richieste Ajax piuttosto che jQ.
CONFRONTI
• Più veloce (è più leggero di jQuery)
• Più leggibile (usa HTML standard)
• Più flessibile (è progressivo)
VERSIONE
Codice vue2 non è compatibile con vue3
Vista: quello che vedo, l’estetica con cui dati vengono rappresentati. E
quello che utente vede (es utente vede pagina paesi del mondo
Controller: parte che utente usa per interagire con i dati. Es quando
utente preme su stelline per votare. È la parte programmata che sta in
mezzo tra utente e modello.
Quello che
utente vede sul
browser
NUOVO MODELLO DI PROGRAMMAZIONE: MVVM
VUE.JS
Caratteristiche di Vue.js
metodi sono reattivi sui dati quindi qualsiasi cosa viene modificata sui dati, modifica anche tutto il codice e
anche la vista di quel dato. Inoltre, basta dichiarare nell'HTML quali dati voglio che si vedano, e Vue pensa al
collegamento tra HTML e i dati (questo si chiama Rendering dichiarativo). Il rendering funziona, grazie al CDN
integrato, con degli attributi aggiuntivi (hanno il prefisso v-). C'è un ottimo modo di interpretazione del template
(ciò che con jQ si faceva ad esempio con append, append.child, ecc.).
RENDERING DICHIARATIVO
• Attributi HTML (prefisso v-)
• Interpretazione dei template
• Elaborazione di template
• Sostituzioni di componenti con markup HTML
• Aggiornamento automatico del contenuto quando cambia una variabile: quando cambia una variabile viene
automaticamente cambiata da entrambe le parti (view e controller)
ESEMPIO CDN
Con {{…}} sto inserendo Hello Vue
ESEMPIO CODESANDBOX
TIPI DI API
Due modalità per programmare VUE3 che VU2 non ha
- OPTION API
- COMPOSITIONAL API
VUE.S PLAYGROUND
<script setup> //sta usando il secondo metodo compositional API senza script sta usando
optional API
import { ref } from 'vue' //devo importare ogni cosa che si usa
<template>
<h1>{{ msg }}</h1>
<input v-model="msg" />
</template>
ESEMPIO DI VUE.JS
<div id="app"> //parte HTML
{{ text }}
</div>
<script> // parte JS
vm = new Vue({ //creo un nuovo oggetto di tipo vue (vm) . nelle graffe metto l'elenco dei
parametri che voglio caricare con Vue, come $.ajax
el: '#app', // el è l'elemento su cui devo caricare Vue. È gestito con un selettore CSS
text: 'Hello World from Vue!' //quello che verrà scritto nel documento
});
</script>
var app = new Vue({ el: '#app', data: { scritta : 'Hello world' }, methods: { cambiaScritta: function () { this.scritta =
'Hello again, world!’; } } }) // quando clicco su bottone cambia scritta
ESEMPIO DI BINDING (si possono utilizzare dati più complicati, come dei metodi)
<div id="app"> //parte HTML
<p>{{ scritta }}</p>
<button @click.prevent="cambiaScritta">Cliccami</button>
</div>
<script> //JS
var app = new Vue({
el: '#app',
data: {
scritta : 'Hello world'
},
methods: {
cambiaScritta: function () {
this.scritta = 'Hello again, world!’; } } })
OGGETTO VUE
Elementi che possono essere inseriti nell’oggetto Vue:
• elemento cui applicare Vue (utilizza selettori CSS). Di solito è un div che chiameremo App
• data: i dati (variabili, oggetti, ecc.)
• methods: i metodi da usare in Vue
• computed: proprietà pre-calcolate, sono comode e più snelle dei metodi
• watch: reazioni al cambio delle variabili
• filters: filtri
CICLI E CONDIZIONI
CONDIZIONI SU GRUPPI
<template> serve per mettere un v-if o v-for su + tag
ALTERNATIVE
V-SHOW: simile al v-if. Viene visualizzato se la variabile è vera. Con v-if oggetto viene creato e distrutto quando
la condizione è falsa e quindi poi oggetto non c’è + in HTML. Mentre con v-show l’oggetto rimane ma viene
cambiata solo la proprietà display di CSS. Alterna displat:none (non mostrare nulla)/displayblock.displayInline
v-for moltiplica n volte il ciclo tanti quanti sono gli items. In questo caso
verrà moltiplicato per due volte perché abbiamo due item
array
Esempio n°2
Item: variabile
Index: indice arrey
{{ }} oggetti array
CICLI SU OGGETTI
Esempio
<div id="app">
</div>
<script>
Vue.config.devtools = true;
el: "#app",
data: {
awesome: true
});
</script>
Scriverà Ciao sul documento se il parametro awsome dell'oggetto Vue, che richiama h1 (o un suo
Se al posto di voler modificare un solo elemento (h1), volessi modificare un gruppo più grande di
elementi (potenzialmente tutta la pagina), dovrò inserire i vari blocchi che si devono alternare in
un tag "template"
Esempio
<template v-if="ok">
<h1>Title</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</template>
Per avere una condizione più lunga e con più alternative (simile a switch), dovrò fare:
</div>
B
</div>
</div>
<div v-else>
Not A/B/C
</div>
V-FOR
v - for = "item in items" Ha lo stesso funzionamento che ha for in JS Vanno inseriti nel tag di apertura
HTML, come attributi.
Anche il for, come l'if, può essere applicato in un tag template per essere applicato a interi blocchi
di codice.
Esempio
<ul id=“app">
<li v-for="item in items">
{{ item.message }}
</li>
</ul>
<script>
var vm = new Vue({
el: '#app',
data: {
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]}})
</script>
Un'altra modalità di ciclare prevede gli indici:
v - for = "(item, index) in items"
<ul id=“app">
<li v-for="(item, index) in items">
{{ parentMessage }} - {{ index }} - {{ item.message }}
</li>
</ul>
<script>
var vm = new Vue({
el: '#app',
data: {
parentMessage: 'Parent',
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]}})
</script>
v-for è più forte di v-if, questo significa che viene eseguito prima se vengono messi entrambi nello
stesso tag. Altrimenti è necessario innestare il tag con il v-for nel tag con il v-if.
V-FOR E V-IF
NB: Non usare insieme v-for e v-if. Vince v-if. Se si vuole usarli assieme vanno annidati
OTTIMIZZAZIONE
Vue riutilizza gli elementi, vue quando cambia una varibiale non distrugge i suoi elementi ma è ingrado
di capire quali cose vanno reciclate. Se una variabile è già stata eseguita non la modifica.
Nei cicli è sempre meglio usare la chiave “key”. Per dire che cosa deve ricrearla da +
METODI SUPPORTATI.
Quando una variabile cambia, cambia anche il comportamento del sito. Non tutti i cambiamenti di variabile
vengono intercettati, soprattutto quando non sono variabili base. Se ho booleano, numero, stringa vengono
sempre intercettati. Quando ho array non tutti vengono intercettati
Comandi intercettati: se uso questi parametri con array questi vengono intercettati
• push()
• pop()
• shift()
• unshift()
• splice()
• sort()
• revrese()
• filter()
• concat()
• slice()
PARAMETRI
2 modi per assegnare valore alla variabile:
Esempio
<button v-bind:disabled="button1Disabled"> l'attributo disabled prenderà il valore che è stato dato alla
proprietà button1Disabled in Vue
<a v-bind:href="link"> Href prenderà come riferimento il link che è stato assegnato alla proprietà link di vue
CHIVI
Suggerimento dato a Vue per dare il nome al nodo HTML. Praticamente obbligatori nei cicli v-for.
DIRETTIVE IN VUE.JS
• Iniziano con v-
• Alcune accettano argomenti, introdotti da :
• Con . vengono introdotti i modificatori agli argomenti
EVENTI IN VUE.JS
Quello che deve accadere
MODIFICATORI DI EVENTI
MODIFICATORI DI TASTIERA
quando premo tasto enter da tastiera fai funzione
submit
• .enter • .left
• .tab • .right
• .delete • .ctrl
• .esc • .alt
• .space • .shift
• .up • .meta
• .down • # (codice lettera ASCI)
• Anche i tasti possono essere concatenati (ma solo per i tasti modificatori di sistema o il mouse)
SINTASSI ACCORCIATE
• v-bind: attributo si può accorciare con :attributo
• v-on:evento si può accorciare con @evento
ESEMPI DI FORM Vuol dire che nella variabile message tra {{ }} verrà salvato un valore
che utente inserisce
• v-change: quando scrivo in un form, finisco, faccio tab per passare al campo successivo
• on-input: mentre sto digitando il testo vado a cambiare
:=v-bind: sto bindando la variabile searchText con il valore, quindi sto mettendo dentro il valore
dell’input la variabile searchText
Appena vado a cambiare qualcosa nell’input setto searchText con il valore che ha in quel
momento il form
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>HTML + CSS</title>
<link rel="stylesheet" href="styles.css" />
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<h1>https://codesandbox.io/p/sandbox/crazy-surf-jc22yg</h1>
<div id="app">
<select v-model="selected"> // tag selected = menù a tendina
<option v-for="option in options" v-bind:value="option.value">
{{ option.text }}
</option></select
><br />
<span>Selected: {{ selected }}</span> <br/>
<button @click="selected ='B'"> Metti B </button> //mi selezione B dal menù tendina
<button @click="options.push({text: 'Altro', value:'x'}) "> Aggiungi </button>
MODIFICATORI DI EVENTI: gli uso con v-model. V-model attivato sull’evento input cioè appena cambio una
lettera del mio campo lui va a cambiare il valore
• .lazy – cambia la modalità di aggiornamento del valore (modifica quando mi sposto di campo) (da input a
change)
• .number – converte il valore a numerico (applicato automaticamente se type è number)
• .trim - Elimina gli spazi all’inizio e alla fine del valore inserito (es Alessio spazio.trim → elimina gli spazi
Esempio:
PROPRIETÀ COMPUTED
Metodi: calcolato ogni volta che l’ho uso Computed: viene ricalcolata solo quando cambiano dei valori
firstname e lastname: sono due variabili
• Possono essere
sia prese che essere impostate
• Si possono usare come proprietà sia in binding sia con le parentesi “a baffo”
• Le proprietà computed vengono ricalcolate quando cambia una delle altre proprietà coinvolte
• Rispetto ai metodi sono più efficienti perché il valore viene ricalcolato solo alla modifica delle altre proprietà
coinvolte e non ogni volta che viene richiamata
Le proprietà computed ermettono di creare delle nuove proprietà che possiamo poi usare nella
Esempio
computed: {
fullname:{
},
Quando viene modificata una delle variabili che la compongono, in automatico cambia anche la
computed. E questa viene ricalcolata solo quando varia una delle due, non ogni volta che viene
set: function(value) {
this.firstname = parts[0];
this.lastname = parts[1];
} } } }). mount(“#App”);
In questo caso se io tramite la console modifico fullname, verranno modificate anche le variabili di
partenza firstname e lastname
Esempio:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>HTML + CSS</title>
<link rel="stylesheet" href="styles.css" />
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<h1>https://codesandbox.io/p/sandbox/crazy-surf-jc22yg</h1>
<div id="app">
<div id="app">
<input type="text" v-model="fullname" /><br />
{{ firstname }}<br />{{ lastname }}
</div>
</div>
<script>
Vue.createApp({
data() {
return {
firstname: "Dylan",
lastname: "Dog",
};
},
computed: {
fullname: {
get: function () {
return this.firstname + " " + this.lastname;
},
set: function (value) {
var parts = value.split(" "); //divide per lo spazio. Quindi prendo solo
uno spazio
if (parts.length == 1) {
this.firstname = parts[0];
this.lastname = parts[0];
} else {
this.firstname = parts[0];
this.lastname = parts[1];
},
},
},
}).mount("#app");
</script>
</body>
</html>
COMPUTED VS METHODS
WATCHERS: associo un evento al cambio della variabile. Funzioni si attivano solo quando una variabile viene
cambiata
Vengono iniziate con whatchers. Questo termine indica che questo elemento "osserva" delle variabili e quando
vengono modificate, si attiva. Possono spesso essere sostituiti con una proprietà computed.
Esempio n°1
Esempio n°2
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>HTML + CSS</title>
<link rel="stylesheet" href="styles.css" />
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<h1>https://codesandbox.io/p/sandbox/crazy-surf-jc22yg</h1>
<div id="app">
<input type="text" v-model="name" />
<button :disabled="submitDisabled">Invia</button> //bottone non disabilitato perché
name maggiore di 3
</div>
<script>
Vue.createApp({
data() {
return {
name: "Alessio",
submitDisabled: false,
};
},
watch: {
name: function (value) { //quando la variabile cambia la variabile sumbmitDi-
sable prende il valore.length. disabilità bottone se valore.length minore di 3
this.submitDisabled = value.length < 3;
},
},
}).mount("#app");
</script>
</body>
</html>
ASSEGNAZIONE DI CLASSI
Assegnazione della class my-class-name se hasClass è true
condizione
Variabile booleana che stabilisce se quella
classe c’è oppure no
Esempio n°1
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>HTML + CSS</title>
<link rel="stylesheet" href="styles.css" />
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<style>
.colorato {
color: red;
}
.grassetto {
font-weight: bold;
}
.colorato {
color: red;
}
.grassetto {
font-weight: bold;
}
</style>
</head>
<body>
<h1>https://codesandbox.io/p/sandbox/crazy-surf-jc22yg</h1>
<div id="app">
<p :class="{'colorato':mycheck_rosso, ‘grassetto': check_grassetto
VUE.CREATEAPP: viene creata App. Le funzioni legate al ciclo di vita di vue sono:
Hook Descrizione
viene invocato dopo che l’istanza è stata inizializzata e prima del setup di eventi
beforeCreate
e watcher
viene invocato dopo l’inizializzazione dell’istanza ma prima che il framework si
created occupi della modifica del template della pagina (la variabile $el non è ancora
valorizzata)
beforeMount viene invocato prima delle operazioni di render
viene invocato subito dopo che l’istanza viene renderizzata e il frammento DOM
mounted originale viene sostituito con quello gestito da Vue. Con il mounted il codice
viene lanciato all’avvio dell’applicazione
beforeUpdate viene invocato prima di eventuali modifiche successive al DOM
updated viene invocato dopo una modifica che ha scatenato modifiche al DOM
viene invocato prima che l’istanza di Vue venga distrutta (ma è ancora
beforeDestroy
funzionante)
destroyed viene invocato dopo la completa distruzione
Esempio
<div id="vue-app">
</div>
//Vue.directive è da chiamare prima di chiamare un oggetto //new Vue, altrimenti darà errore
Vue.directive('custom-background', {
el.style.backgroundColor = binding.value || '#DDD'; (se non metto alcun valore metti DDD
}});
el: '#vue-app'
});
RIFERIMENTI AL DOM
Posso dare ad ogni oggetto attributo ref, per settare variabile in
vue, e vue chiamerà quel oggetto in quel modo: vm.$refs
• Transition: posso fare transizioni cosa fa oggetto quando entra. Posso dare dei nomi alla transizioni. Posso
usare anche CSS ma con Vue è ppiù rapido
• TrantionGruop
FIRESTORE
Esistono due API di Firestore:
1. Web namespacedAPI
2. Web modular API
Se mancano i campi (tipo capitale Antartide) nel codice inserisco v-if e join per congiungere il resto del codice!
(non so se capiterà mai, ma so che c’è ed esiste)
V&E – EXPORT
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export
• Il comando export può essere usato per “esportare” le parti di un modulo, in modo che siano visibili
all’esterno (e possano essere importate con “import”)
• Il comando export default stabilisce cosa viene esportato di default quando si chiama il modulo “così come
è”
• Gli export possono essere inseriti tutti insieme in cima al file e poi definiti anche successivamente
VUE AVANZATO
Una delle caratteristiche più forti de framework di sviluppo, e soprattutto di Vue è la sua modularità, ovvero il
fatto di poter programmare le diverse componenti in modo indipendente e flessibile.
Un'altra caratteristica importante è il router, ovvero la possibilità di navigazione tra le diverse pagine di una SPA
tramite l'history, che però resta nascosto dietro questo framework.
COMPONENTI:
Di solito le applicazioni che utilizziamo hanno diverse componenti e hanno una struttura ad albero: l'app
contiene diverse pagine e ogni pagina a sua volte contiene diverse componenti più piccole. Questa struttura di
permette di riutilizzare dei componenti, di aver diversi moduli indipendenti .
Quindi… COMPONENTE = Una piccola applicazione di Vue rappresentata da un elemento UI (una pagina, una
lista, un elemento, un bottone, ecc.). Qualsiasi elemento grafico può essere programmato come un singolo
componente. Più piccolo è il componente e più è componibile l'elemento. Le componenti possono essere a
diversi livelli, ad esempio una voce di una lista è un componente, ma anche la lista costituita da tanti piccoli
componenti diventa a sua volta un componente.
La struttura di un componente segue quella di un oggetto Vue, quindi metodi, dati, ciclo di vita, ecc. I nomi dei
componenti utilizzano i Pascal case, quindi ad esempio HelloWorld, oppure kebab case quindi hello-world
• Template
• Script
• css <style> se metto scoperd, si applica solo per quel template
DICHIARAZIONE “MODULARE”
• Dichiarazione modulare
PROPRIETÀ:
Il “figlio” non può cambiare l’evento ma può fare una richiesta al “genitore” -> >$emit
TWO WAY DATA FLOW
Esempio n°2
SLOT
• Rendono i componenti più dinamici
Esempio n°1:
Esempio n°2
A così: vengono ereditate le proprietà senza essere passare. Da la possibilità a tutti di usare il valore, ma scelgo
io chi lo prende senza farlo passare per tutto il percorso
PROVIDE
provide: lo avrà il nonno
INJECT
NAVIGAZIONE
• Da integrare in main.js
NAVIGAZIONE DINAMICA
• Route path può contenere i parametri
o /users/:id
o users/:username/posts/:post_id
• Route link
o /users/1
o /users/rossi/posts/123
GESTIONE NAVIGAZIONE NEL CODICE
• Tutti i componenti hanno accesso a
o $router: istanza del router
▪ $router.push(): naviga alla route specificata (come stringa, oggetto con parametri e/o
query). Il percorso si aggiunge alla history.
▪ $router.replace(): come prima, ma sovrascrive l'ultimo elemento della history.
▪ $router.back()
▪ $router.forward()
▪ $router.go(n): andare avanti / indietro di n passi (se voglio andare alla pagina precedente
devo fare -1). Fa ciò che fanno i due comandi precedenti in un unico comando.
Consistente con History API
Sia .push che .replace possono accettare i seguenti parametri tra parentesi:
o $router.push():
▪ $router.push(‘nome’): se vogliamo specificare la route tramite il nome
▪ $router.push({name: ’nome’, params: {p1: ‘v1’}}): se devo passare dei parametri
▪ $router.push({name: ’nome’, query: {p1: ‘v1’}})
▪ $router.push({path: ’/path/v1’}): far riferimento a una route non dal nome, ma dal percorso
in sé. Attenzione ad inserire il nome del percorso completo.
• Tutti i componenti hanno accesso a
o $route: dà accesso alla route corrente e a tutti i parametri, alle query, al nome e al percorso tramite i
seguenti comandi. (Come se fosse un oggetto)
▪ $route.params
▪ $route.query
▪ $route.name
▪ $route.path
NAVIGATION GUARD
• Possibilità di modificare il processo di navigazione inserendo dei controlli in diversi momenti:
o Perché: per cancellare la navigazione o per fare redirect (es. se richiede autenticazione)
o Quando: prima di attivare la navigazione, dopo che la navigazione è avvenuta
o Dove: globalmente (per tutte le route), per una route specifica, all’interno del componente
• Globali:
o .beforeEach (to, from, next): prima di entrare nella pagina, prima della navigazione (globale)
o .afterEach (to, from): globale dopo la navigazione
o .beforeResolve: prima che viene istanziato il componente di arrivo viene eseguita un’altra funzione
• Per singola route:
o .beforeEnter (to, from, next): è analogo a beforeEach, ma non è globale, ma per un componente
specifico
• Per componente:
o .beforeRouteEnter (to, from, next): prima che si entra nel componente. Non ha accesso a «this»
perché l'istanza non è ancora stata creata
o .beforeRouteUpdate (to, from, next): quando il componente viene riusato. Quindi c'è una
navigazione da un componente a sé stesso. Quindi non è una vera e propria navigazione, ma una
modifica dei suoi parametri (Es. da /user/1 a /user/2)
o .beforeRouteLeave (to, from, next): appena prima di uscire dal componente. Comodo per
controllare e salvare i dati. Anche questo può essere bloccato (es. quando c'è un form che non è
stato completamente compilato e quindi l'utente non può lasciare la pagina)
• Ritorna nulla se la navigazione può procedere
• Ritorna una particolare pagina
• Ritorna false se si vuole bloccare la
navigazione
META FIELDS
MAGGIORI INFORMAZIONI
https://vuejs.org/api/
VUETIFY
Lista pagina HTML -> estetica (componenti app. vue)
Java -> meccanica applicazione. Da una parte legge dati che dà alla grafica.
VUEJS – CARATTERISTICHE
Mobile app: Ionic(framework che permette di scrive una volta sola e poi si adatta a tutte le piattaforme in base a
dove verrà visualizzato se su Android o Apple), NativeScript
Design system: come gestire grafica di un sito. In base al mio cliente il design system cambia. Esso definisce una
serie di principi e le caratteristiche identificativi.
Navigazione: come voglio che utenti navighi sul mio sito: menù, tab, menù che scompare,…
Comunicazione: come voglio comunicare con utente: finestre per chiedere info
IMPLEMENTATURA:
La struttura delle web app posso farle:
- A mano: esempio stelline (lezione 30.04.2024). partire da HTML5. CSS. Realizzare tutti i
componenti/animazioni/temi
- Usando come base un framework esistenti:
o Componenti già esistente (bootstrap)
o Cambiare animazioni/stili/librerie JavaScript
- Usando librerie Materia generiche
- Usando librerie Material specifiche per Vue
o Integrazione stretta con modello/eventi di vue
o Condivisione delle librerie di base è meno dipendenze/più leggero
VUETIFY
https://vuetifyjs.com/en/
CDN VUETIFY:
STRUTTURA DELL’APP
v-app: contenitore di tutto il sito
v-main: contenitore
STILIE
• Colori — https://vuetifyjs.com/en/styles/colors/
o Classe text-{color}-{lighten|darken}-{n}
o Classi predefinite:
▪ Primary, secondary, info, success, warning, error
▪ Colori dalla palette Material
o Possibilità di definire i temi custom
• Elevation: https://vuetifyjs.com/en/styles/elevation/
o quanto lo voglio in rilievo
o Classe: elevation-{n} (1-24)
o Proprietà: elevation=“0"
ICONE
• md-icon
• Usano icone del https://material.io/tools/icons
o Sintassi: <v-icon icon="mdi-nome_icona"></v-icon>
o Sintassi: <v-icon>mdi-nome_icona</v-icon>
• Dimensioni
o Property «size»: x-small, small, medium, large, x-large
BOTTONI:
• v-btn
o Doc: https://vuetifyjs.com/en/components/buttons/
o Proprietà: density, size, block, ripple, elevation, …
o Slot: prepend, append • Bottoni con icone
▪ Property: icon, prepend-icon, append-icon
o Posizionamento
▪ Property: position
STRUTTURA DELL’APP
v-model: posso associare stato di un oggetto a una
variabile automaticamente
v-list
NAVIGAZIONE
• v – btn
• v-list-item
• v-breadcrumbs-item
• v-tab
• …
LISTE
• v-list
o Proprietà:
▪ Lines (one, two, three)
o Contenuti:
▪ v-list-item
▪ v-divider
▪ v-list-subtitle
NAVIGAZIONE DINAMICA
• Obiettivo
o Visualizzare componenti per i dati simi (es. dettaglio di una persona dalla lista)
o Navigazione di secondo livello
• In alternativa/aggiunta a Drawer si può usare Tabs, Bottom Bar, Bredcrumbs
• v-tabs/v-tab
• v-bottom-navigation
• v-breadcrumbs
•
LAYOUT
VueMaterial, come Bootstrap, prevede una griglia di fondo che rende l'applicazione responsive e aiuta nella
disposizione degli elementi.
Per crearla si utilizza md-layout. Abbiamo diverse classi per gestire il layout:
• md-layout-item: crea una colonna, quindi non abbiamo un tag specifico per la colonna, ma deve
essere inserito come classe.
• md-gutter: aggiunge spazi tra le diverse colonne
• md-alignment-Y-X: posiziona il contenuto nella griglia. (X= left, center, rigth, space-arount, space-
between / Y=top, center, bottom)
• v-container: griglia
• v-row: riga
• v-col: colonna singola, attributo cola=[numero colonne]
• v-spacer: aggiunge spazi tra colonne
• v-card-title [2]
• v-card-subtitle [3]
• v-card-text [4]
• v-card-actions [5]
con immagini:
• v-img
TABELLE:
TABELLE DI BASE: v-table
DATA TABLE: far vedere tanti dati (es pagina mail scorrere)
• Supporto esteso per lavorare con i dati – ordinamento, paginazione, filtri, ecc.
• Supporto per sorgenti API server
MENU: v- menù
FORM: v-form
• v-form: contenitore
• v-text-input → input type=«text»
• v-checkbox → input type =«checkbox»
• v-switch → input type =«checkbox»
• v-radio → input type=«radio»
• v-textarea • v-slider, v-range-slider
• v-combobox
• v-select
• v-file-input
• v-autocomplete
• v-autocomplete: digito qualche lettera e mi fa vedere cose con contengono quella lettera
• chips: filtrare
• color picker: far scegliere colore utente
COMUNICAZIONE:
Riguarda come comunicare/chiedere qualcosa/dare un feedback all’utente. Ci sono molti componenti per farlo:
dialogo:
ALTRE AMENITÀ
• v-rating: stelline
• v-timeline:
• v-banner:
VUELIDATE:
NB: Cols non è numero di colonne in cui è diviso la griglia, ma il numero di colonne che volgio che
occupi il mio oggetto
C’è 12 perché sul dispositivo che è piccolo ogni card occupi 12 dodicesimi
setTimeout(function () {
vueThis.countryData = data.data;
vueThis.errorData = undefined;
// vueThis.countryData = [];
}, 1000);
// vueThis.countryData = data.data;
})
.catch(function (data) {
vueThis.errorData = data;
});
}, //inizializzo pulsante drawer
data() {
return {
drawer: null,
countryData: undefined, //undefined perchè possiamo verificare se per capire se ha
cariato*/,
errorData: undefined,
};
},
};
</script>
<template>
<v-app id="inspire">
<v-navigation-drawer v-model="drawer">
<!-- -->
</v-navigation-drawer>
<v-app-bar color="primary">
<v-app-bar-nav-icon @click="drawer = !drawer"> </v-app-bar-nav-icon>
<v-toolbar-title>Application</v-toolbar-title>
</v-app-bar>
<v-main>
<v-empty-state
v-if="errorData !== undefined"
headline="Errore"
:text="errorData.message"
icon="mdi-exclamation-thick"
></v-empty-state>
<style scoped></style>
NB: mettere scheletro caricamento dei componenti per dare feedback all’utente che si sta caricando
componente → importante per feedback. Vedi v.vuetify