<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
		<id>http://wikiserver.infomerce.es/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jcomas</id>
		<title>wikiserver - Contribucions de l’usuari [ca]</title>
		<link rel="self" type="application/atom+xml" href="http://wikiserver.infomerce.es/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jcomas"/>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php/Especial:Contribucions/Jcomas"/>
		<updated>2026-05-09T14:25:54Z</updated>
		<subtitle>Contribucions de l’usuari</subtitle>
		<generator>MediaWiki 1.28.0</generator>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF3_-_Objectes_predefinits_del_llenguatge_Javascript&amp;diff=17364</id>
		<title>NF3 - Objectes predefinits del llenguatge Javascript</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF3_-_Objectes_predefinits_del_llenguatge_Javascript&amp;diff=17364"/>
				<updated>2023-05-30T15:39:45Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Scrollbars &amp;amp; Info */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== The Browser Object Model (BOM) ==&lt;br /&gt;
&lt;br /&gt;
Si creus que JavaScript viu dins del navegador de web, és parcialment correcte, és cert que el navegador web és l'amfitrió pel vostres programes JavaScript, però els vostres programes mai interaccionaran directament amb el navegador web. En comptes d'això s'ha de treballar amb una col·lecció d'objectes JavaScript que actuen com un intermediari entre el vostre JavaScript i el navegador web. Aquesta col·lecció d'objectes s'anomena BOM(Model d'Objecte del Navegador). El seu objectiu és proporcionar una interfície simple, compatible entre els programes javascript i el navegador web.&lt;br /&gt;
&lt;br /&gt;
Els programes escrits per una plataforma (com l'UNIX) no funcionen en una altra plataforma (com Windows) sense molta feina de conversió. Això és a causa que utilitzen una interfície de programació molt diferent per dur a terme la mateixa tasca. Considerem ara la indústria dels navegadors web. El codi Javascript que crea per a l'Internet Explorer ha de ser capaç de funcionar a la perfecció en el Netscape Navigator. Pots fins i tot utilitzar el codi que va escriure per al navegador en Linux amb Internet Explorer en Macintosh. Això és a causa que tots dos navegadors són compatibles amb la mateixa interfície de programació, és a dir, el model d'objectes del navegador.&lt;br /&gt;
&lt;br /&gt;
El model d'objectes del navegador es compon de una gran col·lecció d'objectes que permeten als programes Javascript ficar-se en cada racó del navegador web. Tots els objectes estan disposats en una estructura d'arbre.&lt;br /&gt;
L'objecte de la finestra es troba en la part superior d'aquest arbre i tots els altres objectes del model d'objectes del navegador es pot trobar en el seu interior, BOM és molt gran i bastant complex.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:bom.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Objecte Window ===&lt;br /&gt;
&lt;br /&gt;
L'objecte '''Window''' és compatible amb tots els navegadors. Representa la finestra del navegador.&lt;br /&gt;
Tots els objectes globals de Javascript, funcions i variables es converteixen automàticament en membres de l'objecte Window.&lt;br /&gt;
Les variables globals són propietats de l'objecte Window. Les funcions globals són mètodes de l'objecte Window.&lt;br /&gt;
Fins i tot l'objecte document (de l'HTML DOM) és una propietat de l'objecte Window:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
window.document.getElementById(&amp;quot;header&amp;quot;);&lt;br /&gt;
// es igual a:&lt;br /&gt;
document.getElementById(&amp;quot;header&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ara veurem els mètodes i propietats d'aquest objecte:Leer&lt;br /&gt;
&lt;br /&gt;
==== La mida del navegador ====&lt;br /&gt;
&lt;br /&gt;
Hi ha diverses maneres de determinar la mida de la finestra del navegador (viewport) que no inclou les barres de lliscament ni les barres d'eines.&lt;br /&gt;
Segons sigui el teu navegador Chrome, Firefox, Opera o Safari&lt;br /&gt;
* window.innerHeight =  la altura de la finestra&lt;br /&gt;
* window.innerinnerWidth = la amplada de la finestra&lt;br /&gt;
Si el navegador és Internet Explorer 5 o superior:&lt;br /&gt;
* document.documentElement.clientHeight&lt;br /&gt;
* document.documentElement.clientWidth&lt;br /&gt;
* document.body.clientHeight;&lt;br /&gt;
* document.body.clientWidth;&lt;br /&gt;
&lt;br /&gt;
Per solucionar el problema podem fer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var w=window.innerWidth&lt;br /&gt;
|| document.documentElement.clientWidth&lt;br /&gt;
|| document.body.clientWidth;&lt;br /&gt;
&lt;br /&gt;
var h=window.innerHeight&lt;br /&gt;
|| document.documentElement.clientHeight&lt;br /&gt;
|| document.body.clientHeight;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu veure tots els métodes en aquesta pàgina : [http://www.w3schools.com/jsref/obj_window.asp  w3schools window]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:pantallaParametros.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==== Events de temporitzador ====&lt;br /&gt;
&lt;br /&gt;
https://www.w3schools.com/js/js_timing.asp&lt;br /&gt;
&lt;br /&gt;
L'objecte window permet l'execució de codi en un moment donat o a intervals mitjançant els mètodes:&lt;br /&gt;
&lt;br /&gt;
* setTimeout(funcio, milisegons)&lt;br /&gt;
Executa una funció al cap del nombre de milisegons especificat per paràmetre.&lt;br /&gt;
&lt;br /&gt;
* setInterval(funcio, milisegons)&lt;br /&gt;
Executa una funció repetidament en intervals del nombre de milisegons especificat per paràmetre.&lt;br /&gt;
&lt;br /&gt;
=== Objecte Navigator ===&lt;br /&gt;
&lt;br /&gt;
L'objecte navigator ens dona informació sobre el navegador utilitzat per l'usuari.&lt;br /&gt;
&lt;br /&gt;
Per veuere els seu métodes i propietats vegeu aquesta pàgina: [http://www.w3schools.com/jsref/obj_navigator.asp w3schools navigator]&lt;br /&gt;
&lt;br /&gt;
=== Objecte History ===&lt;br /&gt;
&lt;br /&gt;
L'objecte History ens dona informació sobre les pàgines visitades.&lt;br /&gt;
&lt;br /&gt;
Per veuere els seu métodes i propietats vegeu aquesta pàgina: [http://www.w3schools.com/jsref/obj_history.asp w3schools history]&lt;br /&gt;
&lt;br /&gt;
=== Objecte Screen ===&lt;br /&gt;
&lt;br /&gt;
L'objecte Screen ens dona informació sobre la pantalla del usuari. Per exemple, la propietat ''screen.availWidth'' ens dona l'altura sense incloure la barra de windows.&lt;br /&gt;
&lt;br /&gt;
Per veuere els seu métodes i propietats vegeu aquesta pàgina: [http://www.w3schools.com/jsref/obj_screen.asp w3schools screen]&lt;br /&gt;
&lt;br /&gt;
=== Objecte Location ===&lt;br /&gt;
&lt;br /&gt;
L'objecte Location ens dona informació sobre la URL actual de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Per veuere els seu métodes i propietats vegeu aquesta pàgina: [http://www.w3schools.com/jsref/obj_location.asp w3schools location]&lt;br /&gt;
&lt;br /&gt;
== Popup Window ==&lt;br /&gt;
Una finestra PopUp és un dels mètodes més antics de mostrar informació (html) a l'usuari. Normalment, només has d'escriure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
window.open(&amp;quot;http://www.infomerce.es&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Y s'obrirà una nova finetra amb la url corresponent. Molts navegadors el que obren és una nova pestanya en comptes d'una finestra separada.&lt;br /&gt;
Moltes pàgines han abusat dels PopUps, per això, els navegadors intenten bloquejar-les i protegir l'usuari. Però, pot ser hi ha situacions on el seu ús està indicat, com per exemple a l'hora de comprar algun producte a una tenda on-line podem conversar via chat amb un dels depenents reals de la botiga per preguntar quelcom.&lt;br /&gt;
&lt;br /&gt;
Perquè és beneficiós?&lt;br /&gt;
* La finestra emergent és independent amb el seu propi entorn de Javascript. Així que el servei de xat no necessita integrar-se amb javascripts del lloc de la tenda. &lt;br /&gt;
* La finestra emergent és molt simple agregar al lloc. És només un petit botó, sense javascripts addicionals per carregar-se.&lt;br /&gt;
* L'element emergent pot persistir fins i tot si l'usuari deixa la pàgina. Per exemple, el depenent avisa a l'usuari que hi ha una oferta especial en una altre pàgina. L'usuari pot navegar amb l'altre finestra sense tancar el xat.&lt;br /&gt;
&lt;br /&gt;
=== Sintaxy de window.open() ===&lt;br /&gt;
&lt;br /&gt;
La sintaxi és: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
window.open(url, name, params)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*url :  La url que es vol mostrar&lt;br /&gt;
*name: El nom de la finestra, pot ser usat com a ''target'' dels formularis.&lt;br /&gt;
*params: Es pot definir molts paràmetres separats tots ell amb una coma.&lt;br /&gt;
&lt;br /&gt;
'''Params:'''&lt;br /&gt;
*left/top (numeric) : Coordenades top/left de la finestra&lt;br /&gt;
*width/heith (numeric) : L'amplada i la llargada de la finestra&lt;br /&gt;
*menubar(yes/no) : Mostra o oculta el menu del navegador&lt;br /&gt;
*toolbar (yes/no) : mostra o oculta les opcions del navegador (pag. endavant, enrera, recàrrega,...) (*desuso)&lt;br /&gt;
*location (yes/no) : mostra o oculta la url&lt;br /&gt;
*status (yes/no) : mostra o oculta la barra d'estat del navegador (*desuso)&lt;br /&gt;
*resizable (yes/no) : Permet o no canviar la mida de la finestra. &lt;br /&gt;
*scrollbars (yes/no) : Mostra o no les barres de lliscament de la finestra.(*desuso)&lt;br /&gt;
&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var p1 = 'scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no'&lt;br /&gt;
var p2 = 'width=0,height=0,left=-1000,top=-1000'&lt;br /&gt;
window.open('/', 'test', p1+p2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Com accedir a la finestra:'''&lt;br /&gt;
Una vegada la finestra s'ha obert, podem canviar el seu contingut des de la finestra 'pare'. Ho podem fer amb el valor retornat per la funció window.open().&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 var win = window.open(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;width=200,height=100&amp;quot;);&lt;br /&gt;
            win.document.write(&amp;quot;&amp;lt;p&amp;gt;Una nova Finestra!&amp;lt;/p&amp;gt;&amp;quot;);&lt;br /&gt;
            win.focus();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var win = window.open('/', 'exemple', 'width=300,height=300');&lt;br /&gt;
win.focus();&lt;br /&gt;
win.onload = function() {&lt;br /&gt;
  var div = win.document.createElement('div');&lt;br /&gt;
  div.innerHTML = 'Hola a tots!';&lt;br /&gt;
  div.style.fontSize = '30px';&lt;br /&gt;
  win.document.body.insertBefore( div, win.document.body.firstChild );&lt;br /&gt;
}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
També, des de la finestra oberta podem accedir al 'pare' utilitzant la propietat '''window.opener'''. Aquesta propietat la tenen tots els popUps. Les altres finestres contenen el valor ''null''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
Escriu una pàgina que contingui un iframe de 100px i carrega la url: &amp;quot;http://google.com&amp;quot;. Crea un script i obtè la url del iframe.&lt;br /&gt;
Més info https://www.w3schools.com/jsref/prop_win_frames.asp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[solució exercici accès prohibit]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''No podem llegir propietats d'altres origens però es pot escriure!'''&lt;br /&gt;
Algunes de les propietats es poden modificar.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
Modifica l'exercici anterior per tal de que l'iframe intenti carregar google, però des de l'script modifica el location per carregar la wikipedia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[solució execici canviar location]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Moure finestra 1===&lt;br /&gt;
&lt;br /&gt;
Crea una pàgina amb tres botons:&lt;br /&gt;
*obrir finestra:ens obrirà una finestra de 200x200 pixels centrada a la pantalla que carregarà una pàgina web qualsevol.&lt;br /&gt;
*moure esquerra: ens mourà la finestra oberta pel botó obrir 10 pixels a l'esquerra.&lt;br /&gt;
*moure dreta: ens mourà la finestra oberta pel botó obrir 10 pixels a la dreta.&lt;br /&gt;
&lt;br /&gt;
=== Moure finestra 2===&lt;br /&gt;
&lt;br /&gt;
Crea una finestra amb un botó amb l'etiqueta &amp;quot;iniciar moviment&amp;quot;. Quan es premi el botó s'obrirà una segona finestra de 200x200 pixels que es mourà sola per la pantalla. experimenta amb diferents moviments.&lt;br /&gt;
&lt;br /&gt;
=== Títol mòbil ===&lt;br /&gt;
&lt;br /&gt;
Crea una pàgina web amb un títol (tag html H1) que es mogui a la forma de banner: a intervals regulars es deplacen cap a l'esquerra tots els caràcters i els caràcters que desapareixen per l'esquerra tornen a apareixer per la dreta.&lt;br /&gt;
&lt;br /&gt;
=== Títol mòbil amb colors===&lt;br /&gt;
&lt;br /&gt;
Crea una pàgina com la de l'exercici anterior però afegint la característica que cada caràcter sigui d'un color diferent.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
=== Moure finestra ===&lt;br /&gt;
*Crea una pàgina que tingui un botó que mogui la finestra 100 px cap a la dreta. Fes que la mida de la finestra es vagi fent cada vegada més petita s'arriva al costat dret de la pantalla.&lt;br /&gt;
*Amplia l'exercici anterior per tal que es pugui fer el mateix cap a dalt, cap a baix i cap a l'esquerra.&lt;br /&gt;
&lt;br /&gt;
:[[solució Moure Finestra]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Descans ===&lt;br /&gt;
&lt;br /&gt;
*Queremos crear una aplicación que nos avise con una ventana emergente que deberiamos descansar cada X minutos que son introducidos por el usuario.&lt;br /&gt;
&lt;br /&gt;
:[[sol_descans]]&lt;br /&gt;
&lt;br /&gt;
=== Scrollbars &amp;amp; Info ===&lt;br /&gt;
* A l'exercici anterior crea un botó per tal que es puguin amagar o mostrar les barres de desplaçament.&lt;br /&gt;
* A més a més mostra tota la informació que puguis del navegador de l'usuari&lt;br /&gt;
* Mostra el numero de pagines visitades. &lt;br /&gt;
* Mostra la url actual, el port i el protocol.&lt;br /&gt;
&lt;br /&gt;
//Nota: para que pueda cambiar las barras laterales o barra direcciones hay que entrar en about:config-&amp;gt; dom.disable_window_open_feature.location... y cambiar la configuración de predeterminado a por el usuario &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[sol barra]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
== L'atac Clickjacking ==&lt;br /&gt;
La idea general és simple.&lt;br /&gt;
&lt;br /&gt;
*Un visitant és atret a la pàgina del mal. No importa com. &amp;quot;Faci clic per obtenir 1000000 $&amp;quot; o el que sigui.&lt;br /&gt;
*La pàgina del mal posa un link &amp;quot;fer-se ric ara&amp;quot; amb z-index = -1. com ho fa?&lt;br /&gt;
**La pàgina inclou un iframe transparent a un domini que estigués visitant la víctima, exemple facebook.com i el posiciona damunt del botó ''m'agrada''. Quan la victima faci un click en m'agrada, també estarà accedint al link del iframe.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
iframe { /* iframe from facebook.com */&lt;br /&gt;
  width:300px;&lt;br /&gt;
  height:100px;&lt;br /&gt;
  position:absolute;&lt;br /&gt;
  top:0; left:0;&lt;br /&gt;
  filter:alpha(opacity=50); /* in real life opacity=0 */&lt;br /&gt;
  opacity:0.5;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Click en el enllaç per ser ric!:&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;iframe src=&amp;quot;http://wikiserver.infomerce.es&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;http://www.google.com&amp;quot; target=&amp;quot;_blank&amp;quot; style=&amp;quot;position:relative;left:20px;&amp;quot;&amp;gt;CLICK ME!&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Serás ric per tota la teva vida!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Els events de teclats son molt més dificils de hackejar degut a que s'està escrivint sobre l'iframe. Llavors, l'usuari de la pàgina quan intenta entrar les dades no veu el que escriu e immediatament pot parar d'escriure o reiniciar el navegador.&lt;br /&gt;
&lt;br /&gt;
'''Com podem prevenir l'atac?'''&lt;br /&gt;
&lt;br /&gt;
Hi ha moltes maneres, però la més senzilla i efectiva és desactivar els iframes si la teva pàgina no els utilitza. com ho fem?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv=&amp;quot;X-Frame-Options&amp;quot; content=&amp;quot;deny&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==COOKIES==&lt;br /&gt;
&lt;br /&gt;
Són arxius de text, de reduïda grandària, que un lloc web pot gravar al dics dur de l'equip client, amb la finalitat d'emmagatzemar informació relativa a l'usuari o a les seves preferències.&lt;br /&gt;
&lt;br /&gt;
    *No són perilloses: no contenen virus, troians, scripts, ni cap tipus de codi maliciós.&lt;br /&gt;
    *Han de seguir una estructura molt concreta per poder ser emmagatzemades.&lt;br /&gt;
    *No poden sobrepassar una determinada grandària.&lt;br /&gt;
&lt;br /&gt;
Les galetes poden emmagatzemar:&lt;br /&gt;
&lt;br /&gt;
    *Preferències estètiques de l'usuari.&lt;br /&gt;
    *Dades de l'usuari: login i contrasenya, número de targeta bancària, etc.&lt;br /&gt;
    *Si les galetes contenen informació confidencial, sí que representen un perill potencial. Cal fer servir mecanismes d'encriptació i desencriptació de dades.&lt;br /&gt;
&lt;br /&gt;
Les galetes són específiques de cada navegador: les que han estat gravades per un navegador no poden ser llegides per un altre. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;nombre&amp;gt;=&amp;lt;valor&amp;gt;; expires=&amp;lt;fecha&amp;gt;; max-age=&amp;lt;segundos&amp;gt;; path=&amp;lt;ruta&amp;gt;; domain=&amp;lt;dominio&amp;gt;; secure; httponly;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Los parámetros son:&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;nombre&amp;gt;=&amp;lt;valor&amp;gt;''&lt;br /&gt;
    Requerido. &amp;lt;nombre&amp;gt; es el nombre (key) que identifica la cookie y &amp;lt;valor&amp;gt; es su valor. A diferencia de las cookies en PHP, en JavaScript se puede crear una cookie con un valor vacío (&amp;lt;nombre&amp;gt;=).&lt;br /&gt;
&lt;br /&gt;
''expires=&amp;lt;fecha&amp;gt; y max-age=&amp;lt;segundos&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
    Opcional. Ambos parámetros especifican el tiempo de validez de la cookie. expires establece una fecha (ha de estar en formato UTC) mientras que max-age establece una duración máxima en segundos. max-age toma preferencia sobre expires. Si no se especifica ninguno de los dos se creará una session cookie. Si es max-age=0 o expires=fecha-pasada la cookie se elimina.&lt;br /&gt;
&lt;br /&gt;
''path=&amp;lt;ruta&amp;gt;''&lt;br /&gt;
    Opcional. Establece la ruta para la cuál la cookie es válida. Si no se especifica ningún valor, la cookie será válida para la ruta la página actual.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''domain=&amp;lt;dominio&amp;gt;''&lt;br /&gt;
    Opcional. Dentro del dominio actual, subdominio para el que la cookie es válida. El valor predeterminado es el subdominio actual. Establecer domain=.miweb.com para una cookie que sea válida para cualqueir subdominio (nota el punto delante del nombre del dominio). Por motivos de seguridad, los navegadores no permiten crear cookies para dominios diferentes al que crea la cookie (same-origin policy).&lt;br /&gt;
&lt;br /&gt;
''secure''&lt;br /&gt;
    Opcional. Parámetro sin valor. Si está presente la cookie sólo es válida para conexiones encriptadas (por ejemplo mediante protocolo HTTPS).&lt;br /&gt;
&lt;br /&gt;
''HttpOnly''&lt;br /&gt;
    Opcional. Parámetro no disponible en JavaScript ya que crea cookies válidas sólo para protocolo HTTP/HTTPS y no para otras APIs, incluyendo JavaScript.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CREAR COOKIES'''&lt;br /&gt;
&lt;br /&gt;
https://cybmeta.com/cookies-en-javascript&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
document.cookie = &amp;quot;nombrecookie=valorcookie; max-age=3600; path=/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
document.cookie = &amp;quot;comida_favorita=arroz; max-age=3600; path=/&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vas a utilizar el parámetro expires, recuerda que ha de ser una fecha en formato UTC. Te puede ser de ayuda el método Date.toUTCString(). Por ejemplo, una cookie con caducidad para el 1 de Febrero del año 2068 a las 11:20:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
var expiresdate = new Date(2068, 1, 02, 11, 20);&lt;br /&gt;
var cookievalue = &amp;quot;Hola Mundo!&amp;quot;;&lt;br /&gt;
document.cookie = &amp;quot;testcookie=&amp;quot; + encodeURIComponent( cookievalue ) + &amp;quot;; expires=&amp;quot; + expiresdate.toUTCString();&lt;br /&gt;
document.cookie = &amp;quot;color_favorito=amarillo&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Recuerda también que si no se específica fecha de caducidad la cookie será válida sólo para la sesión actual.&lt;br /&gt;
&lt;br /&gt;
'''MODIFICAR COOKIES'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Supongamos que estamos en &amp;quot;miweb.com/blog&amp;quot;&lt;br /&gt;
// y creamos las siguientes cookies&lt;br /&gt;
&lt;br /&gt;
// Creamos la cookie para el path &amp;quot;/&amp;quot;&lt;br /&gt;
document.cookie = &amp;quot;nombre=Miguel; path=/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Con la siguiente linea se crea una nueva cookie para el path &amp;quot;/blog&amp;quot; (valor por defecto)&lt;br /&gt;
// pero no se modifica la cookie &amp;quot;nombre&amp;quot; anterior porque era para un path diferente&lt;br /&gt;
document.cookie = &amp;quot;nombre=Juan&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Con la siguiente línea SI se modifica la cookie &amp;quot;nombre&amp;quot; del path &amp;quot;/&amp;quot; correctamente&lt;br /&gt;
document.cookie = &amp;quot;nombre=Juan; path=/&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ELIMINAR COOKIES'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
document.cookie = &amp;quot;nombre=Miguel&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Si queremos eliminarla:&lt;br /&gt;
&lt;br /&gt;
document.cookie = &amp;quot;nombre=; expires=Thu, 01 Jan 1970 00:00:00 UTC&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// O con max-age&lt;br /&gt;
document.cookie = &amp;quot;nombre=; max-age=0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Se crean dos cookies con el mismo identificador&lt;br /&gt;
// para dos paths diferentes&lt;br /&gt;
document.cookie = &amp;quot;nombre=Miguel; path=/noticias&amp;quot;;&lt;br /&gt;
document.cookie = &amp;quot;nombre=Juan; path=/blog&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Solo se elimina la cookie del path /noticias&lt;br /&gt;
document.cookie = &amp;quot;nombre=; max-age=0; path=/noticias&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''LEER y OBTENER el valor de las cookies'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Se crean dos cookies para dos subdominios diferentes&lt;br /&gt;
document.cookie = &amp;quot;cookienoticias=valorcn; domain=noticias.miweb.com&amp;quot;;&lt;br /&gt;
document.cookie = &amp;quot;cookietienda=valorct; domain=tienda.miweb.com&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
var lasCookies = document.cookie;&lt;br /&gt;
alert( lasCookies );&lt;br /&gt;
// Obtendremos cookienoticias=valorcn&lt;br /&gt;
// No podemos acceder a la cookie cookietienda&lt;br /&gt;
// porque es válida solo para tienda.miweb.com y estamos en noticias.miweb.com&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Paràmetre Expires'''&lt;br /&gt;
&lt;br /&gt;
Informar el paràmetre expires és necessari per a que una cookie es conservi un cop tancat el navegador. El més recomanable, doncs, és informar el paràmetre expires amb la data d'aquí a un any o d'aquí a un mes.&lt;br /&gt;
&lt;br /&gt;
com veiem al següent codi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// cookie que caducarà en un any&lt;br /&gt;
var data = new Date();&lt;br /&gt;
data.setFullYear(data.getFullYear() +1);&lt;br /&gt;
document.cookie=&amp;quot;cookie1=Aquesta cookie caducarà d'aquí a un any; expires=&amp;quot;+data.toUTCString()+&amp;quot;;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// cookie que caducarà en un mes&lt;br /&gt;
data = new Date();&lt;br /&gt;
data.setMonth(CookieDate.getMonth() +1);&lt;br /&gt;
document.cookie=&amp;quot;cookie2=Aquesta cookie caducarà d'aquí a un mes; expires=&amp;quot;+data.toUTCString()+&amp;quot;;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANT:'''&lt;br /&gt;
&lt;br /&gt;
*A Chrome no funcionen les cookies en local (file:///)&lt;br /&gt;
&lt;br /&gt;
*A Firefox funcionen les cookies en local però no es conserven un cop tanquem el navegador&lt;br /&gt;
&lt;br /&gt;
*Per tant, quan fem exercicis de cookies usarem un hosting http (apache o similar)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==EXERCICIS==&lt;br /&gt;
===Cookies 1===&lt;br /&gt;
&lt;br /&gt;
Crea una pàgina que guardi el nom de l'usuari en cookies:&lt;br /&gt;
&lt;br /&gt;
-la pàgina mostrarà en carregar el nom que hi ha emmagatzemat a les cookies&lt;br /&gt;
&lt;br /&gt;
-a la part superior hi haurà un botó amb l'etiqueta &amp;quot;login&amp;quot; que ens enviarà a una pàgina auxiliar amb un camp de text per introduir el nom, un botó que escriurà la cookie i tornarà a la pàgina principal. També hi haurà un enllaç a la pàgina principal que ens permetrà interrompre el procés sense escriure la cookie.&lt;br /&gt;
&lt;br /&gt;
===Cookies 2===&lt;br /&gt;
Adapta l'exercici anterior de forma que l'usuari també entri els cognoms:&lt;br /&gt;
&lt;br /&gt;
-la pàgina mostrarà en carregar el nom i cognoms que hi ha emmagatzemats a les cookies&lt;br /&gt;
&lt;br /&gt;
-La pàgina auxiliar tindrà un nou camp de text que permetrà introduir els cognoms a l'usuari.&lt;br /&gt;
&lt;br /&gt;
===Cookies 3===&lt;br /&gt;
Adapta l'exercici anterior de forma que l'usuari també pugui escollir el color de fons de la pàgina i es guardi en una cookie:&lt;br /&gt;
&lt;br /&gt;
-la pàgina mostrarà en carregar el nom i cognoms que hi ha emmagatzemats a les cookies i canviarà el color del fons de pàgina a l'emmagatzemat a les cookies.&lt;br /&gt;
&lt;br /&gt;
-Afegeix a la pàgina auxiliar 4 radio buttons que ens permetrà escollir el color de fons. El color escollit es guardarà a les cookies. Pots usar la pàgina https://htmlcolorcodes.com/color-names/ per a escollir els 4 possibles colors.&lt;br /&gt;
&lt;br /&gt;
===Cookies 4===&lt;br /&gt;
Adapta l'exercici anterior de forma que es mostri al peu de pàgina la data i hora de l'última visita:&lt;br /&gt;
&lt;br /&gt;
-la pàgina mostrarà en carregar el nom i cognoms que hi ha emmagatzemats a les cookies, canviarà el color del fons de pàgina a l'emmagatzemat a les cookies i mostrarà la data i hora de l'última visita emmagatzemada a les cookies. A continuació escriurà la data i hora actuals a les cookies. &lt;br /&gt;
&lt;br /&gt;
indicació: el mètode '''toLocaleString()''' aplicat a un objecte Date ens retorna el seu valor en format &amp;quot;dd/mm/aaaa hh:mm:ss&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==LOCALSTORAGE==&lt;br /&gt;
&lt;br /&gt;
'''localStorage vs Cookies'''&lt;br /&gt;
&lt;br /&gt;
La mejor forma de entender por qué es necesario el localStorage es indicando los tres grandes problemas de las cookies:&lt;br /&gt;
&lt;br /&gt;
    *Espacio limitado: Una cookie sólo puede ocupar 4kb de espacio. Es por eso que las cookies suelen utilizarse sólo para almacenar un hash o un identificador que será utilizado por el servidor para identificar la visita.&lt;br /&gt;
    *Cada vez que se realiza una petición al servidor, toda la información que está almacenada en las cookies es enviada y también es recibida nuevamente con la respuesta del servidor. O sea, en los intercambios de información entre el navegador web y el servidor siempre van pegadas las cookies.&lt;br /&gt;
    *Las cookies tienen una caducidad.&lt;br /&gt;
&lt;br /&gt;
Y aquí viene localStorage a solucionarlos la vida!&lt;br /&gt;
&lt;br /&gt;
    *Espacio menos limitado: localStorage puede ocupar entre 5 y 10MB dependiendo del navegador web. Con 5 o 10 megas ya podemos tener algo más de información&lt;br /&gt;
    *La información almacenada con localStorage no es enviada al servidor en cada petición.&lt;br /&gt;
    *No existe una caducidad para localStorage, la información quedará almacenada hasta que se elimine expresamente. Aunque se cierre el navegador.&lt;br /&gt;
&lt;br /&gt;
Una cookie tiene caducidad, pero le puedes poner que caduque dentro de 1 año… vale, sí… pero caduca, con localStorage nos olvidamos de tener que guardar la cookie aumentando el tiempo de caducidad.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, que la información persista en el tiempo, no siempre es una buena idea. A veces lo que interesa es que la información se elimina una vez se cierre el navegador. Para estos casos, en vez de utilizar localStorage, se debe usar sessionStorage.&lt;br /&gt;
&lt;br /&gt;
El sessionStorage es exactamente igual que localStorage, pero con la salvedad de que una vez cerrado el navegador se pierde la información, todo lo demás es lo mismo. Si se quiere trabajar con sessionStorage, sólo hay que coger todo el código de este articulo y donde pone localStorage cambiarlo por sessionStorage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''La API del localStorage'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Almacenar un valor localStorage&lt;br /&gt;
&lt;br /&gt;
Para '''guardar''' la información utilizamos el método setItem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    localStorage.setItem('key', 'value');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De esta forma, en nuestro espacio de almacenamiento local, tendremos un elemento llamado key y que tendrá por valor value.&lt;br /&gt;
Recuperar un valor localStorage&lt;br /&gt;
&lt;br /&gt;
Para '''recuperar''' la información utilizamos el método getItem:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var value = localStorage.getItem('key');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este código Javascript almacena en la variable value el contenido almacenado para key.&lt;br /&gt;
Cómo saber el '''número de elementos''' almacenados en localStorage&lt;br /&gt;
&lt;br /&gt;
La API asociada permite el uso de length para conocer cuantos elementos están guardados en localStorage.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    alert(localStorage.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al ejecutar este código, nos aparecería una alerta con el número de elementos almacenados en nuestro espacio local.&lt;br /&gt;
Borrar un elemento localStorage&lt;br /&gt;
&lt;br /&gt;
Como es lógico, la API también permite '''eliminar''' un elemento que tengamos guardado. Para ello utilizamos el método removeItem&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    localStorage.removeItem('key');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Limitaciones del localStorage'''&lt;br /&gt;
&lt;br /&gt;
Más que limitaciones, deberíamos hablar de la gran limitación: Sólo podemos almacenar cadenas de texto. O sea, no podemos guardar booleanos (true o false), no podemos guardar arrays, objetos, floats... sólo strings.&lt;br /&gt;
&lt;br /&gt;
Estamos ante una gran limitación… pero podemos superarla con unas pocas líneas de código!! ¿cómo? pues con ese “recurso” que cada vez cobra más fuerza: '''JSON'''.&lt;br /&gt;
&lt;br /&gt;
Los navegadores que soportan localStorage (o sea, los modernos), también tienen soporte para JSON. Gracias a JSON podremos convertir un objeto (o lo que esa) en cadena de texto y almacenarlo en nuestro localStorage. Al mismo tiempo, con JSON podremos transformar la cadena recuperada de localStorage al objeto inicial &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    // Creamos un objeto&lt;br /&gt;
    var object = { 'uno' : '1', 'dos' : '2' };&lt;br /&gt;
    // Lo guardamos en localStorage pasandolo a cadena con JSON&lt;br /&gt;
    localStorage.setItem('key', JSON.stringify(object));    //JSON.stringify: convierte un JSON a un String&lt;br /&gt;
    // Creamos una nueva variable object2 con el valor obtenido de localStorage usando JSON recuperar el objeto inicial&lt;br /&gt;
    var object2 = JSON.parse(localStorage.getItem('key'));  //JSON.parse convierte un string con formato JSON a JSON.&lt;br /&gt;
    // La alerta mostrará 1 por pantalla&lt;br /&gt;
    alert(object2.uno);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI'''&lt;br /&gt;
&lt;br /&gt;
* Adapta el quart exercici de cookies de forma que usi Localstorage enlloc de cookies.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Tenemos dos inputs en los cuales introducimos una serie de datos y luego lo almacenamos en el localstogare y lo mostramos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Solució:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Ejemplo LocalStorage&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;h1&amp;gt;Ejemplo - localStorage&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;Nombre&amp;quot; id=&amp;quot;nombretxt&amp;quot;&amp;gt; &amp;lt;br&amp;gt;  &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;Apellido&amp;quot; id=&amp;quot;apellidotxt&amp;quot;&amp;gt;&amp;lt;br&amp;gt;  &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;button id=&amp;quot;boton-guardar&amp;quot; onclick='evento()'&amp;gt;Guardar&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
function evento(){&lt;br /&gt;
&lt;br /&gt;
	 /*Captura de datos escrito en los inputs*/&lt;br /&gt;
                var nom = document.getElementById(&amp;quot;nombretxt&amp;quot;).value;&lt;br /&gt;
                var apel = document.getElementById(&amp;quot;apellidotxt&amp;quot;).value;&lt;br /&gt;
                /*Guardando los datos en el LocalStorage*/&lt;br /&gt;
                localStorage.setItem(&amp;quot;Nombre&amp;quot;, nom);&lt;br /&gt;
                localStorage.setItem(&amp;quot;Apellido&amp;quot;, apel);&lt;br /&gt;
                /*Limpiando los campos o inputs*/&lt;br /&gt;
   &lt;br /&gt;
                console.log( localStorage.getItem('Nombre'));&lt;br /&gt;
                console.log( localStorage.getItem('Apellido'));&lt;br /&gt;
}&lt;br /&gt;
           &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Ejemplo LocalStorage&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        /*Funcion de Capturar, Almacenar datos y Limpiar campos*/&lt;br /&gt;
        $(document).ready(function(){&lt;br /&gt;
            $('#boton-guardar').click(function(){&lt;br /&gt;
                /*Captura de datos escrito en los inputs*/&lt;br /&gt;
                var nom = document.getElementById(&amp;quot;nombretxt&amp;quot;).value;&lt;br /&gt;
                var apel = document.getElementById(&amp;quot;apellidotxt&amp;quot;).value;&lt;br /&gt;
                /*Guardando los datos en el LocalStorage*/&lt;br /&gt;
                localStorage.setItem(&amp;quot;Nombre&amp;quot;, nom);&lt;br /&gt;
                localStorage.setItem(&amp;quot;Apellido&amp;quot;, apel);&lt;br /&gt;
                /*Limpiando los campos o inputs*/&lt;br /&gt;
                document.getElementById(&amp;quot;nombretxt&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
                document.getElementById(&amp;quot;apellidotxt&amp;quot;).value = &amp;quot;&amp;quot;;&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        /*Funcion Cargar y Mostrar datos*/&lt;br /&gt;
        $(document).ready(function(){&lt;br /&gt;
            $('#boton-cargar').click(function(){&lt;br /&gt;
                /*Obtener datos almacenados*/&lt;br /&gt;
                var nombre = localStorage.getItem(&amp;quot;Nombre&amp;quot;);&lt;br /&gt;
                var apellido = localStorage.getItem(&amp;quot;Apellido&amp;quot;);&lt;br /&gt;
                /*Mostrar datos almacenados*/&lt;br /&gt;
                document.getElementById(&amp;quot;nombre&amp;quot;).innerHTML = nombre;&lt;br /&gt;
                document.getElementById(&amp;quot;apellido&amp;quot;).innerHTML = apellido;&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;h1&amp;gt;Ejemplo - localStorage&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;Nombre&amp;quot; id=&amp;quot;nombretxt&amp;quot;&amp;gt; &amp;lt;br&amp;gt;  &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;Apellido&amp;quot; id=&amp;quot;apellidotxt&amp;quot;&amp;gt;&amp;lt;br&amp;gt;  &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;button id=&amp;quot;boton-guardar&amp;quot;&amp;gt;Guardar&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;hr /&amp;gt;&lt;br /&gt;
    Nombre almacenado:&lt;br /&gt;
    &amp;lt;label type=&amp;quot;text&amp;quot; id=&amp;quot;nombre&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    Apellido almacenado:&lt;br /&gt;
    &amp;lt;label &amp;quot;text&amp;quot; id=&amp;quot;apellido&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button id=&amp;quot;boton-cargar&amp;quot;&amp;gt;&lt;br /&gt;
        Cargar elementos&lt;br /&gt;
    &amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Session Storage'''&lt;br /&gt;
&lt;br /&gt;
Almacena los datos de una sesión y éstos se eliminan cuando el navegador se cierra.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Syntax for SAVING data to sessionStorage:'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sessionStorage.setItem(&amp;quot;key&amp;quot;, &amp;quot;value&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Syntax for READING data from sessionStorage:'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var lastname = sessionStorage.getItem(&amp;quot;key&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Syntax for REMOVING saved data from sessionStorage:'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sessionStorage.removeItem(&amp;quot;key&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Syntax for REMOVING ALL saved data from sessionStorage:'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
sessionStorage.clear();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exercici'''&lt;br /&gt;
&lt;br /&gt;
Utilitzar el exercici anterior però per a que durar una sessió&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Politica de seguretat : &amp;quot;El mateix Origen&amp;quot; ==&lt;br /&gt;
La política de &amp;quot;mateix origen&amp;quot; limita l'accés d'una finestra a una altra.&lt;br /&gt;
La raó darrere d'això és la seguretat. Si tens ''blabla.com'' en una finestra i gmail.com en un altre, llavors no voldries que un script des de ''blabla.com'' pugui accedir o modificar el teu correu electrònic o executar accions en gmail en nom teu.&lt;br /&gt;
&lt;br /&gt;
L'essència de la política del mateix origen pot formular-se com: les finestres poden comunicar-se entre elles només si són del mateix protocol://domini: port o, en breument, del mateix origen.&lt;br /&gt;
&lt;br /&gt;
Aquest exemples son del mateix origen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://site.com&lt;br /&gt;
http://site.com/&lt;br /&gt;
http://site.com/my/page.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquestes altres, en canvi, son s'origen diferent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://www.site.com (another domain)&lt;br /&gt;
http://site.org (another domain)&lt;br /&gt;
https://site.com (another protocol)&lt;br /&gt;
http://site.com:8080 (another port)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Missatges entre diferents finestres ==&lt;br /&gt;
La API per l'intercanvi de missatges entre diferents finestres és compatible amb tots els navegadors moderns, incloent IE8. Permet finestres / marcs de diversos dominis comunicar-se entre si. Per fer-ho s'utilitza el mètode postMessage.&lt;br /&gt;
&lt;br /&gt;
El mètode window.postMessage permet la comunicació entre scripts amb seguretat. Normalment, els scripts de diferents pàgines se'ls permet comunicar si i només si les pàgines on son executats es troben en llocs amb el mateix protocol (http), el mateix port (80 és el valor predeterminat para HTTP), i domini (document.domain ha d'estar configurat a les dues pàgines amb el mateix valor).&lt;br /&gt;
''Window.postMessage proporciona un mecanisme controlat per eludir aquesta restricció'' d'una manera que és segura quan s'usa correctament.&lt;br /&gt;
&lt;br /&gt;
Sintaxi :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
window.postMessage(data, targetDomain)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ''data'' : El missatge a enviar. La especificació diu que pot ser qualsevol tipus d'objecte, però a la pràctica la majoria de navegadors només implementen strings.&lt;br /&gt;
* ''targetDomain'' : el domini de la pàgina a la qual va dirigit el missatge.&lt;br /&gt;
&lt;br /&gt;
'''El receptor del missatge'''&lt;br /&gt;
El receptor del missatge ha d'implementar un event per tal d'agafar la informació:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;test&amp;quot;&amp;gt;Envia'm un missatge!&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if (window.addEventListener){&lt;br /&gt;
   addEventListener(&amp;quot;message&amp;quot;, listener, false);    //Per altres Navegadors compatibles&lt;br /&gt;
} else {&lt;br /&gt;
   attachEvent(&amp;quot;onmessage&amp;quot;, listener);              //Per al navegador Microsoft Explorer&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function listener(event){&lt;br /&gt;
  if ( event.origin !== &amp;quot;http://javascript.info&amp;quot; )&lt;br /&gt;
    return   document.getElementById(&amp;quot;test&amp;quot;).innerHTML = &amp;quot;received: &amp;quot;+ event.data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* event.origin : contè la informació del domini REAL d'on prové el missatge. No hi ha manera de que un hacker ho reemplaci.&lt;br /&gt;
&lt;br /&gt;
Altres propietats de event:&lt;br /&gt;
*event.source : conté la referència a la finestra que t'envia el missatge. Pot contestar al missatge enviat de la següent manera : event.source.postMessage(&amp;quot;missatge de resposta&amp;quot;, event.origin);&lt;br /&gt;
*event.data : El primer paràmetre de postMessage();&lt;br /&gt;
&lt;br /&gt;
Nota: IE8 no deixa comunicar-se entre pestanyes. Només amb iframes.&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Intercanvi de missatges entre finestres ===&lt;br /&gt;
&lt;br /&gt;
* Crea una página en la que pregunti un text a l'usuari. Envia aquest text a una altre pestanya i escriu-la al html.&lt;br /&gt;
* Modifica el programa anterior per tal que la finestra que reb el missatge comuniqui a la finestra que l'envia que l'ha rebut correctament.&lt;br /&gt;
&lt;br /&gt;
:[[solució Finestres1]]&lt;br /&gt;
&lt;br /&gt;
:[[solució Finestres2]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OBJECTE DATE ==&lt;br /&gt;
&lt;br /&gt;
Javascript disposa dels objectes Date per a tractar amb dates. Internament, el sistema emmagatzema els milisegons transcorreguts des de les 0 hores de l'1 de gener del 1970 a la data que assignem a l'objecte Date.&lt;br /&gt;
&lt;br /&gt;
crearem un objecte date usant el constructor Date. Aquest constructor pot prendre quatre formes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
new Date();&lt;br /&gt;
new Date(milliseconds);&lt;br /&gt;
new Date(dateString);&lt;br /&gt;
new Date(year, month, day, hours, minutes, seconds, milliseconds);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les més útils ens seran la primera i la quarta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Date sense parametres crea un objecte amb la data actual del sistema&lt;br /&gt;
var data1 =new Date();&lt;br /&gt;
&lt;br /&gt;
// Si li passem més d'un paràmetre els interpretarà com a &lt;br /&gt;
// year, month, day, hours, minutes, seconds, milliseconds (per aquest ordre)&lt;br /&gt;
// &lt;br /&gt;
// important: els mesos estan numerats de 0 a 11 (0=gener, ... , 11=desembre)&lt;br /&gt;
&lt;br /&gt;
// 0:0 del 28/10/2021:&lt;br /&gt;
var data2 = new Date(2021,9,28);&lt;br /&gt;
&lt;br /&gt;
// 11:15 del 28/10/2021:&lt;br /&gt;
var data3 = new Date(2021,9,28,11,15);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per a fer operacions amb dates hem de tenir en compte que internament s'emmagatzemen com a milisegons entre dues dates. Per exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var d1 = new Date(2021,0,1);&lt;br /&gt;
var d2 = new Date(2022,0,1);&lt;br /&gt;
&lt;br /&gt;
var d3=(d2-d1)/1000/3600/24;&lt;br /&gt;
&lt;br /&gt;
document.write(d3+&amp;quot; dies transcorreguts&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Documentació a https://momentjs.com/&lt;br /&gt;
&lt;br /&gt;
Per a activar -&amp;gt;  moment.locale('ca');&lt;br /&gt;
&lt;br /&gt;
'''cnd'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://momentjs.com/downloads/moment.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://momentjs.com/downloads/moment-with-locales.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Exercicis==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Obtindre la diferència entre dies i hores. diff&lt;br /&gt;
&lt;br /&gt;
*Cambiar el formato 25||12||1995 _(00.00)_&lt;br /&gt;
&lt;br /&gt;
*afegir un dia i un mes.&lt;br /&gt;
&lt;br /&gt;
*es vol restar 7 dies i 1 mes.&lt;br /&gt;
	&lt;br /&gt;
*Diferència entre dos dates.&lt;br /&gt;
	&lt;br /&gt;
*consultar si la data actual es posterior a 10/10/25&lt;br /&gt;
&lt;br /&gt;
*consultar si la data 10/02/19 es posterior a la actual&lt;br /&gt;
	&lt;br /&gt;
* consulta si es igual o anterior&lt;br /&gt;
&lt;br /&gt;
*consulta si la data 19/02/14 es anterior a la actual&lt;br /&gt;
&lt;br /&gt;
* Consulta si la data actual esta dins del periode 20/03/17 i 23/07/25  &lt;br /&gt;
&lt;br /&gt;
*volem humanitzar una data&lt;br /&gt;
&lt;br /&gt;
*en 6 minutos (humanizar)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
*Obtener la diferencia entre dias y horas. diff&lt;br /&gt;
&lt;br /&gt;
var fecha1 = moment('2016-07-12');&lt;br /&gt;
var fecha2 = moment('2016-08-01');&lt;br /&gt;
&lt;br /&gt;
console.log(fecha2.diff(fecha1, 'days'), ' dias de diferencia');&lt;br /&gt;
console.log(fecha2.diff(fecha1, 'hours'), ' dias de diferencia');&lt;br /&gt;
&lt;br /&gt;
var fecha1 = moment('14/11/2018 19:15:00', 'DD/MM/YYYY HH:mm:ss');&lt;br /&gt;
var fecha2 = moment('17/11/2018 09:45:30', 'DD/MM/YYYY HH:mm:ss');&lt;br /&gt;
fecha2.diff(fecha1, 'minutes');&lt;br /&gt;
fecha2.diff(fecha1, 'minutes', true); //sin redondeo&lt;br /&gt;
&lt;br /&gt;
*Cambiar el formato 25||12||1995 _(00.00)_&lt;br /&gt;
&lt;br /&gt;
moment(&amp;quot;1995-12-25&amp;quot;).format('DD||MM||YYYY _(HH.mm)_');&lt;br /&gt;
&lt;br /&gt;
*afegir un dia i un mes.&lt;br /&gt;
&lt;br /&gt;
// Sumar 7 dias a la fecha actual&lt;br /&gt;
moment().add(7, 'days');&lt;br /&gt;
 &lt;br /&gt;
// Forma abreviada de escribirlo&lt;br /&gt;
moment().add(7, 'd');&lt;br /&gt;
 &lt;br /&gt;
// Sumar 1 mes a la fecha actual &lt;br /&gt;
moment().add(1, 'months');&lt;br /&gt;
&lt;br /&gt;
*es vol restar 7 dies, 1 mes.&lt;br /&gt;
	&lt;br /&gt;
// Restar 7 dias a la fecha actual&lt;br /&gt;
moment().subtract(7, 'days');&lt;br /&gt;
 &lt;br /&gt;
// Forma abreviada de escribirlo&lt;br /&gt;
moment().subtract(7, 'd');&lt;br /&gt;
 &lt;br /&gt;
// Restar 1 mes a la fecha actual &lt;br /&gt;
moment().subtract(1, 'months');&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*consultar si la data actual es posterior a 10/10/25&lt;br /&gt;
&lt;br /&gt;
*consultar si la data 10/02/19 es posterior a la actual&lt;br /&gt;
	&lt;br /&gt;
// Consulta si es posterior&lt;br /&gt;
moment('2018-08-11').isAfter('2018-08-10');&lt;br /&gt;
// Devuelve true&lt;br /&gt;
moment('2018-08-11').isAfter('2018-08-11');&lt;br /&gt;
&lt;br /&gt;
* consulta si es igual o anterior&lt;br /&gt;
// Consulta si es igual o posterior&lt;br /&gt;
moment('2018-08-11').isSameOrAfter('2018-08-10');&lt;br /&gt;
&lt;br /&gt;
*consulta si la data 19/02/14 es anterior a la actual&lt;br /&gt;
&lt;br /&gt;
// Consulta si es anterior&lt;br /&gt;
moment('2018-08-11').isBefore('2018-08-10');&lt;br /&gt;
// Consulta si es igual o anterior&lt;br /&gt;
moment('2018-08-11').isSameOrBefore('2018-08-10');&lt;br /&gt;
// Devuelve false&lt;br /&gt;
moment('2018-08-11').isSameOrBefore('2018-08-11'); &lt;br /&gt;
// Devuelve true &lt;br /&gt;
&lt;br /&gt;
* Consulta si la data actual esta dins del periode 20/03/17 i 23/07/25  &lt;br /&gt;
&lt;br /&gt;
moment('2018-08-11').isBetween('2018-08-30', '2018-08-01');  // tiene encuenta el orden dentro del between&lt;br /&gt;
// Devuelve false&lt;br /&gt;
moment('2018-08-11').isBetween('2018-08-01', '2018-08-30'); &lt;br /&gt;
// Devuelve true&lt;br /&gt;
moment('2018-08-11').isBetween('2018-08-30', '2018-08-01');&lt;br /&gt;
&lt;br /&gt;
*volem humanitzar una data&lt;br /&gt;
&lt;br /&gt;
moment.duration(-1, &amp;quot;days&amp;quot;).humanize(true);&lt;br /&gt;
var a = moment.duration(24, &amp;quot;hours&amp;quot;).humanize(true);&lt;br /&gt;
&lt;br /&gt;
*en 6 minutos (humanizar)&lt;br /&gt;
&lt;br /&gt;
moment.duration(6, &amp;quot;minutes&amp;quot;).humanize(true)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.w3resource.com/javascript-exercises/javascript-date-exercises.php&lt;br /&gt;
&lt;br /&gt;
https://momentjs.com/&lt;br /&gt;
&lt;br /&gt;
https://devhints.io/moment&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17331</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17331"/>
				<updated>2023-05-16T15:19:17Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Solucions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb XMLHttpRequest==&lt;br /&gt;
&lt;br /&gt;
Per a cada exercici es proporciona els programa PHP de servidor necessari.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:si es crida: http://URL-servidor/exercici4.php?q=barcelona&lt;br /&gt;
:retorna: ---------,Ciutat Vella,Eixample,Sants-Montuïc,Les Corts,Gràcia&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:si es crida: http://URL-servidor/exercici6.php?q=e&lt;br /&gt;
:retorna: &amp;lt;source&amp;gt;Eva&amp;lt;br&amp;gt;Eve&amp;lt;br&amp;gt;Evita&amp;lt;br&amp;gt;Elizabeth&amp;lt;br&amp;gt;Ellen&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Axios==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Axios&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Fetch==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Fetch&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17251</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17251"/>
				<updated>2023-04-18T16:57:40Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici 6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb XMLHttpRequest==&lt;br /&gt;
&lt;br /&gt;
Per a cada exercici es proporciona els programa PHP de servidor necessari.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:si es crida: http://URL-servidor/exercici4.php?q=barcelona&lt;br /&gt;
:retorna: ---------,Ciutat Vella,Eixample,Sants-Montuïc,Les Corts,Gràcia&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:si es crida: http://URL-servidor/exercici6.php?q=e&lt;br /&gt;
:retorna: &amp;lt;source&amp;gt;Eva&amp;lt;br&amp;gt;Eve&amp;lt;br&amp;gt;Evita&amp;lt;br&amp;gt;Elizabeth&amp;lt;br&amp;gt;Ellen&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Axios==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Axios&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Fetch==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Fetch&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17250</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17250"/>
				<updated>2023-04-18T16:57:11Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici 6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb XMLHttpRequest==&lt;br /&gt;
&lt;br /&gt;
Per a cada exercici es proporciona els programa PHP de servidor necessari.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:si es crida: http://URL-servidor/exercici4.php?q=barcelona&lt;br /&gt;
:retorna: ---------,Ciutat Vella,Eixample,Sants-Montuïc,Les Corts,Gràcia&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:si es crida: http://URL-servidor/exercici6.php?q=e&lt;br /&gt;
:retorna: &amp;lt;notextile&amp;gt;Eva&amp;lt;br&amp;gt;Eve&amp;lt;br&amp;gt;Evita&amp;lt;br&amp;gt;Elizabeth&amp;lt;br&amp;gt;Ellen&amp;lt;/notextile&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Axios==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Axios&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Fetch==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Fetch&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17249</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17249"/>
				<updated>2023-04-18T16:52:57Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici 6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb XMLHttpRequest==&lt;br /&gt;
&lt;br /&gt;
Per a cada exercici es proporciona els programa PHP de servidor necessari.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:si es crida: http://URL-servidor/exercici4.php?q=barcelona&lt;br /&gt;
:retorna: ---------,Ciutat Vella,Eixample,Sants-Montuïc,Les Corts,Gràcia&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:si es crida: http://URL-servidor/exercici6.php?q=e&lt;br /&gt;
:retorna: Eva\&amp;lt;br&amp;gt;Eve&amp;lt;br&amp;gt;Evita&amp;lt;br&amp;gt;Elizabeth&amp;lt;br&amp;gt;Ellen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Axios==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Axios&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Fetch==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Fetch&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17248</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17248"/>
				<updated>2023-04-18T16:50:15Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb XMLHttpRequest==&lt;br /&gt;
&lt;br /&gt;
Per a cada exercici es proporciona els programa PHP de servidor necessari.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:si es crida: http://URL-servidor/exercici4.php?q=barcelona&lt;br /&gt;
:retorna: ---------,Ciutat Vella,Eixample,Sants-Montuïc,Les Corts,Gràcia&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Axios==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Axios&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Fetch==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Fetch&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17247</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17247"/>
				<updated>2023-04-18T16:49:30Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb XMLHttpRequest==&lt;br /&gt;
&lt;br /&gt;
Per a cada exercici es proporciona els programa PHP de servidor necessari.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
:si es crida: http://URL-servidor/exercici4.php?q=barcelona&lt;br /&gt;
:retorna: ---------,Ciutat Vella,Eixample,Sants-Montuïc,Les Corts,Gràcia&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Axios==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Axios&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Fetch==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Fetch&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17246</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17246"/>
				<updated>2023-04-18T16:49:10Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb XMLHttpRequest==&lt;br /&gt;
&lt;br /&gt;
Per a cada exercici es proporciona els programa PHP de servidor necessari.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&lt;br /&gt;
:si es crida: http://URL-servidor/exercici4.php?q=barcelona&lt;br /&gt;
&lt;br /&gt;
retorna: ---------,Ciutat Vella,Eixample,Sants-Montuïc,Les Corts,Gràcia&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Axios==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Axios&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Fetch==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Fetch&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17245</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17245"/>
				<updated>2023-04-18T16:47:05Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb XMLHttpRequest==&lt;br /&gt;
&lt;br /&gt;
Per a cada exercici es proporciona els programa PHP de servidor necessari.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&lt;br /&gt;
si es crida: http://URL-servidor/exercici4.php?q=barcelona&lt;br /&gt;
&lt;br /&gt;
retorna: ---------,Ciutat Vella,Eixample,Sants-Montuïc,Les Corts,Gràcia&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Axios==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Axios&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Fetch==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Fetch&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17244</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17244"/>
				<updated>2023-04-18T16:46:31Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb XMLHttpRequest==&lt;br /&gt;
&lt;br /&gt;
Per a cada exercici es proporciona els programa PHP de servidor necessari.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
si es crida: http://URL-servidor/exercici4.php?q=barcelona&lt;br /&gt;
retorna: ---------,Ciutat Vella,Eixample,Sants-Montuïc,Les Corts,Gràcia&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Axios==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Axios&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Fetch==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Fetch&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17242</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17242"/>
				<updated>2023-04-14T16:20:47Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Solucions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb XMLHttpRequest==&lt;br /&gt;
&lt;br /&gt;
Per a cada exercici es proporciona els programa PHP de servidor necessari.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Axios==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Axios&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Fetch==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Fetch&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17241</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17241"/>
				<updated>2023-04-14T16:20:23Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici 6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb XMLHttpRequest==&lt;br /&gt;
&lt;br /&gt;
Per a cada exercici es proporciona els programa PHP de servidor necessari.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Axios==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Axios&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Fetch==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Fetch&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Exercici_6&amp;diff=17240</id>
		<title>Exercici 6</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Exercici_6&amp;diff=17240"/>
				<updated>2023-04-14T16:19:46Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Programa de servidor exercici6.php */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Programa de client '''exercici6.html''' amb objecte XMLHtmlRequest ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;exercici 6 AJAX&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;input&amp;quot;&amp;gt;&amp;lt;/input&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Suggeriments:&lt;br /&gt;
&amp;lt;div id=&amp;quot;contingut&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var xhr=new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
var contingut=document.getElementById(&amp;quot;contingut&amp;quot;);&lt;br /&gt;
var input=document.getElementById(&amp;quot;input&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
input.oninput=function () {&lt;br /&gt;
    xhr.open(&amp;quot;GET&amp;quot;,&amp;quot;exercici6.php?q=&amp;quot;+input.value);&lt;br /&gt;
    xhr.send(null);  &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
xhr.onreadystatechange=function (){&lt;br /&gt;
    if(xhr.readyState==4 &amp;amp;&amp;amp; xhr.status==200) {&lt;br /&gt;
       contingut.innerHTML=xhr.responseText;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programa de client '''exercici6.html''' amb FETCH ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;exercici 6 AJAX&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;input&amp;quot;&amp;gt;&amp;lt;/input&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Suggeriments:&lt;br /&gt;
&amp;lt;div id=&amp;quot;contingut&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var contingut=document.getElementById(&amp;quot;contingut&amp;quot;);&lt;br /&gt;
var input=document.getElementById(&amp;quot;input&amp;quot;);&lt;br /&gt;
input.oninput=function () {&lt;br /&gt;
    &lt;br /&gt;
    fetch(&amp;quot;exercici6.php?q=&amp;quot;+input.value)&lt;br /&gt;
    .then(  function(response){&lt;br /&gt;
                if(response.ok) {&lt;br /&gt;
                    return response.text()&lt;br /&gt;
                } else {&lt;br /&gt;
                    throw &amp;quot;Error a la crida Ajax&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            })&lt;br /&gt;
    .then(function(responseText){&lt;br /&gt;
        contingut.innerHTML=responseText;&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.log(err);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Programa de client '''exercici6.html''' amb AXIOS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;exercici 6 AJAX&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;input&amp;quot;&amp;gt;&amp;lt;/input&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Suggeriments:&lt;br /&gt;
&amp;lt;div id=&amp;quot;contingut&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var contingut=document.getElementById(&amp;quot;contingut&amp;quot;);&lt;br /&gt;
var input=document.getElementById(&amp;quot;input&amp;quot;);&lt;br /&gt;
input.oninput=function () {&lt;br /&gt;
    &lt;br /&gt;
    axios.get(&amp;quot;exercici6.php?q=&amp;quot;+input.value)&lt;br /&gt;
    .then(function(response){&lt;br /&gt;
        contingut.innerHTML=response.data;&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.log(err);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Exercici_4&amp;diff=17239</id>
		<title>Exercici 4</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Exercici_4&amp;diff=17239"/>
				<updated>2023-04-14T16:18:46Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Programa de servidor exercici4.php */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Programa de client '''exercici4.html''' amb objecte XMLHtmlRequest ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;exercici 4 AJAX&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;label&amp;gt;Escull una ciutat:&amp;lt;/label&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;select name=&amp;quot;ciutat&amp;quot; id=&amp;quot;ciutat&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;-&amp;quot;&amp;gt;---------&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;barcelona&amp;quot;&amp;gt;Barcelona&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;lacoruna&amp;quot;&amp;gt;La Coruña&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;madrid&amp;quot;&amp;gt;Madrid&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;sevilla&amp;quot;&amp;gt;Sevilla&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;label&amp;gt;Escull un barri:&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;barri&amp;quot; id=&amp;quot;barri&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;-&amp;quot;&amp;gt;---------&amp;lt;/option&amp;gt;    &lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;script lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var ciutat=document.getElementById(&amp;quot;ciutat&amp;quot;);&lt;br /&gt;
var barri=document.getElementById(&amp;quot;barri&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var xhr=new XMLHttpRequest();&lt;br /&gt;
ciutat.onchange=function () {&lt;br /&gt;
  xhr.open(&amp;quot;GET&amp;quot;,&amp;quot;exercici4.php?q=&amp;quot;+ciutat.value);&lt;br /&gt;
  xhr.send(null); &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
xhr.onreadystatechange=function (){&lt;br /&gt;
    &lt;br /&gt;
    barri.innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if(xhr.readyState==4 &amp;amp;&amp;amp; xhr.status==200) {&lt;br /&gt;
       var arr_barris=(xhr.responseText).split(&amp;quot;,&amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      for(var _barri of arr_barris) {&lt;br /&gt;
        var opt=document.createElement(&amp;quot;option&amp;quot;);&lt;br /&gt;
        var opt_text=document.createTextNode(_barri);&lt;br /&gt;
        opt.appendChild(opt_text);&lt;br /&gt;
        barri.appendChild(opt);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programa de client '''exercici4.html''' amb FETCH ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;exercici 4 AJAX&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;label&amp;gt;Escull una ciutat:&amp;lt;/label&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;select name=&amp;quot;ciutat&amp;quot; id=&amp;quot;ciutat&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;-&amp;quot;&amp;gt;---------&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;barcelona&amp;quot;&amp;gt;Barcelona&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;lacoruna&amp;quot;&amp;gt;La Coruña&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;madrid&amp;quot;&amp;gt;Madrid&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;sevilla&amp;quot;&amp;gt;Sevilla&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;label&amp;gt;Escull un barri:&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;barri&amp;quot; id=&amp;quot;barri&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;-&amp;quot;&amp;gt;---------&amp;lt;/option&amp;gt;    &lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var ciutat=document.getElementById(&amp;quot;ciutat&amp;quot;);&lt;br /&gt;
var barri=document.getElementById(&amp;quot;barri&amp;quot;);&lt;br /&gt;
ciutat.onchange=function () {&lt;br /&gt;
&lt;br /&gt;
  fetch(&amp;quot;exercici4.php?q=&amp;quot;+ciutat.value)&lt;br /&gt;
    .then(  function(response){&lt;br /&gt;
                if(response.ok) {&lt;br /&gt;
                    return response.text()&lt;br /&gt;
                } else {&lt;br /&gt;
                    throw &amp;quot;Error a la crida Ajax&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            })&lt;br /&gt;
    .then(function(responseText){&lt;br /&gt;
      barri.innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
      var arr_barris=(responseText).split(&amp;quot;,&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      for(var _barri of arr_barris) {&lt;br /&gt;
        var opt=document.createElement(&amp;quot;option&amp;quot;);&lt;br /&gt;
        var opt_text=document.createTextNode(_barri);&lt;br /&gt;
        opt.appendChild(opt_text);&lt;br /&gt;
        barri.appendChild(opt);&lt;br /&gt;
      }&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.log(err);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programa de client '''exercici4.html''' amb AXIOS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;exercici 4 AJAX&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;label&amp;gt;Escull una ciutat:&amp;lt;/label&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;select name=&amp;quot;ciutat&amp;quot; id=&amp;quot;ciutat&amp;quot; onchange=&amp;quot;canvi_ciutat()&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;-&amp;quot;&amp;gt;---------&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;barcelona&amp;quot;&amp;gt;Barcelona&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;lacoruna&amp;quot;&amp;gt;La Coruña&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;madrid&amp;quot;&amp;gt;Madrid&amp;lt;/option&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;sevilla&amp;quot;&amp;gt;Sevilla&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;label&amp;gt;Escull un barri:&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;barri&amp;quot; id=&amp;quot;barri&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;option value=&amp;quot;-&amp;quot;&amp;gt;---------&amp;lt;/option&amp;gt;    &lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var ciutat=document.getElementById(&amp;quot;ciutat&amp;quot;);&lt;br /&gt;
var barri=document.getElementById(&amp;quot;barri&amp;quot;);&lt;br /&gt;
ciutat.onchange=canvi_ciutat;&lt;br /&gt;
&lt;br /&gt;
function canvi_ciutat() {&lt;br /&gt;
&lt;br /&gt;
  axios.get(&amp;quot;exercici4.php?q=&amp;quot;+ciutat.value)&lt;br /&gt;
    .then(function(response){&lt;br /&gt;
      barri.innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
      var arr_barris=(response.data).split(&amp;quot;,&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      for(var _barri of arr_barris) {&lt;br /&gt;
        var opt=document.createElement(&amp;quot;option&amp;quot;);&lt;br /&gt;
        var opt_text=document.createTextNode(_barri);&lt;br /&gt;
        opt.appendChild(opt_text);&lt;br /&gt;
        barri.appendChild(opt);&lt;br /&gt;
      }&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.log(err);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17238</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17238"/>
				<updated>2023-04-14T16:14:06Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis curs 2021-2022 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb XMLHttpRequest==&lt;br /&gt;
&lt;br /&gt;
Per a cada exercici es proporciona els programa PHP de servidor necessari.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Axios==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Axios&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Fetch==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Fetch&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17237</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17237"/>
				<updated>2023-04-14T16:13:53Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis amb Fetch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb XMLHttpRequest==&lt;br /&gt;
&lt;br /&gt;
Per a cada exercici es proporciona els programa PHP de servidor necessari.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Axios==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Axios&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Fetch==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Fetch&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17236</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17236"/>
				<updated>2023-04-14T16:13:33Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis amb Axios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb XMLHttpRequest==&lt;br /&gt;
&lt;br /&gt;
Per a cada exercici es proporciona els programa PHP de servidor necessari.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Axios==&lt;br /&gt;
* Torna a fer els exercicis 4 i 6 usant la llibreria Axios&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Fetch==&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17235</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17235"/>
				<updated>2023-04-14T16:11:38Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis amb XMLHttpRequest */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb XMLHttpRequest==&lt;br /&gt;
&lt;br /&gt;
Per a cada exercici es proporciona els programa PHP de servidor necessari.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Axios==&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb Fetch==&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17234</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17234"/>
				<updated>2023-04-14T16:09:09Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis (Es proporcionen els fitxers PHP necessaris) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis amb XMLHttpRequest==&lt;br /&gt;
&lt;br /&gt;
Per a cada exercici es proporciona els programa PHP de servidor necessari.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17233</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17233"/>
				<updated>2023-04-14T16:06:52Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis (Es proporcionen els fitxers PHP necessaris) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis (Es proporcionen els fitxers PHP necessaris)==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17232</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17232"/>
				<updated>2023-04-14T16:06:28Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici 6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis (Es proporcionen els fitxers PHP necessaris)==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
Fitxer exercici6.php: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17231</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17231"/>
				<updated>2023-04-14T16:05:54Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici 6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis (Es proporcionen els fitxers PHP necessaris)==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17230</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17230"/>
				<updated>2023-04-14T16:05:34Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici 6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis (Es proporcionen els fitxers PHP necessaris)==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a = array(&amp;quot;Anna&amp;quot;,&amp;quot;Brittany&amp;quot;,&amp;quot;Cinderella&amp;quot;,&amp;quot;Diana&amp;quot;,&amp;quot;Eva&amp;quot;,&amp;quot;Fiona&amp;quot;,&amp;quot;Gunda&amp;quot;,&amp;quot;Hege&amp;quot;,&amp;quot;Inga&amp;quot;,&amp;quot;Johanna&amp;quot;,&amp;quot;Kitty&amp;quot;,&amp;quot;Linda&amp;quot;,&amp;quot;Nina&amp;quot;,&amp;quot;Ophelia&amp;quot;,&amp;quot;Petunia&amp;quot;,&amp;quot;Amanda&amp;quot;,&amp;quot;Raquel&amp;quot;,&amp;quot;Cindy&amp;quot;,&amp;quot;Doris&amp;quot;,&amp;quot;Eve&amp;quot;,&amp;quot;Evita&amp;quot;,&amp;quot;Sunniva&amp;quot;,&amp;quot;Tove&amp;quot;,&amp;quot;Unni&amp;quot;,&amp;quot;Violet&amp;quot;,&amp;quot;Liza&amp;quot;,&amp;quot;Elizabeth&amp;quot;,&amp;quot;Ellen&amp;quot;,&amp;quot;Wenche&amp;quot;,&amp;quot;Vicky&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17229</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17229"/>
				<updated>2023-04-14T15:58:13Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis (Es proporcionen els fitxers PHP necessaris) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis (Es proporcionen els fitxers PHP necessaris)==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a[] = &amp;quot;Anna&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Brittany&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Cinderella&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Diana&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Eva&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Fiona&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Gunda&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Hege&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Inga&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Johanna&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Kitty&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Linda&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Nina&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Ophelia&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Petunia&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Amanda&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Raquel&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Cindy&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Doris&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Eve&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Evita&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Sunniva&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Tove&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Unni&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Violet&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Liza&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Elizabeth&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Ellen&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Wenche&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Vicky&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17228</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17228"/>
				<updated>2023-04-14T15:56:50Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis (Es proporcionen els fitxers PHP necessaris) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis (Es proporcionen els fitxers PHP necessaris)==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Array with names&lt;br /&gt;
$a[] = &amp;quot;Anna&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Brittany&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Cinderella&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Diana&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Eva&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Fiona&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Gunda&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Hege&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Inga&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Johanna&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Kitty&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Linda&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Nina&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Ophelia&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Petunia&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Amanda&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Raquel&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Cindy&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Doris&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Eve&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Evita&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Sunniva&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Tove&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Unni&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Violet&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Liza&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Elizabeth&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Ellen&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Wenche&amp;quot;;&lt;br /&gt;
$a[] = &amp;quot;Vicky&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// get the q parameter from URL&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
$hint = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// lookup all hints from array if $q is different from &amp;quot;&amp;quot;&lt;br /&gt;
if ($q !== &amp;quot;&amp;quot;) {&lt;br /&gt;
  $q = strtolower($q);&lt;br /&gt;
  $len=strlen($q);&lt;br /&gt;
  foreach($a as $name) {&lt;br /&gt;
    if (stristr($q, substr($name, 0, $len))) {&lt;br /&gt;
      if ($hint === &amp;quot;&amp;quot;) {&lt;br /&gt;
        $hint = $name;&lt;br /&gt;
      } else {&lt;br /&gt;
        $hint .= &amp;quot;&amp;lt;br&amp;gt;$name&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Output &amp;quot;no suggestion&amp;quot; if no hint was found or output correct values&lt;br /&gt;
echo $hint === &amp;quot;&amp;quot; ? &amp;quot;no suggestion&amp;quot; : $hint;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17227</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17227"/>
				<updated>2023-04-14T15:45:52Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis (Es proporcionen els fitxers PHP necessaris) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis (Es proporcionen els fitxers PHP necessaris)==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17226</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17226"/>
				<updated>2023-04-14T15:43:01Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis (Es proporcionen els fitxers PHP necessaris) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis (Es proporcionen els fitxers PHP necessaris)==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17225</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17225"/>
				<updated>2023-04-14T15:41:48Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis (Es proporcionen els fitxers PHP necessaris) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis (Es proporcionen els fitxers PHP necessaris)==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17215</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17215"/>
				<updated>2023-04-11T17:45:10Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis (Es proporcionen els fitxers PHP necessaris)==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17214</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17214"/>
				<updated>2023-04-11T17:42:14Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici4.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$barri = array(&amp;quot;barcelona&amp;quot;=&amp;gt;array(&amp;quot;Ciutat Vella&amp;quot;, &amp;quot;Eixample&amp;quot;, &amp;quot;Sants-Montuïc&amp;quot;,&amp;quot;Les Corts&amp;quot;,&amp;quot;Gràcia&amp;quot;),&lt;br /&gt;
                &amp;quot;madrid&amp;quot;=&amp;gt;array(&amp;quot;Centro&amp;quot;,&amp;quot;Arganzuela&amp;quot;,&amp;quot;Retiro&amp;quot;,&amp;quot;Salamanca&amp;quot;,&amp;quot;Chamartín&amp;quot;,&amp;quot;Tetuán&amp;quot;),&lt;br /&gt;
                &amp;quot;sevilla&amp;quot; =&amp;gt; array(&amp;quot;Casco antiguo&amp;quot;,&amp;quot;Nervión&amp;quot;,&amp;quot;Sur&amp;quot;,&amp;quot;Triana&amp;quot;,&amp;quot;Norte&amp;quot;),&lt;br /&gt;
                &amp;quot;lacoruna&amp;quot; =&amp;gt; array(&amp;quot;Agra del Orzán&amp;quot;,&amp;quot;Ensanche&amp;quot;,&amp;quot;Monte Alto&amp;quot;,&amp;quot;Pescadería&amp;quot;)&lt;br /&gt;
                );&lt;br /&gt;
$q = $_REQUEST[&amp;quot;q&amp;quot;];&lt;br /&gt;
echo &amp;quot;---------,&amp;quot;.implode(&amp;quot;,&amp;quot;,$barri[$q]);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17213</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17213"/>
				<updated>2023-04-11T17:36:53Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17212</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17212"/>
				<updated>2023-04-11T17:36:30Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
&lt;br /&gt;
Fitxer exercici3.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom=$_REQUEST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
$cognom=$_REQUEST[&amp;quot;cognom&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
echo strtoupper($nom).&amp;quot;,&amp;quot;.strtoupper($cognom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17211</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17211"/>
				<updated>2023-04-11T17:34:58Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici2.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
sleep(3);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17210</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17210"/>
				<updated>2023-04-11T17:33:42Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17209</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=17209"/>
				<updated>2023-04-11T17:32:49Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
Promeses: https://www.youtube.com/watch?v=pHBmmbDQl0o&lt;br /&gt;
&lt;br /&gt;
FETCH: https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&lt;br /&gt;
Fitxer exercici1.php:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
phpinfo();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2021-2022==&lt;br /&gt;
&lt;br /&gt;
* Exercicis 4 i 6 amb objecte XMLHttpRequest&lt;br /&gt;
* Exercicis 4 i 6 amb fetch&lt;br /&gt;
* Exercicis 4 i 6 amb axios&lt;br /&gt;
&lt;br /&gt;
== Solucions ==&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_4&lt;br /&gt;
&lt;br /&gt;
http://wikiserver.infomerce.es/index.php/Exercici_6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API que usen AJAX ==&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
https://rapidapi.com/categories&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_Esdeveniments_i_Validacio_de_formularis&amp;diff=17200</id>
		<title>NF1 - Esdeveniments i Validacio de formularis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_Esdeveniments_i_Validacio_de_formularis&amp;diff=17200"/>
				<updated>2023-03-21T18:55:07Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* solució */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Esdeveniments =&lt;br /&gt;
Fins ara, totes les aplicacions i scripts que s'han creat tenen alguna cosa en comú: s'executen des de la primera instrucció fins a l'última de forma seqüencial. Gràcies a les estructures de control de flux (if, for, while) és possible modificar lleugerament aquest comportament i repetir alguns trossos del script i saltar-se altres trossos en funció d'algunes condicions.&lt;br /&gt;
&lt;br /&gt;
Aquest tipus d'aplicacions són poc útils, ja que no interactuen amb els usuaris i no poden respondre als diferents esdeveniments que es produeixen durant l'execució d'una aplicació. Afortunadament, les aplicacions web creades amb el llenguatge Javascript poden utilitzar el model de programació basada en esdeveniments.&lt;br /&gt;
&lt;br /&gt;
En aquest tipus de programació, els scripts es dediquen a esperar al fet que l'usuari &amp;quot;faci alguna cosa&amp;quot; (que premi una tecla, que mogui el ratolí, que tanqui la finestra del navegador). A continuació, el script respon a l'acció de l'usuari normalment processant aquesta informació i generant un resultat.&lt;br /&gt;
&lt;br /&gt;
Els esdeveniments fan possible que els usuaris transmetin informació als programes. Javascript defineix nombrosos esdeveniments que permeten una interacció completa entre l'usuari i les pàgines/aplicacions web. La pulsació d'una tecla constitueix un esdeveniment, així com punxar o moure el ratolí, seleccionar un element d'un formulari, redimensionar la finestra del navegador, etc.&lt;br /&gt;
&lt;br /&gt;
Javascript permet assignar una funció a cadascun dels esdeveniments. D'aquesta forma, quan es produeix qualsevol esdeveniment, Javascript executa la seva funció associada. Aquest tipus de funcions es denominen &amp;quot;event handlers&amp;quot; en anglès i solen traduir-se per &amp;quot;manegadors d'esdeveniments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Model bàsic d'esdeveniments ==&lt;br /&gt;
=== Tipus d'esdeveniments ===&lt;br /&gt;
En aquest model, cada element o etiqueta XHTML defineix la seva pròpia llista de possibles esdeveniments que se li poden assignar. Un mateix tipus d'esdeveniment (per exemple, clicar el botó esquerre del ratolí) pot estar definit per a diversos elements XHTML diferents i un mateix element XHTML pot tenir associats varis esdeveniments diferents.&lt;br /&gt;
&lt;br /&gt;
El nom de cada esdeveniment es construeix mitjançant el prefix ''on'', seguit del nom en anglès de l'acció associada a l'esdeveniment. Així, l'esdeveniment de punxar un element amb el ratolí es denomina ''onclick'' i l'esdeveniment associat a l'acció de moure el ratolí es denomina ''onmousemove''.&lt;br /&gt;
&lt;br /&gt;
La següent taula resumeix els esdeveniments més importants definits per Javascript:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Event&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Descripció&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Elements per els que está definit&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onblur&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deseleccionar l'element (el contrari de onfocus)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;button&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;label&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onchange&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Succeeix quan el valor del element ha canviat&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onclick&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;clicar i deixar anar el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;ondblclick&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;clicar dos vegades seguides amb el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onfocus&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Seleccionar un element&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;button&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;label&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeydown&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer una tecla (sense deixar-la anar)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeypress&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer una tecla&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeyup&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deixar anar una tecla premuda&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onload&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;La pàgina s'ha carregat completament&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmousedown&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer (sense deixar anar) un botn del ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmousemove&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Moure el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseout&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;El ratolí &amp;lt;em&amp;gt;&amp;quot;surt&amp;quot;&amp;lt;/em&amp;gt; de l'element (passa sobre un altre element)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseover&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;El ratoli &amp;lt;em&amp;gt;&amp;quot;entra&amp;quot;&amp;lt;/em&amp;gt; dintre de l'elemento (passa per sobre de l'element)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseup&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deixar anar el botó que estava premut en el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onreset&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Inicialitzar el formulari (esborrar totes les dades)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;form&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onresize&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;S'ha modificat la mida de la finestra del navegador&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onselect&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Seleccionar un text&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onsubmit&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Enviar el formulari&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;form&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onunload&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;S'abandona la pàgina (per exemple al tancar el navegador)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu veure tots el esdeveniments [[http://www.w3schools.com/jsref/dom_obj_event.asp aquí]]&lt;br /&gt;
&lt;br /&gt;
===Gestor  d'esdeveniments===&lt;br /&gt;
&lt;br /&gt;
Un esdeveniment de Javascript per si mateix manca d'utilitat. Perquè els esdeveniments resultin útils, s'han d'associar funcions o codi Javascript a cada esdeveniment. D'aquesta forma, quan es produeix un esdeveniment s'executa el codi indicat, per la qual cosa l'aplicació pot respondre davant qualsevol esdeveniment que es produeixi durant la seva execució.&lt;br /&gt;
&lt;br /&gt;
Les funcions o codi Javascript que es defineixen per a cada esdeveniment es denominen &amp;quot;manegador d'esdeveniments&amp;quot; i com Javascript és un llenguatge molt flexible, existeixen diverses formes diferents d'indicar els manegadors:&lt;br /&gt;
&lt;br /&gt;
*Manejadores com a atributs dels elements XHTML.&lt;br /&gt;
*Manejadores com a funcions Javascript externes.&lt;br /&gt;
*Manejadores &amp;quot;semàntics&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments com a atributs XHTML ====&lt;br /&gt;
&lt;br /&gt;
Es tracta del mètode més senzill i alhora menys professional d'indicar el codi Javascript que s'ha d'executar quan es produeixi un esdeveniment. En aquest cas, el codi s'inclou en un atribut del propi element XHTML. En el següent exemple, es vol mostrar un missatge quan l'usuari cliqui amb el ratolí sobre un botó:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquest mètode, es defineixen atributs XHTML amb el mateix nom que els esdeveniments que es volen manejar. L'exemple anterior només vol controlar l'esdeveniment de clicar amb el ratolí, el nom del qual és onclick. Així, l'element XHTML pel qual es vol definir aquest esdeveniment, ha d'incloure un atribut anomenat onclick.&lt;br /&gt;
&lt;br /&gt;
El contingut de l'atribut és una cadena de text que conté totes les instruccions Javascript que s'executen quan es produeix l'esdeveniment. En aquest cas, el codi Javascript és molt senzill (alert('Gràcies per clicar');), ja que solament es tracta de mostrar un missatge.&lt;br /&gt;
&lt;br /&gt;
En aquest altre exemple, quan l'usuari punxa sobre l'element &amp;lt;div&amp;gt; es mostra un missatge i quan l'usuari passa el ratolí per sobre de l'element, es mostra un altre missatge:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div onclick=&amp;quot;alert('Has clicat amb el ratolí');&amp;quot; onmouseover=&amp;quot;alert('Acabes de passar el ratolí per damunt');&amp;quot;&amp;gt;Ratolí&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pots clicar sobre aquest element o simplement passar el ratolí per damunt.&lt;br /&gt;
Aquest altre exemple inclou una de les instruccions més utilitzades en les aplicacions Javascript més antigues:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body onload=&amp;quot;alert(&amp;quot;La pàgina s'ha carregat completament &amp;quot;);&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior es mostra després que la pàgina s'hagi carregat completament, és a dir, després que s'hagi descarregat el seu codi HTML, les seves imatges i qualsevol altre objecte inclòs a la pàgina.&lt;br /&gt;
&lt;br /&gt;
L'esdeveniment onload és un dels més utilitzats ja que, com veurem en el capítol de DOM, les funcions que permeten accedir i manipular els nodes de l'arbre DOM solament estan disponibles quan la pàgina s'ha carregat completament.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments i variable this ====&lt;br /&gt;
&lt;br /&gt;
En els esdeveniments, es pot utilitzar la variable '''this''' per referir-se a l'element XHTML que ha provocat l'esdeveniment. Aquesta variable és molt útil per a exemples com el següent:&lt;br /&gt;
&lt;br /&gt;
Quan l'usuari passa el ratolí per sobre de el &amp;lt;div&amp;gt;, el color de la vora es mostra de color negre. Quan el ratolí surt de el &amp;lt;div&amp;gt;, es torna a mostrar la vora amb el color gris clar original.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Element &amp;lt;div&amp;gt; original:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si no s'utilitza la variable this, el codi necessari per modificar el color de les vores, seria el següent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;document.getElementById('continguts').style.borderColor='black';&amp;quot; onmouseout=&amp;quot;document.getElementById('continguts').style.borderColor='silver';&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codi anterior és massa llarg i massa propens a cometre errors. Dins del codi d'un esdeveniment, Javascript crea automàticament la variable this, que fa referència a l'element XHTML que ha provocat l'esdeveniment. Així, l'exemple anterior es pot reescriure de la següent manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;this.style.borderColor='black';&amp;quot; onmouseout=&amp;quot;this.style.borderColor='silver';&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codi anterior és molt més compacte, més fàcil de llegir i d'escriure i segueix funcionant correctament encara que es modifiqui el valor de l'atribut ''id'' de el &amp;lt; div &amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments com a funcions externes ====&lt;br /&gt;
&lt;br /&gt;
La definició dels manegadores d'esdeveniments en els atributs XHTML és el mètode més senzill però menys aconsellable de tractar amb els esdeveniments en Javascript. El principal inconvenient és que es complica a l'excés quan s'afegeixen algunes poques instruccions, per la qual cosa solament és recomanable per als casos més senzills.&lt;br /&gt;
&lt;br /&gt;
Si es realitzen aplicacions complexes, com per exemple la validació d'un formulari, és aconsellable agrupar tot el codi Javascript en una funció externa i cridar a aquesta funció des de l'element XHTML.&lt;br /&gt;
&lt;br /&gt;
Seguint amb l'exemple anterior que mostra un missatge en clicar sobre un botó:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilitzant funcions externes es pot transformar en:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function mostraMissatge() {&lt;br /&gt;
  alert('Gràcies per clicar');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;mostraMissatge()&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquesta tècnica consisteix a extreure totes les instruccions de Javascript i agrupar-les en una funció externa. Una vegada definida la funció, en l'atribut de l'element XHTML s'inclou el nom de la funció, per indicar que és la funció que s'executa quan es produeix l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
La crida a la funció es realitza de la forma habitual, indicant el seu nom seguit dels parèntesis i de forma opcional, incloent tots els arguments i paràmetres que es necessitin.&lt;br /&gt;
&lt;br /&gt;
El principal inconvenient d'aquest mètode és que en les funcions externes no es pot seguir utilitzant la variable '''this''' i per tant, és necessari passar aquesta variable com a paràmetre a la funció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ressalta(element) {&lt;br /&gt;
	switch(element.style.borderColor) {&lt;br /&gt;
		case 'silver':&lt;br /&gt;
		case 'silver silver silver silver':&lt;br /&gt;
		case '#c0c0c0':&lt;br /&gt;
			element.style.borderColor = 'black';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'black':&lt;br /&gt;
		case 'black black black black':&lt;br /&gt;
		case '#000000':&lt;br /&gt;
			element.style.borderColor = 'silver';&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;ressalta(this)&amp;quot; onmouseout=&amp;quot;ressalta(this)&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En l'exemple anterior, la funció externa és cridada amb el paràmetre ''this'', que dins de la funció es denomina element. La complexitat de l'exemple es produeix sobretot per la forma en la qual els diferents navegadors emmagatzemen el valor de la propietat *&lt;br /&gt;
''borderColor''.&lt;br /&gt;
&lt;br /&gt;
Mentre que Firefox emmagatzema (en cas que les quatre vores coincideixin en color) el valor ''black'', Internet Explorer ho emmagatzema com ''black black black black'' i Opera emmagatzema la seva representació hexadecimal ''#000000''.&lt;br /&gt;
&lt;br /&gt;
====Gestor d'esdeveniments semàntics====&lt;br /&gt;
Els mètodes que s'han vist per afegir manejadores d'esdeveniments (com a atributs XHTML i com a funcions externes) tenen un greu inconvenient: &amp;quot;embruten&amp;quot; el codi XHTML de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Com és conegut, una de les bones pràctiques bàsiques en el disseny de pàgines i aplicacions web és la separació dels continguts (XHTML) i el seu aspecte o presentació (CSS). Sempre que sigui possible, també es recomana separar els continguts (XHTML) i el seu comportament o programació (Javascript).&lt;br /&gt;
&lt;br /&gt;
Barrejar el codi Javascript amb els elements XHTML solament contribueix a complicar el codi font de la pàgina, a dificultar la modificació i manteniment de la pàgina i a reduir la semàntica del document final produït.&lt;br /&gt;
&lt;br /&gt;
Afortunadament, existeix un mètode alternatiu per definir els manegadores d'esdeveniments de Javascript. Aquesta tècnica és una evolució del mètode de les funcions externes, ja que es basa a utilitzar les propietats DOM dels elements XHTML per assignar totes les funcions externes que actuen de manejadores d'esdeveniments. Així, el següent exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;clica&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Es pot transformar en:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Funció externa&lt;br /&gt;
function mostraMissatge() {&lt;br /&gt;
alert('Gràcies per clicar');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Assignar la funció externa a l'element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&lt;br /&gt;
// Element XHTML&lt;br /&gt;
&amp;lt;input id=&amp;quot;clica&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tècnica dels manegadores semàntics consisteix en:&lt;br /&gt;
&lt;br /&gt;
*Assignar un identificador únic a l'element XHTML mitjançant l'atribut ''id''.&lt;br /&gt;
*Crear una funció de Javascript encarregada de manejar l'esdeveniment.&lt;br /&gt;
*Assignar la funció externa a l'esdeveniment corresponent en l'element desitjat.&lt;br /&gt;
*L'últim pas és la clau d'aquesta tècnica. En primer lloc, s'obté l'element al que es desitja associar la funció externa:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A continuació, s'utilitza una propietat de l'element amb el mateix nom que l'esdeveniment que es vol manejar. En aquest cas, la propietat és ''onclick'':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'assigna la funció externa mitjançant el seu nom sense parèntesi. El més important (i la causa més comuna d'errors) és indicar solament el nom de la funció, és a dir, prescindir dels parèntesis en assignar la funció:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'afegeixen els parèntesis després del nom de la funció, en realitat s'està executant la funció i guardant el valor retornat per la funció en la propietat onclick d'element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Assignar una funció externa a un esdeveniment d'un element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&lt;br /&gt;
// Executar una funció i guardar el seu resultat en una propietat d'un element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El gran avantatge d'aquest mètode és que el codi XHTML resultant és molt &amp;quot;net&amp;quot;, ja que no es barreja amb el codi Javascript. A més, dins de les funcions externes assignades sí que es pot utilitzar la variable '''this''' per referir-se a l'element que provoca l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
L'únic inconvenient d'aquest mètode és que la pàgina s'ha de carregar completament abans que es puguin utilitzar les funcions DOM que assignen els manegadors als elements XHTML. Una de les formes més senzilles d'assegurar que cert codi es va a executar després que la pàgina es carregui per complet és utilitzar l'esdeveniment '''onload''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = muestraMensaje;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gestor d'esdeveniments amb DOM====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El mètode addEventListener ens permet incloure un gestor d'esdeveniment. La sintaxi de addEventListener és la següent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
element_que_escolta.addEventListener('event',funció_a_llançar, booleà);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''element_que_escolta'' - és qualsevol element present en un document al qual es vol associar l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
''esdeveniment'' - és el succés ocorregut sobre l'element (clic, load, ...).&lt;br /&gt;
&lt;br /&gt;
''funció_a_llançar'' - és qualsevol funció definida que vulguem que s'executi quan passi l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
''booleà'' - és un valor que defineix l'ordre del flux d'esdeveniments.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si es vol escoltar un esdeveniment només una vegada i després eliminar-ho s'ha d'utilitzar el mètode removeEventListener:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
element_que_escolta.removeEventListener ('esdeveniment',funció_a_llançar, booleà);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTA 1:'' Explicació del paràmetre booleà del mètode addEventListener amb un exemple.&lt;br /&gt;
Suposem que tenim això:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Exemple de fluix events&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;Clica aqui&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quan fem clic al div no només ho estem fent sobre ell, sinó sobre els elements que el contenen en l'arbre del DOM, és a dir, hem fet clic a més sobre l'element html i sobre l'element body. Sí només hi ha una funció assignada a una escolta per al div no hi ha major problema, però si a més hi ha una per al html i una altra per al body, quin és l'ordre en què s'han de llançar les tres funcions?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per contestar a aquesta pregunta hi ha un model de comportament, el flux d'esdeveniments (anglès). Segons aquest, quan es fa clic sobre un element, l'esdeveniment es propaga en dues fases, una que és la captura -el esdeveniment comença en el nivell superior del document i recorre els elements de pares a fills- i l'altra la bombolla -el ordre invers, ascendint de fills a pares-.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un cop vist això, podem comprendre el tercer paràmetre de addEventListener, que el que fa és permetre'ns escollir l'ordre de propagació:&lt;br /&gt;
&lt;br /&gt;
'''true''': El flux d'esdeveniments és com el representat, i la fase de captura passa en llançar l'esdeveniment. L'ordre de propagació per l'exemple seria, per tant, l'indicat, ''html-body-div.''&lt;br /&gt;
&lt;br /&gt;
'''false''': Permet saltar la fase de captura, i la propagació seguiria només la bombolla. Així, l'ordre seria ''div-body-html.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTA 2:'' A internet explorer no funciona en les versions anteriors a la 7 (inclosa).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        function alerta(){&lt;br /&gt;
            alert(this);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        window.onload = function (){&lt;br /&gt;
            var elBody = document.getElementsByTagName('body')[0];&lt;br /&gt;
            var elDiv = document.getElementById('elDiv');&lt;br /&gt;
            var elButton = document.getElementById('elButton');&lt;br /&gt;
         &lt;br /&gt;
            elBody.addEventListener('click',alerta,false);&lt;br /&gt;
            elDiv.addEventListener('click',alerta,false);&lt;br /&gt;
            elButton.addEventListener('click',alerta,false);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//event.stopPropagation();   //evita propagarse el evento en forma de burbuja&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body id=&amp;quot;body&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;elDiv&amp;quot;&amp;gt;Clica aqui&lt;br /&gt;
          &amp;lt;button id=&amp;quot;elButton&amp;quot;&amp;gt;boton&amp;lt;/button&amp;gt;&lt;br /&gt;
     &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemple d'utilització manejadores d'esdeveniments amb DOM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function muestraMensaje() {&lt;br /&gt;
  				console.log(&amp;quot;Has pulsado el ratón&amp;quot;);&lt;br /&gt;
  				elDiv.removeEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);  // borra el evento asociado de tipo click a ese elemento.&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			var elDiv = document.getElementById(&amp;quot;div_principal&amp;quot;);&lt;br /&gt;
			elDiv.addEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
En el caso que no queramos que se aplique el evento de tipo de Submit o Hipervínculo &amp;quot;&amp;lt;a&amp;gt;&amp;lt;/a&amp;gt;&amp;quot; al ser botón usaremos &amp;quot;e.preventDefault()&amp;quot; y realizará las acciones que tengamos establecidas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
window.addEventListener(&amp;quot;load&amp;quot;,ejemplo); // window.onload= ejemplo;&lt;br /&gt;
&lt;br /&gt;
	function ejemplo(){&lt;br /&gt;
			function muestraMensaje(e) {&lt;br /&gt;
  				console.log(&amp;quot;Has pulsado el ratón&amp;quot;);&lt;br /&gt;
                                e.preventDefault();  //evita que se ejecute el submit y recargue la página&lt;br /&gt;
			}&lt;br /&gt;
         document.getElementById(&amp;quot;boton&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);&lt;br /&gt;
	}      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;./index.html&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;input type=&amp;quot;submit&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;boton&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En el següent exemple, s'afegeixen esdeveniments als elements de tipus ''input=text'' d'un formulari complex:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form id=&amp;quot;formulario&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;holaa&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    function resalta() {&lt;br /&gt;
        console.log(&amp;quot;holaa&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    window.onload = function() {&lt;br /&gt;
        var formulario = document.getElementById(&amp;quot;formulario&amp;quot;);&lt;br /&gt;
        var camposInput = formulario.getElementsByTagName(&amp;quot;input&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        for(var i=0; i&amp;lt;camposInput.length; i++) {&lt;br /&gt;
            if(camposInput[i].type == &amp;quot;text&amp;quot;) {&lt;br /&gt;
                camposInput[i].onclick = resalta;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Alert ===&lt;br /&gt;
Volem provar els events de la pàgina, per fer-ho posa un alert amb un missatge en els següents casos:&lt;br /&gt;
* Al carregar-se completament la pàgina.&lt;br /&gt;
* Al clicar en un botó&lt;br /&gt;
* Al passar damunt d'un paràgraf&lt;br /&gt;
* Al passar damunt d'una imatge&lt;br /&gt;
* Al sortir del damunt d'una imatge&lt;br /&gt;
* Al clicar en un enllaç&lt;br /&gt;
&lt;br /&gt;
:[[Exercici1 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Desplegable ===&lt;br /&gt;
Es vol disposar de un menu desplegable on cada element del desplegable sigui el nom de la pàgina a la cual fa referència. Quan es seleccioni una entrada del desplegable, el navegador canvia la seva url per la del desplegable.&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 2 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Rollover ===&lt;br /&gt;
Un intercanvi d'imatge és una cosa grandiosa. L'usuari aproxima el punter del ratolí a una imatge i aquesta canvia a una altre imatge. Quan l'usuari abandona la imatge, torna a canviar a la imatge anterior. &lt;br /&gt;
Fes un programa amb javascript que reprodueixi el comportament anterior.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 3 Events]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Mostrar / Ocultar text ===&lt;br /&gt;
Donada la següent pàgina&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	function muestraOculta() {&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_1&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_1&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_2&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_2&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_3&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_3&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Realitza els següents apartats:&lt;br /&gt;
*Quan es cliqui sobre el primer enllaç, s'oculti la seva secció relacionada&lt;br /&gt;
*Quan es torni a clicar sobre el mateix enllaç, es mostri una altra vegada aquesta secció de continguts&lt;br /&gt;
*Completar la resta d'enllaços de la pàgina perquè el seu comportament sigui idèntic al del primer enllaç&lt;br /&gt;
*Quan una secció s'oculti, ha de canviar el missatge de l'enllaç associat (pista: propietat innerHTML)&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 4 Events]]&lt;br /&gt;
&lt;br /&gt;
== Obtenint informació de l'esdeveniment (objecte event)==&lt;br /&gt;
Normalment, els manegadors d'esdeveniments requereixen informació addicional per processar les seves tasques. Si una funció per exemple s'encarrega de processar l'esdeveniment onclick, potser necessiti saber que posició estava el ratolí en el moment de punxar el botó.&lt;br /&gt;
&lt;br /&gt;
No obstant això, el cas més habitual en el qual és necessari conèixer informació addicional sobre l'esdeveniment és el dels esdeveniments associats al teclat. Normalment, és molt important conèixer la tecla que s'ha premut, per exemple per diferenciar les tecles normals de les tecles especials (ENTER, tabulador, Alt, Ctrl., etc.).&lt;br /&gt;
&lt;br /&gt;
Javascript permet obtenir informació sobre el ratolí i el teclat mitjançant un objecte especial anomenat ''event''. Desafortunadament, els diferents navegadors presenten diferències molt notables en el tractament de la informació sobre els esdeveniments.&lt;br /&gt;
&lt;br /&gt;
La principal diferència resideix en la forma en la qual s'obté l'objecte event. Internet Explorer considera que aquest objecte forma part de l'objecte window i la resta de navegadors ho consideren com l'únic argument que tenen les funcions manejadoras d'esdeveniments.&lt;br /&gt;
&lt;br /&gt;
Encara que és un comportament que resulta molt estrany al principi, tots els navegadors moderns excepte Internet Explorer creen màgicament i de forma automàtica un argument que es passa a la funció manegadora, per la qual cosa no és necessari incloure-ho en la trucada a la funció manegadora. D'aquesta forma, per utilitzar aquest &amp;quot;argument màgic&amp;quot;, només és necessari assignar-li un nom, ja que els navegadors ho creen automàticament.&lt;br /&gt;
&lt;br /&gt;
En resum, en els navegadors tipus Internet Explorer, l'objecte event s'obté directament mitjançant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var esdeveniment = window.event;&lt;br /&gt;
D'altra banda, en la resta de navegadors, l'objecte event s'obté màgicament a partir de l'argument que el navegador crea automàticament:&lt;br /&gt;
&lt;br /&gt;
function manejadorEventos(elEvento) {&lt;br /&gt;
var esdeveniment = elEvento;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si es vol programar una aplicació que funcioni correctament en tots els navegadors, és necessari obtenir l'objecte event de forma correcta segons cada navegador. El següent codi mostra la forma correcta d'obtenir l'objecte event en qualsevol navegador:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function manejadorEventos(elEvento) {&lt;br /&gt;
var esdeveniment = elEvento || window.event;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una vegada obtingut l'objecte event, ja es pot accedir a tota la informació relacionada amb l'esdeveniment, que depèn del tipus d'esdeveniment produït.&lt;br /&gt;
&lt;br /&gt;
=== Informació sobre l'esdeveniment ===&lt;br /&gt;
La propietat '''type''' indica el tipus d'esdeveniment produït, la qual cosa és útil quan una mateixa funció s'utilitza per manejar diversos esdeveniments:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var tipus = esdeveniment.type;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La propietat type retorna el tipus d'esdeveniment produït, que és igual al nom de l'esdeveniment però sense el prefix '''on'''.&lt;br /&gt;
&lt;br /&gt;
Mitjançant aquesta propietat, es pot refer de forma més senzilla l'exemple anterior en el qual es ressaltava una secció de continguts en passar el ratolí per damunt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ressalta(elEvento) {&lt;br /&gt;
    var esdeveniment = elEvento || window.event;&lt;br /&gt;
    switch(esdeveniment.type) {&lt;br /&gt;
         case 'mouseover':&lt;br /&gt;
               this.style.borderColor = 'black';&lt;br /&gt;
               break;&lt;br /&gt;
         case 'mouseout':&lt;br /&gt;
               this.style.borderColor = 'silver';&lt;br /&gt;
               break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
       document.getElementById(&amp;quot;seccion&amp;quot;).onmouseover = ressalta;&lt;br /&gt;
       document.getElementById(&amp;quot;seccion&amp;quot;).onmouseout = ressalta;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;div id=&amp;quot;seccion&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot;&amp;gt;&lt;br /&gt;
  Secció de continguts...&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Informació sobre els esdeveniments de teclat ===&lt;br /&gt;
De tots els esdeveniments disponibles en Javascript, els esdeveniments relacionats amb el teclat són els més incompatibles entre diferents navegadors i per tant, els més difícils de manegar. En primer lloc, existeixen moltes diferències entre els navegadors, els teclats i els sistemes operatius dels usuaris, principalment a causa de les diferències entre idiomes.&lt;br /&gt;
&lt;br /&gt;
A més, existeixen tres esdeveniments diferents per a les pulsacions de les tecles ('''onkeyup''', '''onkeypress''' i '''onkeydown'''). Finalment, existeixen dos tipus de tecles: les tecles normals (com a lletres, nombres i símbols normals) i les tecles especials (com ENTER, Alt, Shift, etc.)&lt;br /&gt;
&lt;br /&gt;
Quan un usuari prem una tecla normal, es produeixen tres esdeveniments seguits i en aquest ordre: &lt;br /&gt;
*'''onkeydown''', &lt;br /&gt;
*'''onkeypress''' i &lt;br /&gt;
*'''onkeyup'''. &lt;br /&gt;
L'esdeveniment '''onkeydown''' es correspon amb el fet de prémer una tecla i no deixar-la anar; l'esdeveniment '''onkeypress''' és la pròpia pulsació de la tecla i l'esdeveniment '''onkeyup''' fa referència al fet de deixar anar una tecla que estava premuda.&lt;br /&gt;
&lt;br /&gt;
La forma més senzilla d'obtenir la informació sobre la tecla que s'ha premut és mitjançant l'esdeveniment '''onkeypress'''. La informació que proporcionen els esdeveniments '''onkeydown''' i '''onkeyup''' es pot considerar com més tècnica, ja que retornen el ''codi intern'' de cada tecla i no el caràcter que s'ha premut.&lt;br /&gt;
&lt;br /&gt;
A continuació s'inclou una llista amb totes les propietats diferents de tots els esdeveniments de teclat tant en Internet Explorer com en la resta de navegadors:&lt;br /&gt;
&lt;br /&gt;
*Esdeveniment keydown:&lt;br /&gt;
**Mateix comportament en tots els navegadors:&lt;br /&gt;
***Propietat keyCode: codi intern de la tecla&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
*Esdeveniment keypress:&lt;br /&gt;
**Internet Explorer:&lt;br /&gt;
***Propietat keyCode: el codi del caràcter de la tecla que s'ha premut&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
**Resta de navegadors:&lt;br /&gt;
**Propietat keyCode: per a les tecles normals, no definit. Per a les tecles especials, el codi intern de la tecla.&lt;br /&gt;
**Propietat charCode: per a les tecles normals, el codi del caràcter de la tecla que s'ha premut. Per a les tecles especials, 0.&lt;br /&gt;
*Esdeveniment keyup:&lt;br /&gt;
**Mateix comportament en tots els navegadors:&lt;br /&gt;
***Propietat keyCode: codi intern de la tecla&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
Per convertir el codi d'un caràcter (no confondre amb el codi intern) al caràcter que representa la tecla que s'ha premut, s'utilitza la funció ''String.fromCharCode().''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    window.onkeydown = teclado;&lt;br /&gt;
    window.onkeypress = teclado;&lt;br /&gt;
    window.onkeyup = teclado;&lt;br /&gt;
&lt;br /&gt;
    function teclado(magica) {&lt;br /&gt;
        var e = magica || window.event; // para salvar las deficiencias de IE=window.event&lt;br /&gt;
        mostrar(e.type, e.keyCode, e.which, e.charCode, e.key);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function mostrar(evento, keyCode, which, charCode, key) {&lt;br /&gt;
      &lt;br /&gt;
        let cadena =  &amp;quot;&amp;lt;b&amp;gt; Evento: &amp;lt;/b&amp;gt;&amp;quot; + evento &lt;br /&gt;
                     + &amp;quot; ==&amp;gt; &amp;lt;b&amp;gt; keyCode: &amp;lt;/b&amp;gt;&amp;quot; + keyCode &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; which: &amp;lt;/b&amp;gt;&amp;quot; + which &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; charCode: &amp;lt;/b&amp;gt;&amp;quot;+ charCode &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; key: &amp;lt;/b&amp;gt;&amp;quot;+ key &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; FromCharCode: &amp;lt;/b&amp;gt;&amp;quot;+String.fromCharCode(charCode)+&amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         let info = document.getElementById(&amp;quot;info&amp;quot;); //display&lt;br /&gt;
         info.innerHTML += cadena&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;info&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://sospedia.net/pinchar-el-teclado-en-javascript/&lt;br /&gt;
&lt;br /&gt;
https://www.w3.org/2002/09/tests/keys-cancel2.html&lt;br /&gt;
&lt;br /&gt;
==== Exercici Teclat ====&lt;br /&gt;
Crea un script que mostri per pantalla la següent informació cada vedada que es premi una tecla:&lt;br /&gt;
* Caràcter permut  (amb key i StringCharCode)&lt;br /&gt;
* Tipus event (keydown, keypress, keyup)&lt;br /&gt;
* Propietat keycode&lt;br /&gt;
* Propietat charcode&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 5 events]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== informació sobre els esdeveniments de ratolí ===&lt;br /&gt;
La informació més rellevant sobre els esdeveniments relacionats amb el ratolí és la de les coordenades de la posició del punter del ratolí. Encara que l'origen de les coordenades sempre es troba en la cantonada superior esquerra, el punt que es pren com a referència de les coordenades pot variar.&lt;br /&gt;
&lt;br /&gt;
D'aquesta forma, és possible obtenir la posició del ratolí respecte de la pantalla de l'ordinador, respecte de la finestra del navegador i respecte de la pròpia pàgina HTML (que s'utilitza quan l'usuari ha fet scroll sobre la pàgina). Les coordenades més senzilles són les que es refereixen a la posició del punter respecte de la finestra del navegador, que s'obtenen mitjançant les propietats clientX i clientY:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function muestraInformacion(elEvento) {&lt;br /&gt;
   var esdeveniment = elEvento || window.event;&lt;br /&gt;
   var coordenadaX = esdeveniment.clientX;&lt;br /&gt;
   var coordenadaY = esdeveniment.clientY;&lt;br /&gt;
   alert(&amp;quot;Has premut el ratolí en la posició: &amp;quot; + coordenadaX + &amp;quot;, &amp;quot; + coordenadaY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.onclick = muestraInformacion;&lt;br /&gt;
//document.addeventlistener(click,&amp;quot;muestraInformacion&amp;quot;,false);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les coordenades de la posició del punter del ratolí respecte de la pantalla completa de l'ordinador de l'usuari s'obtenen de la mateixa forma, mitjançant les propietats '''screenX''' i '''screenY''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var coordenadaX = esdeveniment.screenX;&lt;br /&gt;
var coordenadaY = esdeveniment.screenY;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En moltes ocasions, és necessari obtenir un altre parell de coordenades diferents: les que corresponen a la posició del ratolí respecte de l'origen de la pàgina. Aquestes coordenades no sempre coincideixen amb les coordenades respecte de l'origen de la finestra del navegador, ja que l'usuari pot fer scroll sobre la pàgina web. Internet Explorer no proporciona aquestes coordenades de forma directa, mentre que la resta de navegadors sí que ho fan. D'aquesta forma, és necessari detectar si el navegador és de tipus Internet Explorer i en cas afirmatiu realitzar un càlcul senzill:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Detectar si el navegador és Internet Explorer&lt;br /&gt;
var ie = navigator.userAgent.toLowerCase().indexOf('msie')!=-1;&lt;br /&gt;
&lt;br /&gt;
if(ie) {&lt;br /&gt;
     coordenadaX = esdeveniment.clientX + document.body.scrollLeft;&lt;br /&gt;
     coordenadaY = esdeveniment.clientY + document.body.scrollTop;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
     coordenadaX = esdeveniment.pageX;&lt;br /&gt;
     coordenadaY = esdeveniment.pageY;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;Has premut el ratolí en la posició: &amp;quot; + coordenadaX + &amp;quot;, &amp;quot; + coordenadaY + &amp;quot; respecte de la pàgina web&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La variable '''ie''' val '''true''' si el navegador en el qual s'executa el script és de tipus Internet Explorer (qualsevol versió) i val '''false''' en un altre cas. Per a la resta de navegadors, les coordenades respecte de l'origen de la pàgina s'obtenen mitjançant les propietats '''pageX''' i '''pageY'''. En el cas d'Internet Explorer, s'obtenen sumant la posició respecte de la finestra del navegador (clientX, clientY) i el desplaçament que ha sofert la pàgina (document.bodi.scrollLeft, document.bodi.scrollTop).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Client_page_screen.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gràfics senzills amb canvas ===&lt;br /&gt;
Amb els esdeveniments de teclat i ratolí podrem programar jocs senzills. Només ens caldrà saber com situar i moure gràfics per la pantalla. Amb aquesta finalitat ens serà d'ajuda l'ús de l'element '''canvas''' de HTML.&lt;br /&gt;
&lt;br /&gt;
Al següent exemple definim un canvas (llenç) de 800x600 píxels i hi situem la imatge d'un cotxe a la coordenada (400,300). &lt;br /&gt;
&amp;lt;source lang=&amp;quot;HTML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;canvas id=&amp;quot;myCanvas&amp;quot; width=&amp;quot;800&amp;quot; height=&amp;quot;600&amp;quot; style=&amp;quot;background-color: lightskyblue;&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img id=&amp;quot;cotxe&amp;quot; src=&amp;quot;cotxe.jpg&amp;quot; style=&amp;quot;display: none;&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var canvas;&lt;br /&gt;
var ctx;&lt;br /&gt;
var imatge;&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
         canvas= document.getElementById(&amp;quot;myCanvas&amp;quot;);&lt;br /&gt;
         ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
         imatge=document.getElementById(&amp;quot;cotxe&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ctx.drawImage(imatge,400,300);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si volem simular el moviment de la imatge haurem l'haurem d'esborrar de la posició antiga i tornar-la a dibuixar a la nova posició. Per borrar la imatge podem dibuixar un rectangle del color de fons del canvas sobre la imatge amb les instruccions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
ctx.fillStyle = &amp;quot;lightskyblue&amp;quot;&lt;br /&gt;
ctx.fillRect(0,300,100,66);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'exemple dibuixem al canvas un triangle de color lightskyblue a la coordenada (0,300) i de dimensions 100x66.&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Coordenades del punter ===&lt;br /&gt;
Crea una pàgina on es mostri constantment les coordenades del punter dins de la pàgina (propietats clientX, clientY).&lt;br /&gt;
&lt;br /&gt;
=== event MOUSEOVER ===&lt;br /&gt;
Crea una pàgina de contingut lliure que tingui els següents elements:&lt;br /&gt;
*Títol (capçalera H1)&lt;br /&gt;
*Tres paràgrafs que continguin una imatge alineada a la dreta o a l'esquerra del text. La longitud del text de cada paràgraf serà prou extensa per a superar l'alçada de la imatge respectiva.&lt;br /&gt;
*Tres títols (capçalera H2) que precediran cadascun dels paràgrafs.&lt;br /&gt;
Programa les respostes als events MOUSEOVER de cada element de forma que:&lt;br /&gt;
*tots els elements de text (quatre capçaleres i tres paràgrafs) canviin de format quan tenen el punter del ratolí al damunt. Cada element de text tornarà al seu format original quan el punter ja no sigui al damunt&lt;br /&gt;
*les imatges giraran en sentit horari quan tinguin el punter al damunt i deixaran de fer-ho quan el punter ja no sigui al damunt.&lt;br /&gt;
&lt;br /&gt;
=== Ordre dels events ===&lt;br /&gt;
Crea una pàgina amb quatre seccions DIV aniuades i etiquetades amb els noms div1, ... , div4:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;div1&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div2&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div3&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div4&amp;quot;&amp;gt;contingut random...&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Crea funcions de resposta a l'event CLICK per a cada element DIV que escrigui un missatge de l'estil &amp;quot;Has clickat sobre l'element div1&amp;quot;.&lt;br /&gt;
Com aconseguiries que l'ordre en què es disparen els elements siguin els següents?:&lt;br /&gt;
*div1,div2,div3,div4&lt;br /&gt;
*div4,div3,div2,div1&lt;br /&gt;
*div1,div3,div4,div2&lt;br /&gt;
&lt;br /&gt;
=== Event document.onload ===&lt;br /&gt;
Crea una pàgina on sigui imprescindible assignar les funcions de resposta a events quan es dispara l'event document.onload.&lt;br /&gt;
&lt;br /&gt;
=== Estrella Michelin ===&lt;br /&gt;
&lt;br /&gt;
Un restaurant té 4 tapes principals on cadascuna té un preu  1 €, 2 €, 3 € i 4 € (esquerra a dreta). &lt;br /&gt;
&lt;br /&gt;
Com el local és petit, es disposa de dos cambrers, cadascun d'ells té un botó que l'executarà en el cas de servir una tapa. Quan un cambrer serveixi una tapa haurà:&lt;br /&gt;
*1. Primer seleccionar-se amb el botó&lt;br /&gt;
*2. Clicar a la tapa o tapes servides.&lt;br /&gt;
&lt;br /&gt;
Cada vegada que el cambrer faci click a una tapa el seu preu s'incrementarà en la recaudació del cambrer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Michelin.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
:[[solucio michelin]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Fitxer:Gamepad.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
Dibuixa un rectangle i que es mova en funció del joystick, i mostre per pantalla els diferents botons.&lt;br /&gt;
 &lt;br /&gt;
http://html5gamepad.com&lt;br /&gt;
&lt;br /&gt;
:[[ejm_gamepad]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ratolí i Teclat ===&lt;br /&gt;
a) Es vol que el ratolí, en qualsevol punt de la finestra del navegador, es mostri la posició del punter respecte del navegador i respecte de la pàgina.&lt;br /&gt;
[[Fitxer:ex_ratoli.gif|100px]]&lt;br /&gt;
&lt;br /&gt;
b) Es vol que, a més a més, en prémer qualsevol tecla, el missatge mostrat ha de canviar per indicar el nou esdeveniment i la seva informació associada.&lt;br /&gt;
[[Fitxer:ex_teclat.gif|100px]]&lt;br /&gt;
&lt;br /&gt;
c)Afegir la següent característica al script: quan es prem un botó del ratolí, el color de fons del quadre de missatge ha de ser groc (#FFFFCC) i quan es prem una tecla, el color de fons ha de ser blau (#CCE6FF). En tornar a moure el ratolí, el color de fons torna a ser blanc.&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fitxer:ex_tec_rat_color.gif|200px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 6 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Posició ratolí ===&lt;br /&gt;
Crear un script que informi a l'usuari en què zona de la pantalla ha premut el ratolí. Les zones definides són les següents: esquerra a dalt, esquerra a baix, dreta a dalt i dreta a baix.&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 7 Events]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Cuadrat===&lt;br /&gt;
&lt;br /&gt;
Es desitja que un cuadrat es mova al llarg de la pantalla&lt;br /&gt;
&lt;br /&gt;
:[[sol_cuadrat]]&lt;br /&gt;
&lt;br /&gt;
=== Joc Tenis ===&lt;br /&gt;
Es tracta de implementar en Javascript un dels 1ers jocs que es va inventar per a PC. El joc del Tenis. &lt;br /&gt;
[[Fitxer:tenis.png|400px|center]]&lt;br /&gt;
Per començar el joc s'ha de pulsar la tecla 'S', per parar 'P' i per reinicializar la 'R'.&lt;br /&gt;
&lt;br /&gt;
Jugador 1:&lt;br /&gt;
*Utilitza el ratolí per el desplaçament de la raqueta&lt;br /&gt;
Jugador 2:&lt;br /&gt;
*tecla '↑' per desplaçar la raqueta cap a dalt&lt;br /&gt;
*tecla '↓' per desplaçar la raqueta cap a baix&lt;br /&gt;
Altres aspectes del joc&lt;br /&gt;
*A més a més, hi ha un marcador que indiqui qui va guanyant.&lt;br /&gt;
*També hi ha un botó, per exemple F2, per augmentar el número de pilotes&lt;br /&gt;
*També hi ha un botó per canviar els colors del joc. Pot existir diversos temes (F5-F8)&lt;br /&gt;
&lt;br /&gt;
https://www.w3schools.com/html/html5_draganddrop.asp&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Expressions Regulars =&lt;br /&gt;
Les expressions regulars son una necessitat a l'hora de validar formularis. Alguns problemes de validació no es podrien solucionar de una manera elegant sense elles.&lt;br /&gt;
Les expressions regulars son senzillament una manera d'expresar un patró per a cadenes coincidents de text. La expressions contenen termes i operadors que ens pemeten definir els patrons.&lt;br /&gt;
&lt;br /&gt;
== Creació d'expresions regulars ==&lt;br /&gt;
A Javascript, com succeeix amb la majoria d'objectes, existeixen dos formes de crear expresions regulars: &lt;br /&gt;
*mitjançant un literal&lt;br /&gt;
*creant una instància d'un objecte de tipus '''RegExp'''&lt;br /&gt;
&lt;br /&gt;
La creació d'una expressió regular amb un literal és molt sezill. Veïem un exemple. Volem crear una expressió regular que coincideixi exactament amb el string &amp;quot;test&amp;quot;:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = /test/;&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
Les expresions regulars van envoltades del caràctes /. Igual que els String van envoltades del caràcter &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
També podíem haver creat una instància del objecte RegExp de la següent manera:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = new RegExp(&amp;quot;test&amp;quot;);&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificadors ha utilitzar a l'hora de crear expressions regulars ==&lt;br /&gt;
A més a més de la propia expressió regular, podem introduïr els següents modificadors:&lt;br /&gt;
*''i'': Fa que no distingeixi de majúscules i minúscules. ex: /test/i&lt;br /&gt;
*''g'': Realitza una comparació global, en comptes de parar-se després de la primera coincidència.&lt;br /&gt;
*''m'': Realitza una comparació multilínia (més detalls a https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/multiline )&lt;br /&gt;
Exemple d'ús:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = /test/ig&lt;br /&gt;
var pattern2 = new RegExp(&amp;quot;test&amp;quot;,&amp;quot;ig&amp;quot;);&lt;br /&gt;
//exemple d'us de la expressió regular&lt;br /&gt;
alert(pattern.test(&amp;quot;test&amp;quot;));&lt;br /&gt;
alert(pattern2.test(&amp;quot;test&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termes i Operadors ==&lt;br /&gt;
&lt;br /&gt;
*''Coincidència exacta'': Tot lo que no sigui un caràcter especial o un operador haurà d'apareixer de forma literal en la expressió. Ex: /test/ la paraula '''test'' ha d'aparèixer exactament.&lt;br /&gt;
*''Combinacions de caràcters'': Moltes vegades no volem combinar un caràcter literal específic, sino un grup finit de caràcters. Podem especificar-ho col·locant el grup de caràcters que volem combinar entre claudàtors. Ex: [abc]&lt;br /&gt;
*''Combinacions de caràcters excloents'': Altres vegades volem combinar tots els caràcters trets d'uns quants. Per fer-ho podem utilitzar el símbol ''^'' seguit dels caràcters que no volem en la expresió. Ex: [^abc]. &lt;br /&gt;
*''Rang de valors'': També tenim la habilitat d'especificar un rang de valors. Ex: volem qualsevol caràcter entre '''a''' i '''m''' minmúscula --&amp;gt; [a-m] (ambdós incloses).&lt;br /&gt;
&lt;br /&gt;
=== Caràcters especials ===&lt;br /&gt;
Existeixen caràcters especials en les expresions regulars, de fet, ja hem vist uns quants: '''[''', ''']''', '''-''' i '''^'''.&lt;br /&gt;
Però encara hi ha uns quants més com serien el '''$''', '''{''', '''}''', '''?''', ''',''', '''+''' i el '''.'''&lt;br /&gt;
Com podem fer per utilitzar-los de forma literal en comptes d'utilitzar-los com a operadors de les expressions regulars? Escapant-los.&lt;br /&gt;
Però com? Utilitzant un caràcter especial: ''\''. Ex: La expressió regular '''/\[/''' significa el caràcter '''[''' i no l'inici d'un grup de caràcters.  &lt;br /&gt;
Així mateix, per poder utilitzar el caràcter '''\''' dintre de la expressió regular l'haurem d'escapar. Ex: '''\\''' correspon al literal '''\'''.&lt;br /&gt;
&lt;br /&gt;
=== Principis i finals ===&lt;br /&gt;
A vegades volem que un patró coincideixi amb el principi d'una cadena o amb el final. &lt;br /&gt;
*Principi: Utilitzarem el caràcter ''^''. Ex: /^test/ : només coincideix si la cadena '''test''' coincideix amb el principi.&lt;br /&gt;
*Final: Utilitzarem el caràcter ''$''. Ex: /test$/ : només coincideix si la cadena '''test''' coincideix amb el final.&lt;br /&gt;
*Principi i final: Ex: /^test$/ : Indica que el patró especificat ha d'incluir tota la cadena candidata.&lt;br /&gt;
&lt;br /&gt;
=== Repetició de caràcters ===&lt;br /&gt;
&lt;br /&gt;
Si volem combinar una serie de quatre caràcters 'a' podem expressar-ho amb ''/aaa/'' però que succeeix si volem utilitzar un número qualsevol de repeticions del mateix caràcter?&lt;br /&gt;
Tenim diferents opcions:&lt;br /&gt;
*Podem especificar que un caràcter és opcional, es a dir, &amp;lt;b&amp;gt;pot aparèixer alguna vegada o cap (0 ó 1)&amp;lt;/b&amp;gt;, Es fa afegint el caràcter '''''?''''' al final. Exemple: /t?est/. Aquest patró combina dues opcions: '''test i est'''.&lt;br /&gt;
*Si volem que un caràcter '''apareixi moltes vegades (1 o més)''' utilitzarem '''''+'''''. Ex: /t+est/. Aquest patró combina '''test''', '''ttest''' i '''tttest''' però no '''est'''.&lt;br /&gt;
*Si volem que un '''caràcter apareixi zero o més vegades (0 o més)''' utilitzem el caràcter '''*'''. Ex: /t*est/. Aquest patró combina '''test''', '''ttest''', '''tttest''' i també '''est'''.&lt;br /&gt;
*Podem especificar una quantitat concreta amb el número de repeticions permeses entre claudàtors '''''{}'''''Text en negreta. Per exemple, /a{4}/ indica una coincidència de quatre caràcters 'a' consecutius.&lt;br /&gt;
*També podem especificar un intérval per al compte de repeticions. Per exemple, /a{4,10}/ indica una combinació de 4 a 10 caracters 'a' consecutius.&lt;br /&gt;
*Si en aquest interval no s'indica el segon valor de l'intèrval indiquem que el número final és infinit. Ex: /a{4,}/. Aquest patró combina qualsevol cadena de cuatre o més caràcters 'a' consecutius. Fixat que és important posar la '''coma''' després del 4.&lt;br /&gt;
&lt;br /&gt;
=== Caràcters predefinits ===&lt;br /&gt;
La sintaxis de les expressions regulars ens proporcionen un nombre de termes predefinits que representen caràcters o clases de caràcters que s'utilitzen amb freqüència. &lt;br /&gt;
Taula:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Terme Predefinit&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Equivalència&lt;br /&gt;
|-&lt;br /&gt;
| \t ||Tabulació horitzontal&lt;br /&gt;
|-&lt;br /&gt;
| \b ||Retrocés&lt;br /&gt;
|-&lt;br /&gt;
| \v ||Tabulació Vertical&lt;br /&gt;
|-&lt;br /&gt;
| \f||Salt de página&lt;br /&gt;
|-&lt;br /&gt;
| \r||Retorn de carro.&lt;br /&gt;
|-&lt;br /&gt;
| \n||Nova linia&lt;br /&gt;
|-&lt;br /&gt;
| \cA : \cZ||Caràcters de control&lt;br /&gt;
|-&lt;br /&gt;
| \x0000 : \xFFFF||Unicode Hexadecimal&lt;br /&gt;
|-&lt;br /&gt;
|  \x00 : \xFF||ASCII Hexadecimal&lt;br /&gt;
|-&lt;br /&gt;
| .||Qualsevol caràcter, excepte nova linia&lt;br /&gt;
|-&lt;br /&gt;
|  \d||Qualsevol dígit decimal. Equivalent a [0-9]&lt;br /&gt;
|-&lt;br /&gt;
| \D||Qualsevol caràcter menys un dígit decimal. Equivalent a [^0-9]&lt;br /&gt;
|-&lt;br /&gt;
| \w||Qualsevol caràcter alfanuméric incloent el subratllat. [A-Za-z0-9_]&lt;br /&gt;
|-&lt;br /&gt;
| \W||Qualsevol caràcter menys els alfanumèric i el subratllat. [^A-Za-z0-9_]&lt;br /&gt;
|-&lt;br /&gt;
| \s||Qualsevol espai en blanc (espai, tabulador, salt de pàgina,etc.)&lt;br /&gt;
|-&lt;br /&gt;
| \S||Qualsevol caràcter menys un espai en blanc.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Per veure el llistat complert fes click [http://www.visibone.com/regular-expressions/ aquí].&lt;br /&gt;
&lt;br /&gt;
=== Agrupació de caràcters ===&lt;br /&gt;
De moment, hem observat que els operadors + i * només afecten al terme que els '''precedeix'''. Si volem aplicar-los a un grup de termes, podem utilitzar ''parèntesis'', igual que si es tractés d'una formula matemàtica. Per exemple: /(ab)+/. Aquest patró combina una o més aparicions de la cadena '''ab'''.&lt;br /&gt;
&lt;br /&gt;
=== Alternància de caràcters ===&lt;br /&gt;
La alternància pot expressar-se utilitzant el caràcter '''|'''. Per exemple: /a|b/ combina el caràcter '''a''' o '''b''', i /(ab)+|(cd)+/ combina només una o més repeticions de '''ab''' o '''cd'''.&lt;br /&gt;
&lt;br /&gt;
== Mètodes de les Expressions Regulars ==&lt;br /&gt;
*''pattern.test(cadena)'' : Executa la expressió regular e indica si la cadena passada per paràmetre coincideix o no. (retorna True o False)&lt;br /&gt;
*''pattern.exec(cadena)'' : Executa la expressió regular i retorna la primera coincidència.&lt;br /&gt;
== Resum Expressions Regulars ==&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Expresiones.jpg]]&lt;br /&gt;
[http://rua.ua.es/dspace/bitstream/10045/13363/6/07c-JavaScriptExpReg.pdf Resum Expressions Regulars]&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.regexr.com/ Comprovar expressions regulars]&lt;br /&gt;
&lt;br /&gt;
[https://regex101.com/ Comprovar expressions regulars II]&lt;br /&gt;
&lt;br /&gt;
Crea un patró per a cadascuna de les diferents cadenes que es mostren a continuació:&lt;br /&gt;
&lt;br /&gt;
*Codi postal. Ex: 46700&lt;br /&gt;
*Numero de telèfon amb prefix i guións, el primer nombre pot ser un 8 ó 9. Ex: 93-123-11-33&lt;br /&gt;
*Numero de telèfon amb prefix i punts. Ex: 93-1.231.1339&lt;br /&gt;
*Numero de telèfon internacional. Ex: (+34)952356817 &lt;br /&gt;
*Nom d'usuari amb un mínim de 4 i un màxim de 15. Ex: julio_30&lt;br /&gt;
*Nombre Real. Ex:  -122.33 ó 7,3 ó 8 &lt;br /&gt;
*Numero ISBN de 13 dígits: 978-3-16-148410-0&lt;br /&gt;
*Numero de la seguretat social: 01-123456789&lt;br /&gt;
*Adreça Postal amb les següent condicions: Carrer (C\), Plaza(Pz.), Avinguda(Av.). Direcció. Numero - Porta.&lt;br /&gt;
Ex: C\ Mare de Deu de montserrat. 233 - 2&lt;br /&gt;
*Numero IP d'un ordinador de la versió 4.&lt;br /&gt;
*Numero Mac d'un ordinador separats per ':'&lt;br /&gt;
*URL (amb http, https, www, etc)&lt;br /&gt;
*Data: Ex: DD/MM/AAAA&lt;br /&gt;
*Hora: 23:55:55&lt;br /&gt;
*Email&lt;br /&gt;
*Comprobar un nombre propio&lt;br /&gt;
*Targeta de crèdit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Codi postal. Ex: 46700&lt;br /&gt;
**sol: ^\d{5}$ &lt;br /&gt;
*Numero de telèfon amb prefix i guións, el primer nombre pot ser un 8 ó 9. Ex: 93-123-11-33&lt;br /&gt;
**sol: ^[89](\d-\d{3})-\d{2}-\d{2}$&lt;br /&gt;
*Numero de telèfon amb prefix i punts. Ex: 93-1.231.1339&lt;br /&gt;
**sol: ^[89](\d-\d.)\d{3}\.\d{3}$&lt;br /&gt;
*Numero de telèfon internacional. Ex: (+34)952356817 &lt;br /&gt;
**sol: ^\(\+\d{2,3}\)\d{9}$&lt;br /&gt;
*Nom d'usuari amb un mínim de 4 i un màxim de 15. Ex: julio_30&lt;br /&gt;
**sol: ^[a-z\d_]{4,15}$&lt;br /&gt;
*Nombre Real. Ex:  -122.33 ó 7,3 ó 8 &lt;br /&gt;
**sol: ^[+-]?\d+([,.]\d+)?$    &lt;br /&gt;
*Numero ISBN de 13 dígits: 978-3-16-148410-0&lt;br /&gt;
*Numero de la seguretat social: 01-123456789&lt;br /&gt;
**sol: ^\d{2}-\d{9}$&lt;br /&gt;
**sol: ^[0-1]{2}-\d{9}$&lt;br /&gt;
*Adreça Postal amb les següent condicions: Carrer (C\), Plaza(Pz.), Avinguda(Av.). Direcció. Numero - Porta.&lt;br /&gt;
Ex: C\ Mare de Deu de montserrat. 233 - 2&lt;br /&gt;
**sol: ^((C\\)|(Pz\.)|(Av\.))\s.+\.\s\d{1,5}\s-\s\d$&lt;br /&gt;
((C\\)|(Pz\.)|(Av\.))[a-zA-Z ]+\.[0-9 ]+\-[0-9 ]+&lt;br /&gt;
*Numero IP d'un ordinador de la versió 4.&lt;br /&gt;
** sol: ^((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]?)\.)((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]|[0-9])\.){2}((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]|[0-9]))$&lt;br /&gt;
 ^(?:\d{1,3}\.){3}\d{1,3}$&lt;br /&gt;
*Numero Mac d'un ordinador separats per ':'&lt;br /&gt;
*URL (amb http, https, www, etc)&lt;br /&gt;
**sol:(www\.|http:\/\/|https:\/\/)\S*\.(com|es|org))&lt;br /&gt;
*Data: Ex: DD/MM/AAAA&lt;br /&gt;
**sol: ^\d{1,2}\/\d{1,2}\/\d{2,4}$ &lt;br /&gt;
         ^([3][0-1]|[0-2][0-9])\/[0-1]?[0-2]\/[1-2]\d{3}$  coge hasta el día 31 y el mes 12 &lt;br /&gt;
*Hora: 23:55:55&lt;br /&gt;
**sol: ^(0[1-9]|1\d|2[0-3]):([0-5]\d):([0-5]\d)$ &lt;br /&gt;
*Email&lt;br /&gt;
**sol: /^[\w]+@{1}[\w]+\.[a-z]{2,3}$/&lt;br /&gt;
**sol: ^[\\w-]+(\\.[\\w-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$ &lt;br /&gt;
*Comprobar un nombre propio&lt;br /&gt;
**sol: /^([A-Z]{1}[a-zñáéíóú]+[\s]*)+$/ &lt;br /&gt;
*Targeta de crèdit&lt;br /&gt;
**sol:  ^((67\d{2})|(4\d{3})|(5[1-5]\d{2})|(6011))(-?\s?\d{4}){3}|(3[4,7])\ d{2}-?\s?\d{6}-?\s?\d{5}$&lt;br /&gt;
&lt;br /&gt;
= Formularis =&lt;br /&gt;
JavaScript disposa de nombroses propietats i funcions que faciliten la programació d'aplicacions que manegen formularis. En primer lloc, quan es carrega una pàgina web, el navegador crea automàticament una matriu anomenat forms i que conté la referència a tots els formularis de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Per accedir al array forms , s'utilitza l'objecte document , de manera que document.forms és la matriu que conté tots els formularis de la pàgina. Com es tracta d'un array, l'accés a cada formulari es realitza amb la mateixa sintaxi dels arrays. La següent instrucció accedeix al primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més de l'array de formularis, el navegador crea automàticament una matriu anomenat ''elements'' per cadascun dels formularis de la pàgina. Cada array elements conté la referència a tots els elements (quadres de text, botons, llistes desplegables, etc.) d'aquest formulari. Utilitzant la sintaxi dels arrays, la següent instrucció obté el primer element del primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]. elements [0]; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La sintaxi dels arrays no sempre és tan concisa. El següent exemple mostra com obtenir directament l'últim element del primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]. elements [document. forms [0]. elements. length - 1];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Encara que aquesta forma d'accedir als formularis és ràpida i senzilla, té un inconvenient molt greu. Què passa si canvia el disseny de la pàgina i en el codi HTML es canvia l'ordre dels formularis originals o s'afegeixen nous formularis? El problema és que &amp;quot;el primer formulari de la pàgina&amp;quot; ara podria ser un altre formulari diferent al que espera l'aplicació.&lt;br /&gt;
&lt;br /&gt;
En un entorn tan canviant com el disseny web, és molt difícil confiar que l'ordre dels formularis es mantingui estable en una pàgina web. Per aquest motiu, sempre s'hauria d'evitar l'accés als formularis d'una pàgina mitjançant l'array ''document.forms''.&lt;br /&gt;
&lt;br /&gt;
Una forma d'evitar els problemes del mètode anterior consisteix a accedir als formularis d'una pàgina a través del seu nom (atribut '''name''') o a través del seu atribut '''id''' . L'objecte document permet accedir directament a qualsevol formulari mitjançant la seva atribut '''name''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var formularioPrincipal = document. formulari;&lt;br /&gt;
 var formularioSecundario = document. otro_formulario;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/ Form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;otro_formulario&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Accedint d'aquesta forma als formularis de la pàgina, l'script funciona correctament encara que es reordenin els formularis o s'afegeixin nous formularis a la pàgina. Els elements dels formularis també es poden accedir directament mitjançant el seu atribut '''name''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  var formularioPrincipal = document. formulari;&lt;br /&gt;
 var primerElemento = document. formulari. element;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;Input type = &amp;quot;text&amp;quot; name = &amp;quot;element&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Òbviament, també es pot accedir als formularis i als seus elements utilitzant les funcions DOM d'accés directe als nodes. El següent exemple utilitza l'habitual funció '''document.getElementById()''' per accedir de forma directa a un formulari i un dels seus elements:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var formularioPrincipal = document. getElementById (&amp;quot;formulari&amp;quot;);&lt;br /&gt;
 var primerElemento = document. getElementById (&amp;quot;element&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot; id = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;Input type = &amp;quot;text&amp;quot; name = &amp;quot;element&amp;quot; id = &amp;quot;element&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Independentment del mètode utilitzat per obtenir la referència a un element de formulari, cada element disposa de les següents propietats útils per al desenvolupament de les aplicacions:&lt;br /&gt;
*''type'' : indica el tipus d'element que es tracta. Per als elements de tipus &amp;lt;input&amp;gt; ( text , button , checkbox , etc.) coincideix amb el valor del seu atribut '''type''' . Per a les llistes desplegables normals (element &amp;lt;select&amp;gt; ) el seu valor és '''select-one''' , el que permet diferenciar-les de les llistes que permeten seleccionar diversos elements alhora i el tipus és '''select-multiple'''. Finalment, en els elements de tipus &amp;lt;textarea&amp;gt; , el valor de type és '''textarea''' .&lt;br /&gt;
*''form'' : és una referència directa al formulari al qual pertany l'element. Així, per accedir al formulari d'un element, es pot utilitzar document.getElementById(&amp;quot;id_del_elemento&amp;quot;).form&lt;br /&gt;
*''name'' : obté el valor de l'atribut name de XHTML. Només es pot llegir el seu valor, per la qual cosa no es pot modificar.&lt;br /&gt;
*''value'' : permet llegir i modificar el valor de l'atribut value de XHTML. Per als camps de text ( &amp;lt;input type=&amp;quot;text&amp;quot;&amp;gt; i &amp;lt;textarea&amp;gt; ) obté el text que ha escrit l'usuari. Per als botons obté el text que es mostra al botó. Per als elements checkbox i radiobutton no és molt útil, com es veurà més endavant&lt;br /&gt;
&lt;br /&gt;
== Validació ==&lt;br /&gt;
&lt;br /&gt;
La principal utilitat de JavaScript en el maneig dels formularis és la validació de les dades introduïdes pels usuaris. Abans d'enviar un formulari al servidor, es recomana validar mitjançant JavaScript les dades inserides per l'usuari. D'aquesta manera, si l'usuari ha comès algun error en omplir el formulari, se li pot notificar de forma instantània, sense necessitat d'esperar la resposta del servidor.&lt;br /&gt;
&lt;br /&gt;
Notificar els errors de forma immediata mitjançant JavaScript millora la satisfacció de l'usuari amb l'aplicació (el que tècnicament es coneix com &amp;quot;millorar l'experiència d'usuari&amp;quot;) i ajuda a reduir la càrrega de processament al servidor.&lt;br /&gt;
&lt;br /&gt;
Normalment, la validació d'un formulari consisteix en cridar a una funció de validació quan l'usuari prem sobre el botó d'enviament del formulari. En aquesta funció, es comproven si els valors que ha introduït l'usuari compleixen les restriccions imposades per l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Encara que hi ha tantes possibles comprovacions com a elements de formulari diferents, algunes comprovacions són molt habituals: que ompli un camp obligatori, que se seleccioni el valor d'una llista desplegable, que l'adreça d'email indicada sigui correcta, que la data introduïda sigui lògica, que s'hagi introduït un nombre on així es requereix, etc.&lt;br /&gt;
&lt;br /&gt;
A continuació es mostra el codi JavaScript bàsic necessari per incorporar la validació a un formulari:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form name=&amp;quot;formulario&amp;quot;  onSubmit=&amp;quot;return ValidaCampos()&amp;quot;&amp;gt;&lt;br /&gt;
 Teléfono: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;telefono&amp;quot; size=&amp;quot;15&amp;quot; maxlength=&amp;quot;15&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
           &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enviar&amp;quot; name=&amp;quot;enviar&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
I l'esquema de la funció validacio() és el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ValidaCampos() {&lt;br /&gt;
   var expresion_regular_telefono = /^[89](\d-\d.)\d{3}\.\d{3}$/;  &lt;br /&gt;
// 9 cifras numéricas.&lt;br /&gt;
// Usaremos el método &amp;quot;test&amp;quot; de las expresiones regulares:&lt;br /&gt;
      if (expresion_regular_telefono.test(formulario.telefono.value) == false) {&lt;br /&gt;
                alert('Campo TELEFONO no válido.');&lt;br /&gt;
                return false; // sale de la función y NO envía el formulario&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                alert('Gracias por rellenar nuestro formulario correctamente.');&lt;br /&gt;
                return true; // sale de la función y SÍ envía el formulario&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El funcionament d'aquesta tècnica de validació es basa en el comportament de l'esdeveniment '''onsubmit''' de JavaScript. Igual que altres esdeveniments com '''onclick''' i '''onkeypress''' , l'esdeveniment '''onsubmit''' varia el seu comportament en funció del valor que retorna.&lt;br /&gt;
&lt;br /&gt;
Així, si l'esdeveniment '''onsubmit''' torna el valor '''true''' , el formulari s'envia com ho faria normalment. No obstant això, si l'esdeveniment onsubmit torna el valor '''false''' , el formulari no s'envia. La clau d'aquesta tècnica consisteix a comprovar tots i cadascun dels elements del formulari. En tant es troba un element incorrecte, es torna el valor '''false''' . Si no es troba cap error, es torna el valor '''true'''.&lt;br /&gt;
&lt;br /&gt;
Per tant, en primer lloc es defineix l'esdeveniment '''onsubmit''' del formulari com:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  onsubmit = &amp;quot;return validacio()&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Com el codi JavaScript retorna el valor resultant de la funció '''validacio()''' , el formulari només s'enviarà al servidor si aquesta funció retorna '''true''' . En el cas que la funció '''validacio()''' retorni '''false''' , el formulari romandrà sense enviar.&lt;br /&gt;
&lt;br /&gt;
Dins de la funció '''validacio()''' es comproven totes les condicions imposades per l'aplicació. Quan no es compleix una condició, es retorna '''false''' i per tant el formulari no s'envia. Si s'arriba al final de la funció, totes les condicions s'han complert correctament, de manera que es retorna '''true''' i el formulari s'envia.&lt;br /&gt;
&lt;br /&gt;
La notificació dels errors comesos depèn del disseny de cada aplicació. En el codi de l'exemple anterior simplement es mostren missatges mitjançant la funció '''alert()''' indicant l'error produït. Les aplicacions web ben dissenyades mostren cada missatge d'error al costat de l'element de formulari corresponent i també solen mostrar un missatge principal indicant que el formulari conté errors.&lt;br /&gt;
&lt;br /&gt;
Un cop definit l'esquema de la funció '''validacio()''' , s'ha d'afegir a aquesta funció el codi corresponent a totes les comprovacions que es realitzen sobre els elements del formulari.&lt;br /&gt;
&lt;br /&gt;
== Validació formularis HTML5==&lt;br /&gt;
&lt;br /&gt;
[http://cybmeta.com/validacion-de-formularios-con-html5/ Validació formularis HTML5 I]&lt;br /&gt;
&lt;br /&gt;
[http://mytutorials85.blogspot.com.es/2012/04/formularios-en-html5.html?email=fdfds%40fds Validació formularis HTML5 II]&lt;br /&gt;
&lt;br /&gt;
[https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation Client-side form validation]&lt;br /&gt;
&lt;br /&gt;
== Exercicis de Validació ==&lt;br /&gt;
&lt;br /&gt;
=== Formulari de validació 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea un formulari que demani 4 camps en un textbox: nom, cognoms, email i telèfon. El formulari tindrà un botó &amp;quot;Enviar&amp;quot; que validarà el contingut dels textbox i en cas de passar les validacions s'obrirà una nova pàgina (que no cal que existeixi) amb els valors introduïts passats amb el mètode GET:&lt;br /&gt;
*tots els camps seran obligatoris&lt;br /&gt;
*el format serà el típic de cada camp&lt;br /&gt;
*mostra els missatges d'error d'un en un, per ordre i posant el focus al camp que produeix cada error&lt;br /&gt;
*usa els elements que coneixes de HTML, CSS, etc per a marcar l'error. Sigues creatiu&lt;br /&gt;
&lt;br /&gt;
=== Formulari de validació 2 ===&lt;br /&gt;
&lt;br /&gt;
Al formulari anterior afegeix els camps data de naixement, adreça, codi postal i municipi (per aquest ordre) tenint en compte:&lt;br /&gt;
*la data de naixement ha de ser vàlida, en format dd/mm/aaaa i anterior a la data actual.&lt;br /&gt;
*l'adreça estarà formada per caràcters alfanumèrics i també admetrà espais,comes i guions.&lt;br /&gt;
*el codi postal i municipi tindran el format típic d'aquests camps.&lt;br /&gt;
&lt;br /&gt;
=== solució ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.input_ok {background-color: lightcyan}&lt;br /&gt;
.input_error {background-color: rgb(255, 255, 119)}&lt;br /&gt;
.label_error {color: darkred}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body &amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Exercici 1 de Validacions&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;form name=&amp;quot;formulari&amp;quot; onSubmit=&amp;quot;return valida()&amp;quot; action=&amp;quot;ex_validacions.html&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label for=&amp;quot;nom&amp;quot;&amp;gt;Nom:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;nom&amp;quot; name=&amp;quot;nom&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_nom&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;cognoms&amp;quot;&amp;gt;Cognoms:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;cognoms&amp;quot; name=&amp;quot;cognoms&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_cognoms&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;email&amp;quot;&amp;gt;Email:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;email&amp;quot; name=&amp;quot;email&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_email&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;telefon&amp;quot;&amp;gt;Telefon:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;telefon&amp;quot; name=&amp;quot;telefon&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_telefon&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;data&amp;quot;&amp;gt;Data de naixement:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;data&amp;quot; name=&amp;quot;data&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_data&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;adreca&amp;quot;&amp;gt;Adreça:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;adreca&amp;quot; name=&amp;quot;adreca&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_adreca&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;cp&amp;quot;&amp;gt;Codi postal:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;cp&amp;quot; name=&amp;quot;cp&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_cp&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;municipi&amp;quot;&amp;gt;Municipi:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;municipi&amp;quot; name=&amp;quot;municipi&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_municipi&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body &amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function valida(){&lt;br /&gt;
&lt;br /&gt;
var nom=document.getElementById(&amp;quot;nom&amp;quot;).value;&lt;br /&gt;
var cognoms=document.getElementById(&amp;quot;cognoms&amp;quot;).value;&lt;br /&gt;
var email=document.getElementById(&amp;quot;email&amp;quot;).value;&lt;br /&gt;
var telefon=document.getElementById(&amp;quot;telefon&amp;quot;).value;&lt;br /&gt;
var data=document.getElementById(&amp;quot;data&amp;quot;).value;&lt;br /&gt;
var adreca=document.getElementById(&amp;quot;adreca&amp;quot;).value;&lt;br /&gt;
var cp=document.getElementById(&amp;quot;cp&amp;quot;).value;&lt;br /&gt;
var municipi=document.getElementById(&amp;quot;municipi&amp;quot;).value;&lt;br /&gt;
var patt_alfanumeric = /^[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ]+(\s[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ]+)*$/;&lt;br /&gt;
var patt_email = /^\w+@\w+\.\w+$/;&lt;br /&gt;
var patt_telefon =/^\d{9}$/;&lt;br /&gt;
var patt_data = /^\d{2}\/\d{2}\/\d{4}$/;&lt;br /&gt;
var patt_adreca = /^[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ\,\.\-]+(\s[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ\,\.\-]+)*$/;&lt;br /&gt;
var patt_cp=/^\d{5}$/;&lt;br /&gt;
&lt;br /&gt;
// reset format dels textbox i missatges d'error&lt;br /&gt;
document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//validació del nom&lt;br /&gt;
if(nom==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_alfanumeric.test(nom)) {&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació dels cognoms&lt;br /&gt;
if(cognoms==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_alfanumeric.test(cognoms)) {&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del email&lt;br /&gt;
if(email==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_email.test(email)) {&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (ex. usuari@servidor.xx)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del telefon&lt;br /&gt;
if(telefon==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_telefon.test(telefon)) {&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (6 digits)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació de la data&lt;br /&gt;
if(data==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_data.test(data)) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (dd/mm/aaaa)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var components_data = data.split(&amp;quot;/&amp;quot;);&lt;br /&gt;
var val_data=Date.parse(components_data[2]+&amp;quot;/&amp;quot;+components_data[1]+&amp;quot;/&amp;quot;+components_data[0]);&lt;br /&gt;
&lt;br /&gt;
if(isNaN(val_data)) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;data no vàlida&amp;quot;;&lt;br /&gt;
	return false;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var today=new Date();&lt;br /&gt;
if(val_data&amp;gt;=today) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;la data ha de ser anterior a la data acutal&amp;quot;;&lt;br /&gt;
	return false;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//validació de l'adreça&lt;br /&gt;
if(adreca==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_adreca.test(adreca)) {&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del codi postal&lt;br /&gt;
if(cp==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_cp.test(cp)) {&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (5 digits)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del municipi&lt;br /&gt;
if(municipi==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_adreca.test(municipi)) {&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return true;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
	&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
POSIBLE EJERCICIO&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tags = document.querySelectorAll('h1,h2,h3,h4,h5,h6,div,p');&lt;br /&gt;
for (var i = tags.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
  tags[i].style.outline = &amp;quot;1px solid green&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validar un camp de text Obligatori ===&lt;br /&gt;
Es tracta de forçar l'usuari a introduir un valor en un quadre de text o textarea en què sigui obligatori.Perquè es doni per completat un camp de text obligatori, es comprova que el valor introduït sigui vàlid, que el nombre de caràcters introduït sigui més gran que zero i que no s'hagin introduït només espais en blanc.  El text introduït tingui una longitud superior a zero caràcters, és a dir, que no sigui un text buit i per últim, el valor introduït per l'usuari no només estigui format per espais en blanc.&lt;br /&gt;
&lt;br /&gt;
:[[solució_valor_quadre_text]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un camp de text amb valors numèrics ===&lt;br /&gt;
Es tracta d'obligar l'usuari a introduir un valor numèric en un quadre de text.&lt;br /&gt;
:[[solucio_camp_text]]&lt;br /&gt;
&lt;br /&gt;
===  Validar que s'ha seleccionat una opció d'una llista ===&lt;br /&gt;
Es tracta d'obligar l'usuari a seleccionar un element d'una llista desplegable.&lt;br /&gt;
:[[solucio_llista]]&lt;br /&gt;
&lt;br /&gt;
=== Validar una adreça de correu electrònic ===&lt;br /&gt;
Es tracta d'obligar l'usuari a introduir una adreça de correu amb un format vàlid. Per tant, el que es comprova és que la direcció sembli vàlida, ja que no es comprova si es tracta d'un compte de correu electrònic real i operativa. La comprovació es realitza novament mitjançant les expressions regulars, ja que les adreces de correu electrònic vàlides poden ser molt diferents.&lt;br /&gt;
:[[solucio_correu_electronic]]&lt;br /&gt;
&lt;br /&gt;
=== Validar una data ===&lt;br /&gt;
Les dates solen ser els camps de formulari més complicats de validar per la multitud de formes diferents en què es poden introduir.&lt;br /&gt;
:[[solucio_dates]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un número de DNI ===&lt;br /&gt;
Es tracta de comprovar que el nombre proporcionat per l'usuari es correspon amb un nombre vàlid de document nacional d'identitat o DNI. Encara que per cada país o regió els requisits del document d'identitat de les persones poden variar, a continuació es mostra un exemple genèric fàcilment adaptable. La validació no només ha de comprovar que el nombre estigui format per vuit xifres i una lletra, sinó que també cal comprovar que la lletra indicada és correcta per al número introduït.&lt;br /&gt;
:[[solució_dni]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un número de telèfon ===&lt;br /&gt;
Els números de telèfon poden ser indicats de formes molt diferents: amb prefix nacional, amb prefix internacional, agrupat per parells, separant els números amb guions, etc.&lt;br /&gt;
:[[solucio_telefon]]&lt;br /&gt;
&lt;br /&gt;
=== Validar que un checkbox ha estat seleccionat ===&lt;br /&gt;
*a)Es tracta de validar si un element de tipus checkbox s'ha de seleccionar de forma obligatòria. &lt;br /&gt;
*b)Es tracta de validar si tots els checkbox del formulari han estat seleccionats.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_checkbox]]&lt;br /&gt;
&lt;br /&gt;
=== Validar que un radiobutton ha estat seleccionat ===&lt;br /&gt;
Encara que es tracta d'un cas similar al dels checkbox, la validació dels radiobutton presenta una diferència important: en general, la comprovació que es realitza és que l'usuari hagi seleccionat algun radiobutton dels que formen un determinat grup.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_radiobutton]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;JavaScript RegExp Reference: https://www.w3schools.com/jsref/jsref_obj_regexp.asp&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Experiments amb Expresions Regulars: http://www.regexplanet.com/advanced/javascript/index.html &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;John Resig, Bear Bibeault, &amp;quot;Secrets of the Javascript Ninja&amp;quot;, Manning Publications, 2012. ISBN 193398869X&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[http://librosweb.es/javascript/capitulo_7.html Introducció a Javascript] &amp;lt;/p&amp;gt; &amp;lt;p&amp;gt; [https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions Expressions Regulars a Mozilla]&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Model_d%27objectes_del_document&amp;diff=17186</id>
		<title>NF2 - Model d'objectes del document</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Model_d%27objectes_del_document&amp;diff=17186"/>
				<updated>2023-03-07T18:12:35Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici Carta Restaurant - continuació */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Document Object Model =&lt;br /&gt;
És un conjunt d'objectes (API) Javascript que permeten interactuar amb el document HTML. Podem realitzar les següents operacions:&lt;br /&gt;
*Canviar i llegir el contingut i la estructura&lt;br /&gt;
*Canviar i llegir estils CSS&lt;br /&gt;
*Gestionar events&lt;br /&gt;
&lt;br /&gt;
Existeixen diversos nivells (versions) de DOM :&lt;br /&gt;
*Nivell 0: Introduït per Netscape i Microsoft a principis dels 90 durant la guerra dels navegadors. Per aixó, no existeix un DOM estàndard.&lt;br /&gt;
*Nivell 1: A partir d'aquí es va fer càrrec del DOM el W3C. Va introduir contingut dinàmic.&lt;br /&gt;
*Nivell 2: &amp;quot;Serialització&amp;quot; de XML (ex: permet guardar documents), events de teclat,...&lt;br /&gt;
&lt;br /&gt;
Els navegadors per poder utilitzar les utilitats de DOM, necessiten transformar la pàgina original. Una pàgina HTML normal no és més que una successió de caràcters, per la qual cosa és un format molt difícil de manipular. Per això, els navegadors web transformen automàticament totes les pàgines web en una estructura més eficient de manipular.&lt;br /&gt;
&lt;br /&gt;
== Arbre DOM ==&lt;br /&gt;
DOM transforma tots els documents XHTML en un conjunt d'elements anomenats nodes, que estan interconnectats i que representen els continguts de les pàgines web i les relacions entre ells. Pel seu aspecte, la unió de tots els nodes es diu &amp;quot;arbre de nodes&amp;quot;.&lt;br /&gt;
[[Fitxer:dom1.png|center]]&lt;br /&gt;
&lt;br /&gt;
L'arrel de l'arbre de nodes de qualsevol pàgina XHTML sempre és la mateixa: un node de tipus especial denominat ''Document''.&lt;br /&gt;
&lt;br /&gt;
A partir d'aquest node arrel, cada etiqueta XHTML es transforma en un node de tipus ''Element''. La conversió d'etiquetes en nodes es realitza de forma jeràrquica. D'aquesta forma, del node arrel solament poden derivar els nodes HEAD i BODY. A partir d'aquesta derivació inicial, cada etiqueta XHTML es transforma en un node que deriva del node corresponent a la seva '''etiqueta pare'''.&lt;br /&gt;
&lt;br /&gt;
La transformació de les etiquetes XHTML habituals genera dos nodes: el primer és el node de tipus ''Element'' (corresponent a la pròpia etiqueta XHTML) i el segon és un node de tipus ''Text'' que conté el text tancat per aquesta etiqueta XHTML.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=iso-8859-1&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Página sencilla&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Esta página es &amp;lt;strong&amp;gt;muy sencilla&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fitxer:dom2.gif|center]]&lt;br /&gt;
L'especificació completa de DOM defineix 12 tipus de nodes:&lt;br /&gt;
[[Fitxer:dom3.png|center]]&lt;br /&gt;
Encara que les pàgines XHTML habituals es poden manipular manejant solament quatre o cinc tipus de nodes:&lt;br /&gt;
*''Document'', node arrel del que deriven tots els altres nodes de l'arbre.&lt;br /&gt;
*''Element'', representa cadascuna de les etiquetes XHTML. Es tracta de l'únic node que pot contenir atributs i l'únic del que poden derivar altres nodes.&lt;br /&gt;
*''Attr'', es defineix un node d'aquest tipus per representar cadascun dels atributs de les etiquetes XHTML, és a dir, un per cada parell atribut=valor.&lt;br /&gt;
*''Text'', node que conté el text tancat per una etiqueta XHTML.&lt;br /&gt;
*''Comment'', representa els comentaris inclosos a la pàgina XHTML.&lt;br /&gt;
&lt;br /&gt;
Cada node té diverses propietats que reflecteixen el grau parentiu amb els altres. Alguna d'aquestes propietats son les següents:&lt;br /&gt;
*childNodes: array amb els nodes fills.&lt;br /&gt;
*firstChild: primer node fills&lt;br /&gt;
*lastchild: últim node fill&lt;br /&gt;
*parentNode: node pare&lt;br /&gt;
*nextSibling: següent germà (node al mateix nivell i amb el mateix pare)&lt;br /&gt;
*lastSibling: germà anterior.&lt;br /&gt;
Exemple:&lt;br /&gt;
[[Fitxer:dom4.png|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul id=&amp;quot;myList&amp;quot;&amp;gt;&amp;lt;li&amp;gt;Coffee&amp;lt;/li&amp;gt;&amp;lt;li id=&amp;quot;arribaHermano&amp;quot;&amp;gt;Tea&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Mejillones&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var pri = document.getElementById(&amp;quot;myList&amp;quot;).firstChild.innerHTML;&lt;br /&gt;
var ulti = document.getElementById(&amp;quot;myList&amp;quot;).lastChild.innerHTML;&lt;br /&gt;
var x = document.getElementById(&amp;quot;myList&amp;quot;).parentNode.nodeName;&lt;br /&gt;
var Upbrother = document.getElementById(&amp;quot;arribaHermano&amp;quot;).previousSibling.innerHTML;&lt;br /&gt;
var ProHermano = document.getElementById(&amp;quot;arribaHermano&amp;quot;).nextSibling.innerHTML;&lt;br /&gt;
&lt;br /&gt;
var nuevoItem = document.createElement(&amp;quot;LI&amp;quot;);       // Crear un nodo &amp;lt;li&amp;gt;&lt;br /&gt;
var nodoTexto = document.createTextNode(&amp;quot;Nuevo Elemnto&amp;quot;);  // crea un texto de nodo&lt;br /&gt;
nuevoItem.appendChild(nodoTexto);                    // Adjunta el texto a la &amp;lt;li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var list = document.getElementById(&amp;quot;myList&amp;quot;);    // Obtiene el &amp;lt;ul&amp;gt; elemento para insertar un nuevo nodo&lt;br /&gt;
list.insertBefore(nuevoItem, list.childNodes[0]);&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;demo&amp;quot;).innerHTML =&amp;quot;primer Hijo: &amp;quot;+ pri+&amp;quot; Último Hijo: &amp;quot;+ ulti +&amp;quot; Nodo Padre: &amp;quot;+ x +&amp;quot; Hermano Previo: &amp;quot;+ Upbrother + &amp;quot; Próximo Hermano: &amp;quot;+ProHermano;&lt;br /&gt;
        &lt;br /&gt;
       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''!CUIDADO'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;myList&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Coffee&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li id=&amp;quot;arribaHermano&amp;quot;&amp;gt;Tea&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Mejillones&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var primerHijoEspacio=document.getElementById(&amp;quot;myList&amp;quot;).firstChild; //selecciona primer espacio&lt;br /&gt;
var PrimerElementoCoffe=primerHijoEspacio.nextSibling;  // selecciona el siguiente nodo que corresponde con el elemento.&lt;br /&gt;
var siguienteNodoEspacio=PrimerElementoCoffe.nextSibling; //selecciona el siguiente nodo que es un espacio.&lt;br /&gt;
var SegundoElementoTea=siguienteNodoEspacio.nextElementSibling;  //selecciona el siguiente elemento.&lt;br /&gt;
var TercerElementoMejillones=SegundoElementoTea.nextElementSibling;  //selecciona el siguiente elemento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var TodoHijosEspacioElementos=document.getElementById(&amp;quot;myList&amp;quot;).childNodes; //incluye texto/comentarios y elementos&lt;br /&gt;
var ElementosHijos=document.getElementById(&amp;quot;myList&amp;quot;).children;  //sólo elementos&lt;br /&gt;
&lt;br /&gt;
//let primerElementoHijo=document.getElementById(&amp;quot;myList&amp;quot;).firstElementChild();  //selecciona el primer Nodo que corresponde con un Elemento&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mètodes d'accés als nodes de l'arbre ==&lt;br /&gt;
És important recordar que l'accés als nodes, la seva modificació i la seva eliminació solament és possible quan l'arbre DOM ha estat construït completament, és a dir, després que la pàgina XHTML es carregui per complet.&lt;br /&gt;
A continuació es mostren les diferents formes per aconseguir un node de l'arbre de manera directa, sense haver de recórrer-ho:&lt;br /&gt;
*''getElementsByTagName(nomEtiqueta)'' : obté tots els elements de la pàgina XHTML l'etiqueta de la qual sigui igual que el paràmetre que se li passa a la funció.&lt;br /&gt;
El següent exemple mostra com obtenir tots els paràgrafs d'una pàgina XHTML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	var parrafos = document.getElementsByTagName(&amp;quot;p&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El valor que retorna la funció és un array amb tots els nodes que compleixen la condició que la seva etiqueta coincideix amb el paràmetre proporcionat. El valor retornat és un array de nodes DOM, no un array de cadenes de text o un array d'objectes normals. Per tant, s'ha de processar cada valor del array de la forma que es mostra:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
for(var i=0; i&amp;lt;parrafos.length; i++) {&lt;br /&gt;
  //Obtenim tots els enllaços del cada paràgraf  &lt;br /&gt;
  var enlaces = parrafos[i].getElementsByTagName(&amp;quot;a&amp;quot;);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*''getElementsByName(&amp;quot;nomElement&amp;quot;)'':En aquest cas es busquen els elements l'atribut dels quals name sigui igual al paràmetre proporcionat. &lt;br /&gt;
En el següent exemple, s'obté directament l'únic paràgraf amb el nom indicat:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var parrafoEspecial = document.getElementsByName(&amp;quot;especial&amp;quot;);&lt;br /&gt;
&amp;lt;p name=&amp;quot;prueba&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p name=&amp;quot;especial&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Normalment l'atribut name és únic per als elements HTML que ho defineixen, per la qual cosa és un mètode molt pràctic per accedir directament al node desitjat. En el cas dels elements HTML '''radiobutton''', l'atribut '''name''' és comú a tots els radiobutton que estan relacionats, per la qual cosa la funció retorna una col·lecció d'elements.&lt;br /&gt;
&lt;br /&gt;
*''getElementById(idelement)'': Retorna l'element XHTML l'atribut del qual coincideix amb el paràmetre indicat en la funció. Com l'atribut ha de ser únic per a cada element d'una mateixa pàgina, la funció retorna únicament el node desitjat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var cabecera = document.getElementById(&amp;quot;cabecera&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div id=&amp;quot;cabecera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/&amp;quot; id=&amp;quot;logo&amp;quot;&amp;gt;...&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*''getElementsByClassName(&amp;quot;nomclass&amp;quot;)'': retorna una col·lecció de tots els elements en el document amb el nom de classe especificat, com un objecte nodelist. L'objecte nodelist representa una col·lecció de nodes. Els nodes poden ser accedits per nombres d'índex. L'índex comença en 0.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;exemple&amp;quot;&amp;gt;Primer Element amb class=&amp;quot;exemple&amp;quot;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;exemple&amp;quot;&amp;gt;Segon Element amb class=&amp;quot;exemple&amp;quot;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var x = document.getElementsByClassName(&amp;quot;exemple&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*''document.querySelector()'' :Retorna el primer element que compleixi amb el criteri donat. Pot ser invocada sobre el document o sobre algun element. En cas d'usar-se sobre un element, les cerca es limita als fills d'aquest element.&lt;br /&gt;
Si la cerca no troba res, retorna null.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
document.querySelector()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 class=&amp;quot;example&amp;quot;&amp;gt;A heading with class=&amp;quot;example&amp;quot;&amp;lt;/h2&amp;gt;  &amp;lt;!--retorna la primera aparació--&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;example&amp;quot;&amp;gt;A paragraph with class=&amp;quot;example&amp;quot;.&amp;lt;/p&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
document.querySelector(&amp;quot;.example&amp;quot;).style.backgroundColor = &amp;quot;red&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*''document.querySelectorAll()'' Retorna tots els elements que compleixin amb el criteri donat. A l'igual que querySelector pot ser invocada sobre el document o sobre algun element. Sempre retorna 1 nodelist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*Selecciona tots els elements i retorna un NodeList, després per cada iteració afeig un 'border'*/&lt;br /&gt;
var tags = document.querySelectorAll('h1,h2,h3,h4,h5,h6,div,p');&lt;br /&gt;
for (var i = tags.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
  tags[i].style.outline = &amp;quot;1px solid green&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Accedir als atributs d'un node ===&lt;br /&gt;
Els atributs XHTML dels elements de la pàgina es transformen automàticament en propietats dels nodes. Per accedir al seu valor, simplement s'indica el nom de l'atribut XHTML darrere del nom del node.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var enlace = document.getElementById(&amp;quot;enlace&amp;quot;);&lt;br /&gt;
alert(enlace.href); // muestra http://www...com&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace&amp;quot; href=&amp;quot;http://www...com&amp;quot;&amp;gt;Enlace&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per obtenir el valor de qualsevol propietat CSS del node, s'ha d'utilitzar l'atribut style. El següent exemple obté el valor de la propietat margin de la imatge:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var imagen = document.getElementById(&amp;quot;imagen&amp;quot;);&lt;br /&gt;
alert(imagen.style.margin);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;img id=&amp;quot;imagen&amp;quot; style=&amp;quot;margin:0; border:0;&amp;quot; src=&amp;quot;logo.png&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Creació i eliminació nodes de l'arbre ==&lt;br /&gt;
=== Creació de nodes XHTML simples ===&lt;br /&gt;
crear i afegir a la pàgina un nou element XHTML senzill consta de quatre passos diferents:&lt;br /&gt;
&lt;br /&gt;
*Creació d'un node de tipus Element que representi a l'element.&lt;br /&gt;
*Creació d'un node de tipus Text que representi el contingut de l'element.&lt;br /&gt;
*Afegir el node Text com a node fill del node Element.&lt;br /&gt;
*Afegir el node Element a la pàgina, en forma de node fill del node corresponent al lloc en el qual es vol inserir l'element.&lt;br /&gt;
D'aquesta manera, si es vol afegir un paràgraf simple al final d'una pàgina XHTML, és necessari incloure el següent codi Javascript:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Crear nodo de tipo Element&lt;br /&gt;
var parrafo = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
// Crear nodo de tipo Text&lt;br /&gt;
var contenido = document.createTextNode(&amp;quot;Hola Mundo!&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
// Añadir el nodo Text como hijo del nodo Element&lt;br /&gt;
parrafo.appendChild(contenido);&lt;br /&gt;
 &lt;br /&gt;
// Añadir el nodo Element como hijo de la pagina&lt;br /&gt;
document.body.appendChild(parrafo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcions utilitzades per a la creació del node:&lt;br /&gt;
*''createElement(etiqueta)'': Crea un node de tipus '''element''' que representa l'element XHTML.&lt;br /&gt;
*''createTextNode(contingut)'': crea un node de tipus '''text''' que emmagatzema el contingut textual (innerHTML).&lt;br /&gt;
*''nodepare.appendChild(nodefill)'': afegeix el '''nodefill''' com a fill de '''nodepare'''.&lt;br /&gt;
&lt;br /&gt;
=== Eliminació de nodes XHTML ===&lt;br /&gt;
Per eliminar un node és molt senzill, només s'ha d'utilitzar la funció ''removeChild(nodeAeliminar)''.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var parrafo = document.getElementById(&amp;quot;provisional&amp;quot;);&lt;br /&gt;
parrafo.parentNode.removeChild(parrafo);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p id=&amp;quot;provisional&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per eliminar un node d'una pàgina XHTML s'invoca a la funció removeChild() des del valor parentNode del node que es vol eliminar. Quan s'elimina un node, també s'eliminen automàticament tots els nodes fills que tingui, per la qual cosa no és necessari esborrar manualment cada node fill.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Esdeveniments dinàmics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var btn = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
    var contenido = document.createTextNode(&amp;quot;Hola Mundo!&amp;quot;);&lt;br /&gt;
    btn.appendChild(contenido);&lt;br /&gt;
    btn.addEventListener('click', function(){alert(&amp;quot;hola mundo&amp;quot;);}, false);&lt;br /&gt;
    document.body.appendChild(btn);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opció 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var i = 1;&lt;br /&gt;
document.getElementById('creator').addEventListener('click',function(){&lt;br /&gt;
  var div = document.createElement('div');&lt;br /&gt;
  var text = document.createTextNode('New Div ' + i);&lt;br /&gt;
  div.appendChild(text);&lt;br /&gt;
  document.body.appendChild(div);&lt;br /&gt;
  i++;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener('click',function(e){&lt;br /&gt;
    // Fixed&lt;br /&gt;
    if(e.target.tagName.toLowerCase() === 'div'){&lt;br /&gt;
        console.log(e.target);&lt;br /&gt;
    }&lt;br /&gt;
 })&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  Div actual&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;button id='creator'&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2022/2023 ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Crea un document HTML amb diferents enllaços i paràgrafs i digues:&lt;br /&gt;
*Nombre d'enllaços de la pàgina&lt;br /&gt;
*Direcció a la qual enllaça el penúltim enllaç&lt;br /&gt;
*Nombre d'enllaços del tercer paràgraf&lt;br /&gt;
:[[solucio_enllaços]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici mostrar/ocultar nodes DOM ===&lt;br /&gt;
Afegeix a l'exercici anterior un combo box (&amp;lt;select&amp;gt;) amb els valors 1, 2 i 3 de text amb l'etiqueta &amp;quot;paràgraf&amp;quot; i dos botons amb el text &amp;quot;mostrar&amp;quot; i &amp;quot;ocultar&amp;quot;.&lt;br /&gt;
*Quan es faci click al botó mostrar, es mostrarà (estil &amp;quot;display:block;&amp;quot;) el paràgraf indicat pel valor seleccionat al combo box.&lt;br /&gt;
*Quan es faci click al botó ocultar, s'ocultarà (estil &amp;quot;display:none;&amp;quot;) el paràgraf indicat pel valor seleccionat al combo box.&lt;br /&gt;
&lt;br /&gt;
=== Exercici Carta Restaurant ===&lt;br /&gt;
La carta d'un restaurant té 5 primers plats, 5 segons plats i 5 postres/cafè. Cada plat tindrà un preu associat.&lt;br /&gt;
Fes una pàgina que permeti prendre una comanda al cambrer. Primer es mostraran els primers plats seleccionats, a continuació els segons plats seleccionats, a continuació els postres/cafè seleccionats i finalment el preu total de la comanda.&lt;br /&gt;
*Inicialment la comanda estarà en blanc i el preu serà de 0,00 €.&lt;br /&gt;
*Al peu de pàgina hi haurà tres botons amb els texts &amp;quot;afegir primer&amp;quot;, &amp;quot;afegir segon&amp;quot; i &amp;quot;afegir postre/cafè&amp;quot; respectivament.&lt;br /&gt;
*Quan es premi el botó &amp;quot;afegir primer&amp;quot; s'afegirà un combo box (&amp;lt;select&amp;gt;) amb els possibles primers plats a la secció de primers plats de la pàgina.&lt;br /&gt;
*Els botons &amp;quot;afegir segon&amp;quot; i &amp;quot;afegir postre/cafè&amp;quot; tindran un comportament equivalent pels segons i postres/cafès respectivament.&lt;br /&gt;
*Sempre que es canvii el valor seleccionat a un dels combos es recalcularà el preu total de la comanda.&lt;br /&gt;
&lt;br /&gt;
=== Exercici Carta Restaurant - continuació===&lt;br /&gt;
Afegeix al peu de pàgina tres botons amb els texts &amp;quot;Borrar primer&amp;quot;, &amp;quot;Borrar segon&amp;quot; i &amp;quot;Borrar postre/cafè&amp;quot;.&lt;br /&gt;
*El botó &amp;quot;Borrar primer&amp;quot; eliminarà l'ultim dels combos de primers plats.&lt;br /&gt;
*Els botons &amp;quot;Borrar segon&amp;quot; i &amp;quot;Borrar postre/cafè&amp;quot; tindran un comportament equivalent pels segons plats i pels postres/cafès respectivament.&lt;br /&gt;
&lt;br /&gt;
== Exercicis cursos passats ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Crea un document HTML amb diferents enllaços i paràgrafs i digues:&lt;br /&gt;
*Nombre d'enllaços de la pàgina&lt;br /&gt;
*Direcció a la qual enllaça el penúltim enllaç&lt;br /&gt;
*Nombre d'enllaços del tercer paràgraf&lt;br /&gt;
:[[solucio_enllaços]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici llista ===&lt;br /&gt;
Utilitzar les funcions DOM per crear nous nodes i afegir-los a una llista ordenada existent.&lt;br /&gt;
:[[solucio_llista_dom]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Mostra Direcció ===&lt;br /&gt;
Crea aquesta llista d'enllaços, en passar el ratolí per la llista, mostra la direcció a la qual apunten a l'editor de text (dins un input)&lt;br /&gt;
:[[solucio_mostra_direccio]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Canvi Fons ===&lt;br /&gt;
Crea una pàgina amb tres botons que ens permetin seleccionar la imatge de fons del document.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_boto_fons]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici llista afegir Altre ===&lt;br /&gt;
Realitzar un script que quan premem en l'opció d'uns dels radiobutton (Html, Css, Altre) en el cas de ser l'opció  'Altre' es mostri l'editor de text (input)&lt;br /&gt;
:[[solucio_afegir_altre]]&lt;br /&gt;
&lt;br /&gt;
=== Ejercicio Añadir Diversos Elementos ===&lt;br /&gt;
Se dispondrá de 5 botones:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Crear Párrafo&amp;quot;, &amp;quot;Crear Imagen&amp;quot;, &amp;quot;Borrar último&amp;quot;, &amp;quot;Borrar Primero&amp;quot;, &amp;quot;sustituir primer párrafo por vacio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Para poder Crear un párrafo deberá existir un textArea donde introduciremos un texto que irá añadiéndose cada vez que cliquemos y de color rojo.&lt;br /&gt;
&lt;br /&gt;
El botón crear Imagen nos pedirá un prompt de una url o dirección de una imagen y después su atributo &amp;quot;alt&amp;quot; para darle una descripción.&lt;br /&gt;
&lt;br /&gt;
Borrar último, borrará el último elemento creado.&lt;br /&gt;
&lt;br /&gt;
Borrar primero, borrará el primer elemento creado&lt;br /&gt;
&lt;br /&gt;
El último botón se tratará de sustituir el primer párrafo por otro que tenga como texto &amp;quot;vacio&amp;quot;. (replaceChild)&lt;br /&gt;
&lt;br /&gt;
:[[solucio_Anadir_diversos_elementos]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Web Dinámica ===&lt;br /&gt;
a) Crea un HTML amb els següents camps:&lt;br /&gt;
Input text1 : Que demani la etiqueta que es vol crear&lt;br /&gt;
Input text2 : Que demani On es vol crear (una altre etiqueta que ja hauria d'existir)&lt;br /&gt;
Boto crear: Crea el node del input text1 com a fill de input text2.&lt;br /&gt;
:[[solucio_crea_html]]&lt;br /&gt;
&lt;br /&gt;
b)Creació automática:&lt;br /&gt;
Crea automàticament una Web via DOM que contingui:&lt;br /&gt;
Tants paràgrafs com text trobis a la web http://www.lipsum.com/&lt;br /&gt;
Cada paràgraf ha de tenir un botó per tal de poder-lo eliminar.&lt;br /&gt;
:[[solucio_web_dom]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Botons Celestials ===&lt;br /&gt;
Crea una pàgina web amb dos botons amb el text:&lt;br /&gt;
*Text boto 1: 'Angelet'&lt;br /&gt;
*Text boto 2: 'Diablet'&lt;br /&gt;
El comportament ha de ser el següent:&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Angelet' es creen ''n'' botons més, on ''n'' és un número aleatori entre 1 i 10 i aquests botons poden ser 'Angelets o Diablets'.&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Diablet' s'eliminen ''n'' botons, on ''n'' és un número aleatori entre 1 i 20.&lt;br /&gt;
:[[solucio_botons_celestials]]&lt;br /&gt;
&lt;br /&gt;
== Bibliografia ==&lt;br /&gt;
&lt;br /&gt;
https://www.w3schools.com/jsref/dom_obj_document.asp&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Model_d%27objectes_del_document&amp;diff=17185</id>
		<title>NF2 - Model d'objectes del document</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Model_d%27objectes_del_document&amp;diff=17185"/>
				<updated>2023-03-07T18:09:59Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis curs 2022/2023 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Document Object Model =&lt;br /&gt;
És un conjunt d'objectes (API) Javascript que permeten interactuar amb el document HTML. Podem realitzar les següents operacions:&lt;br /&gt;
*Canviar i llegir el contingut i la estructura&lt;br /&gt;
*Canviar i llegir estils CSS&lt;br /&gt;
*Gestionar events&lt;br /&gt;
&lt;br /&gt;
Existeixen diversos nivells (versions) de DOM :&lt;br /&gt;
*Nivell 0: Introduït per Netscape i Microsoft a principis dels 90 durant la guerra dels navegadors. Per aixó, no existeix un DOM estàndard.&lt;br /&gt;
*Nivell 1: A partir d'aquí es va fer càrrec del DOM el W3C. Va introduir contingut dinàmic.&lt;br /&gt;
*Nivell 2: &amp;quot;Serialització&amp;quot; de XML (ex: permet guardar documents), events de teclat,...&lt;br /&gt;
&lt;br /&gt;
Els navegadors per poder utilitzar les utilitats de DOM, necessiten transformar la pàgina original. Una pàgina HTML normal no és més que una successió de caràcters, per la qual cosa és un format molt difícil de manipular. Per això, els navegadors web transformen automàticament totes les pàgines web en una estructura més eficient de manipular.&lt;br /&gt;
&lt;br /&gt;
== Arbre DOM ==&lt;br /&gt;
DOM transforma tots els documents XHTML en un conjunt d'elements anomenats nodes, que estan interconnectats i que representen els continguts de les pàgines web i les relacions entre ells. Pel seu aspecte, la unió de tots els nodes es diu &amp;quot;arbre de nodes&amp;quot;.&lt;br /&gt;
[[Fitxer:dom1.png|center]]&lt;br /&gt;
&lt;br /&gt;
L'arrel de l'arbre de nodes de qualsevol pàgina XHTML sempre és la mateixa: un node de tipus especial denominat ''Document''.&lt;br /&gt;
&lt;br /&gt;
A partir d'aquest node arrel, cada etiqueta XHTML es transforma en un node de tipus ''Element''. La conversió d'etiquetes en nodes es realitza de forma jeràrquica. D'aquesta forma, del node arrel solament poden derivar els nodes HEAD i BODY. A partir d'aquesta derivació inicial, cada etiqueta XHTML es transforma en un node que deriva del node corresponent a la seva '''etiqueta pare'''.&lt;br /&gt;
&lt;br /&gt;
La transformació de les etiquetes XHTML habituals genera dos nodes: el primer és el node de tipus ''Element'' (corresponent a la pròpia etiqueta XHTML) i el segon és un node de tipus ''Text'' que conté el text tancat per aquesta etiqueta XHTML.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=iso-8859-1&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Página sencilla&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Esta página es &amp;lt;strong&amp;gt;muy sencilla&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fitxer:dom2.gif|center]]&lt;br /&gt;
L'especificació completa de DOM defineix 12 tipus de nodes:&lt;br /&gt;
[[Fitxer:dom3.png|center]]&lt;br /&gt;
Encara que les pàgines XHTML habituals es poden manipular manejant solament quatre o cinc tipus de nodes:&lt;br /&gt;
*''Document'', node arrel del que deriven tots els altres nodes de l'arbre.&lt;br /&gt;
*''Element'', representa cadascuna de les etiquetes XHTML. Es tracta de l'únic node que pot contenir atributs i l'únic del que poden derivar altres nodes.&lt;br /&gt;
*''Attr'', es defineix un node d'aquest tipus per representar cadascun dels atributs de les etiquetes XHTML, és a dir, un per cada parell atribut=valor.&lt;br /&gt;
*''Text'', node que conté el text tancat per una etiqueta XHTML.&lt;br /&gt;
*''Comment'', representa els comentaris inclosos a la pàgina XHTML.&lt;br /&gt;
&lt;br /&gt;
Cada node té diverses propietats que reflecteixen el grau parentiu amb els altres. Alguna d'aquestes propietats son les següents:&lt;br /&gt;
*childNodes: array amb els nodes fills.&lt;br /&gt;
*firstChild: primer node fills&lt;br /&gt;
*lastchild: últim node fill&lt;br /&gt;
*parentNode: node pare&lt;br /&gt;
*nextSibling: següent germà (node al mateix nivell i amb el mateix pare)&lt;br /&gt;
*lastSibling: germà anterior.&lt;br /&gt;
Exemple:&lt;br /&gt;
[[Fitxer:dom4.png|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul id=&amp;quot;myList&amp;quot;&amp;gt;&amp;lt;li&amp;gt;Coffee&amp;lt;/li&amp;gt;&amp;lt;li id=&amp;quot;arribaHermano&amp;quot;&amp;gt;Tea&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Mejillones&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var pri = document.getElementById(&amp;quot;myList&amp;quot;).firstChild.innerHTML;&lt;br /&gt;
var ulti = document.getElementById(&amp;quot;myList&amp;quot;).lastChild.innerHTML;&lt;br /&gt;
var x = document.getElementById(&amp;quot;myList&amp;quot;).parentNode.nodeName;&lt;br /&gt;
var Upbrother = document.getElementById(&amp;quot;arribaHermano&amp;quot;).previousSibling.innerHTML;&lt;br /&gt;
var ProHermano = document.getElementById(&amp;quot;arribaHermano&amp;quot;).nextSibling.innerHTML;&lt;br /&gt;
&lt;br /&gt;
var nuevoItem = document.createElement(&amp;quot;LI&amp;quot;);       // Crear un nodo &amp;lt;li&amp;gt;&lt;br /&gt;
var nodoTexto = document.createTextNode(&amp;quot;Nuevo Elemnto&amp;quot;);  // crea un texto de nodo&lt;br /&gt;
nuevoItem.appendChild(nodoTexto);                    // Adjunta el texto a la &amp;lt;li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var list = document.getElementById(&amp;quot;myList&amp;quot;);    // Obtiene el &amp;lt;ul&amp;gt; elemento para insertar un nuevo nodo&lt;br /&gt;
list.insertBefore(nuevoItem, list.childNodes[0]);&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;demo&amp;quot;).innerHTML =&amp;quot;primer Hijo: &amp;quot;+ pri+&amp;quot; Último Hijo: &amp;quot;+ ulti +&amp;quot; Nodo Padre: &amp;quot;+ x +&amp;quot; Hermano Previo: &amp;quot;+ Upbrother + &amp;quot; Próximo Hermano: &amp;quot;+ProHermano;&lt;br /&gt;
        &lt;br /&gt;
       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''!CUIDADO'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;myList&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Coffee&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li id=&amp;quot;arribaHermano&amp;quot;&amp;gt;Tea&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Mejillones&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var primerHijoEspacio=document.getElementById(&amp;quot;myList&amp;quot;).firstChild; //selecciona primer espacio&lt;br /&gt;
var PrimerElementoCoffe=primerHijoEspacio.nextSibling;  // selecciona el siguiente nodo que corresponde con el elemento.&lt;br /&gt;
var siguienteNodoEspacio=PrimerElementoCoffe.nextSibling; //selecciona el siguiente nodo que es un espacio.&lt;br /&gt;
var SegundoElementoTea=siguienteNodoEspacio.nextElementSibling;  //selecciona el siguiente elemento.&lt;br /&gt;
var TercerElementoMejillones=SegundoElementoTea.nextElementSibling;  //selecciona el siguiente elemento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var TodoHijosEspacioElementos=document.getElementById(&amp;quot;myList&amp;quot;).childNodes; //incluye texto/comentarios y elementos&lt;br /&gt;
var ElementosHijos=document.getElementById(&amp;quot;myList&amp;quot;).children;  //sólo elementos&lt;br /&gt;
&lt;br /&gt;
//let primerElementoHijo=document.getElementById(&amp;quot;myList&amp;quot;).firstElementChild();  //selecciona el primer Nodo que corresponde con un Elemento&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mètodes d'accés als nodes de l'arbre ==&lt;br /&gt;
És important recordar que l'accés als nodes, la seva modificació i la seva eliminació solament és possible quan l'arbre DOM ha estat construït completament, és a dir, després que la pàgina XHTML es carregui per complet.&lt;br /&gt;
A continuació es mostren les diferents formes per aconseguir un node de l'arbre de manera directa, sense haver de recórrer-ho:&lt;br /&gt;
*''getElementsByTagName(nomEtiqueta)'' : obté tots els elements de la pàgina XHTML l'etiqueta de la qual sigui igual que el paràmetre que se li passa a la funció.&lt;br /&gt;
El següent exemple mostra com obtenir tots els paràgrafs d'una pàgina XHTML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	var parrafos = document.getElementsByTagName(&amp;quot;p&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El valor que retorna la funció és un array amb tots els nodes que compleixen la condició que la seva etiqueta coincideix amb el paràmetre proporcionat. El valor retornat és un array de nodes DOM, no un array de cadenes de text o un array d'objectes normals. Per tant, s'ha de processar cada valor del array de la forma que es mostra:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
for(var i=0; i&amp;lt;parrafos.length; i++) {&lt;br /&gt;
  //Obtenim tots els enllaços del cada paràgraf  &lt;br /&gt;
  var enlaces = parrafos[i].getElementsByTagName(&amp;quot;a&amp;quot;);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*''getElementsByName(&amp;quot;nomElement&amp;quot;)'':En aquest cas es busquen els elements l'atribut dels quals name sigui igual al paràmetre proporcionat. &lt;br /&gt;
En el següent exemple, s'obté directament l'únic paràgraf amb el nom indicat:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var parrafoEspecial = document.getElementsByName(&amp;quot;especial&amp;quot;);&lt;br /&gt;
&amp;lt;p name=&amp;quot;prueba&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p name=&amp;quot;especial&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Normalment l'atribut name és únic per als elements HTML que ho defineixen, per la qual cosa és un mètode molt pràctic per accedir directament al node desitjat. En el cas dels elements HTML '''radiobutton''', l'atribut '''name''' és comú a tots els radiobutton que estan relacionats, per la qual cosa la funció retorna una col·lecció d'elements.&lt;br /&gt;
&lt;br /&gt;
*''getElementById(idelement)'': Retorna l'element XHTML l'atribut del qual coincideix amb el paràmetre indicat en la funció. Com l'atribut ha de ser únic per a cada element d'una mateixa pàgina, la funció retorna únicament el node desitjat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var cabecera = document.getElementById(&amp;quot;cabecera&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div id=&amp;quot;cabecera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/&amp;quot; id=&amp;quot;logo&amp;quot;&amp;gt;...&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*''getElementsByClassName(&amp;quot;nomclass&amp;quot;)'': retorna una col·lecció de tots els elements en el document amb el nom de classe especificat, com un objecte nodelist. L'objecte nodelist representa una col·lecció de nodes. Els nodes poden ser accedits per nombres d'índex. L'índex comença en 0.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;exemple&amp;quot;&amp;gt;Primer Element amb class=&amp;quot;exemple&amp;quot;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;exemple&amp;quot;&amp;gt;Segon Element amb class=&amp;quot;exemple&amp;quot;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var x = document.getElementsByClassName(&amp;quot;exemple&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*''document.querySelector()'' :Retorna el primer element que compleixi amb el criteri donat. Pot ser invocada sobre el document o sobre algun element. En cas d'usar-se sobre un element, les cerca es limita als fills d'aquest element.&lt;br /&gt;
Si la cerca no troba res, retorna null.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
document.querySelector()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 class=&amp;quot;example&amp;quot;&amp;gt;A heading with class=&amp;quot;example&amp;quot;&amp;lt;/h2&amp;gt;  &amp;lt;!--retorna la primera aparació--&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;example&amp;quot;&amp;gt;A paragraph with class=&amp;quot;example&amp;quot;.&amp;lt;/p&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
document.querySelector(&amp;quot;.example&amp;quot;).style.backgroundColor = &amp;quot;red&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*''document.querySelectorAll()'' Retorna tots els elements que compleixin amb el criteri donat. A l'igual que querySelector pot ser invocada sobre el document o sobre algun element. Sempre retorna 1 nodelist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*Selecciona tots els elements i retorna un NodeList, després per cada iteració afeig un 'border'*/&lt;br /&gt;
var tags = document.querySelectorAll('h1,h2,h3,h4,h5,h6,div,p');&lt;br /&gt;
for (var i = tags.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
  tags[i].style.outline = &amp;quot;1px solid green&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Accedir als atributs d'un node ===&lt;br /&gt;
Els atributs XHTML dels elements de la pàgina es transformen automàticament en propietats dels nodes. Per accedir al seu valor, simplement s'indica el nom de l'atribut XHTML darrere del nom del node.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var enlace = document.getElementById(&amp;quot;enlace&amp;quot;);&lt;br /&gt;
alert(enlace.href); // muestra http://www...com&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace&amp;quot; href=&amp;quot;http://www...com&amp;quot;&amp;gt;Enlace&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per obtenir el valor de qualsevol propietat CSS del node, s'ha d'utilitzar l'atribut style. El següent exemple obté el valor de la propietat margin de la imatge:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var imagen = document.getElementById(&amp;quot;imagen&amp;quot;);&lt;br /&gt;
alert(imagen.style.margin);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;img id=&amp;quot;imagen&amp;quot; style=&amp;quot;margin:0; border:0;&amp;quot; src=&amp;quot;logo.png&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Creació i eliminació nodes de l'arbre ==&lt;br /&gt;
=== Creació de nodes XHTML simples ===&lt;br /&gt;
crear i afegir a la pàgina un nou element XHTML senzill consta de quatre passos diferents:&lt;br /&gt;
&lt;br /&gt;
*Creació d'un node de tipus Element que representi a l'element.&lt;br /&gt;
*Creació d'un node de tipus Text que representi el contingut de l'element.&lt;br /&gt;
*Afegir el node Text com a node fill del node Element.&lt;br /&gt;
*Afegir el node Element a la pàgina, en forma de node fill del node corresponent al lloc en el qual es vol inserir l'element.&lt;br /&gt;
D'aquesta manera, si es vol afegir un paràgraf simple al final d'una pàgina XHTML, és necessari incloure el següent codi Javascript:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Crear nodo de tipo Element&lt;br /&gt;
var parrafo = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
// Crear nodo de tipo Text&lt;br /&gt;
var contenido = document.createTextNode(&amp;quot;Hola Mundo!&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
// Añadir el nodo Text como hijo del nodo Element&lt;br /&gt;
parrafo.appendChild(contenido);&lt;br /&gt;
 &lt;br /&gt;
// Añadir el nodo Element como hijo de la pagina&lt;br /&gt;
document.body.appendChild(parrafo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcions utilitzades per a la creació del node:&lt;br /&gt;
*''createElement(etiqueta)'': Crea un node de tipus '''element''' que representa l'element XHTML.&lt;br /&gt;
*''createTextNode(contingut)'': crea un node de tipus '''text''' que emmagatzema el contingut textual (innerHTML).&lt;br /&gt;
*''nodepare.appendChild(nodefill)'': afegeix el '''nodefill''' com a fill de '''nodepare'''.&lt;br /&gt;
&lt;br /&gt;
=== Eliminació de nodes XHTML ===&lt;br /&gt;
Per eliminar un node és molt senzill, només s'ha d'utilitzar la funció ''removeChild(nodeAeliminar)''.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var parrafo = document.getElementById(&amp;quot;provisional&amp;quot;);&lt;br /&gt;
parrafo.parentNode.removeChild(parrafo);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p id=&amp;quot;provisional&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per eliminar un node d'una pàgina XHTML s'invoca a la funció removeChild() des del valor parentNode del node que es vol eliminar. Quan s'elimina un node, també s'eliminen automàticament tots els nodes fills que tingui, per la qual cosa no és necessari esborrar manualment cada node fill.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Esdeveniments dinàmics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var btn = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
    var contenido = document.createTextNode(&amp;quot;Hola Mundo!&amp;quot;);&lt;br /&gt;
    btn.appendChild(contenido);&lt;br /&gt;
    btn.addEventListener('click', function(){alert(&amp;quot;hola mundo&amp;quot;);}, false);&lt;br /&gt;
    document.body.appendChild(btn);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opció 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var i = 1;&lt;br /&gt;
document.getElementById('creator').addEventListener('click',function(){&lt;br /&gt;
  var div = document.createElement('div');&lt;br /&gt;
  var text = document.createTextNode('New Div ' + i);&lt;br /&gt;
  div.appendChild(text);&lt;br /&gt;
  document.body.appendChild(div);&lt;br /&gt;
  i++;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener('click',function(e){&lt;br /&gt;
    // Fixed&lt;br /&gt;
    if(e.target.tagName.toLowerCase() === 'div'){&lt;br /&gt;
        console.log(e.target);&lt;br /&gt;
    }&lt;br /&gt;
 })&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  Div actual&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;button id='creator'&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2022/2023 ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Crea un document HTML amb diferents enllaços i paràgrafs i digues:&lt;br /&gt;
*Nombre d'enllaços de la pàgina&lt;br /&gt;
*Direcció a la qual enllaça el penúltim enllaç&lt;br /&gt;
*Nombre d'enllaços del tercer paràgraf&lt;br /&gt;
:[[solucio_enllaços]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici mostrar/ocultar nodes DOM ===&lt;br /&gt;
Afegeix a l'exercici anterior un combo box (&amp;lt;select&amp;gt;) amb els valors 1, 2 i 3 de text amb l'etiqueta &amp;quot;paràgraf&amp;quot; i dos botons amb el text &amp;quot;mostrar&amp;quot; i &amp;quot;ocultar&amp;quot;.&lt;br /&gt;
*Quan es faci click al botó mostrar, es mostrarà (estil &amp;quot;display:block;&amp;quot;) el paràgraf indicat pel valor seleccionat al combo box.&lt;br /&gt;
*Quan es faci click al botó ocultar, s'ocultarà (estil &amp;quot;display:none;&amp;quot;) el paràgraf indicat pel valor seleccionat al combo box.&lt;br /&gt;
&lt;br /&gt;
=== Exercici Carta Restaurant ===&lt;br /&gt;
La carta d'un restaurant té 5 primers plats, 5 segons plats i 5 postres/cafè. Cada plat tindrà un preu associat.&lt;br /&gt;
Fes una pàgina que permeti prendre una comanda al cambrer. Primer es mostraran els primers plats seleccionats, a continuació els segons plats seleccionats, a continuació els postres/cafè seleccionats i finalment el preu total de la comanda.&lt;br /&gt;
*Inicialment la comanda estarà en blanc i el preu serà de 0,00 €.&lt;br /&gt;
*Al peu de pàgina hi haurà tres botons amb els texts &amp;quot;afegir primer&amp;quot;, &amp;quot;afegir segon&amp;quot; i &amp;quot;afegir postre/cafè&amp;quot; respectivament.&lt;br /&gt;
*Quan es premi el botó &amp;quot;afegir primer&amp;quot; s'afegirà un combo box (&amp;lt;select&amp;gt;) amb els possibles primers plats a la secció de primers plats de la pàgina.&lt;br /&gt;
*Els botons &amp;quot;afegir segon&amp;quot; i &amp;quot;afegir postre/cafè&amp;quot; tindran un comportament equivalent pels segons i postres/cafès respectivament.&lt;br /&gt;
*Sempre que es canvii el valor seleccionat a un dels combos es recalcularà el preu total de la comanda.&lt;br /&gt;
&lt;br /&gt;
=== Exercici Carta Restaurant - continuació===&lt;br /&gt;
bla&lt;br /&gt;
&lt;br /&gt;
== Exercicis cursos passats ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Crea un document HTML amb diferents enllaços i paràgrafs i digues:&lt;br /&gt;
*Nombre d'enllaços de la pàgina&lt;br /&gt;
*Direcció a la qual enllaça el penúltim enllaç&lt;br /&gt;
*Nombre d'enllaços del tercer paràgraf&lt;br /&gt;
:[[solucio_enllaços]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici llista ===&lt;br /&gt;
Utilitzar les funcions DOM per crear nous nodes i afegir-los a una llista ordenada existent.&lt;br /&gt;
:[[solucio_llista_dom]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Mostra Direcció ===&lt;br /&gt;
Crea aquesta llista d'enllaços, en passar el ratolí per la llista, mostra la direcció a la qual apunten a l'editor de text (dins un input)&lt;br /&gt;
:[[solucio_mostra_direccio]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Canvi Fons ===&lt;br /&gt;
Crea una pàgina amb tres botons que ens permetin seleccionar la imatge de fons del document.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_boto_fons]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici llista afegir Altre ===&lt;br /&gt;
Realitzar un script que quan premem en l'opció d'uns dels radiobutton (Html, Css, Altre) en el cas de ser l'opció  'Altre' es mostri l'editor de text (input)&lt;br /&gt;
:[[solucio_afegir_altre]]&lt;br /&gt;
&lt;br /&gt;
=== Ejercicio Añadir Diversos Elementos ===&lt;br /&gt;
Se dispondrá de 5 botones:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Crear Párrafo&amp;quot;, &amp;quot;Crear Imagen&amp;quot;, &amp;quot;Borrar último&amp;quot;, &amp;quot;Borrar Primero&amp;quot;, &amp;quot;sustituir primer párrafo por vacio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Para poder Crear un párrafo deberá existir un textArea donde introduciremos un texto que irá añadiéndose cada vez que cliquemos y de color rojo.&lt;br /&gt;
&lt;br /&gt;
El botón crear Imagen nos pedirá un prompt de una url o dirección de una imagen y después su atributo &amp;quot;alt&amp;quot; para darle una descripción.&lt;br /&gt;
&lt;br /&gt;
Borrar último, borrará el último elemento creado.&lt;br /&gt;
&lt;br /&gt;
Borrar primero, borrará el primer elemento creado&lt;br /&gt;
&lt;br /&gt;
El último botón se tratará de sustituir el primer párrafo por otro que tenga como texto &amp;quot;vacio&amp;quot;. (replaceChild)&lt;br /&gt;
&lt;br /&gt;
:[[solucio_Anadir_diversos_elementos]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Web Dinámica ===&lt;br /&gt;
a) Crea un HTML amb els següents camps:&lt;br /&gt;
Input text1 : Que demani la etiqueta que es vol crear&lt;br /&gt;
Input text2 : Que demani On es vol crear (una altre etiqueta que ja hauria d'existir)&lt;br /&gt;
Boto crear: Crea el node del input text1 com a fill de input text2.&lt;br /&gt;
:[[solucio_crea_html]]&lt;br /&gt;
&lt;br /&gt;
b)Creació automática:&lt;br /&gt;
Crea automàticament una Web via DOM que contingui:&lt;br /&gt;
Tants paràgrafs com text trobis a la web http://www.lipsum.com/&lt;br /&gt;
Cada paràgraf ha de tenir un botó per tal de poder-lo eliminar.&lt;br /&gt;
:[[solucio_web_dom]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Botons Celestials ===&lt;br /&gt;
Crea una pàgina web amb dos botons amb el text:&lt;br /&gt;
*Text boto 1: 'Angelet'&lt;br /&gt;
*Text boto 2: 'Diablet'&lt;br /&gt;
El comportament ha de ser el següent:&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Angelet' es creen ''n'' botons més, on ''n'' és un número aleatori entre 1 i 10 i aquests botons poden ser 'Angelets o Diablets'.&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Diablet' s'eliminen ''n'' botons, on ''n'' és un número aleatori entre 1 i 20.&lt;br /&gt;
:[[solucio_botons_celestials]]&lt;br /&gt;
&lt;br /&gt;
== Bibliografia ==&lt;br /&gt;
&lt;br /&gt;
https://www.w3schools.com/jsref/dom_obj_document.asp&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Model_d%27objectes_del_document&amp;diff=17184</id>
		<title>NF2 - Model d'objectes del document</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Model_d%27objectes_del_document&amp;diff=17184"/>
				<updated>2023-03-07T18:08:12Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici Carta Restaurant */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Document Object Model =&lt;br /&gt;
És un conjunt d'objectes (API) Javascript que permeten interactuar amb el document HTML. Podem realitzar les següents operacions:&lt;br /&gt;
*Canviar i llegir el contingut i la estructura&lt;br /&gt;
*Canviar i llegir estils CSS&lt;br /&gt;
*Gestionar events&lt;br /&gt;
&lt;br /&gt;
Existeixen diversos nivells (versions) de DOM :&lt;br /&gt;
*Nivell 0: Introduït per Netscape i Microsoft a principis dels 90 durant la guerra dels navegadors. Per aixó, no existeix un DOM estàndard.&lt;br /&gt;
*Nivell 1: A partir d'aquí es va fer càrrec del DOM el W3C. Va introduir contingut dinàmic.&lt;br /&gt;
*Nivell 2: &amp;quot;Serialització&amp;quot; de XML (ex: permet guardar documents), events de teclat,...&lt;br /&gt;
&lt;br /&gt;
Els navegadors per poder utilitzar les utilitats de DOM, necessiten transformar la pàgina original. Una pàgina HTML normal no és més que una successió de caràcters, per la qual cosa és un format molt difícil de manipular. Per això, els navegadors web transformen automàticament totes les pàgines web en una estructura més eficient de manipular.&lt;br /&gt;
&lt;br /&gt;
== Arbre DOM ==&lt;br /&gt;
DOM transforma tots els documents XHTML en un conjunt d'elements anomenats nodes, que estan interconnectats i que representen els continguts de les pàgines web i les relacions entre ells. Pel seu aspecte, la unió de tots els nodes es diu &amp;quot;arbre de nodes&amp;quot;.&lt;br /&gt;
[[Fitxer:dom1.png|center]]&lt;br /&gt;
&lt;br /&gt;
L'arrel de l'arbre de nodes de qualsevol pàgina XHTML sempre és la mateixa: un node de tipus especial denominat ''Document''.&lt;br /&gt;
&lt;br /&gt;
A partir d'aquest node arrel, cada etiqueta XHTML es transforma en un node de tipus ''Element''. La conversió d'etiquetes en nodes es realitza de forma jeràrquica. D'aquesta forma, del node arrel solament poden derivar els nodes HEAD i BODY. A partir d'aquesta derivació inicial, cada etiqueta XHTML es transforma en un node que deriva del node corresponent a la seva '''etiqueta pare'''.&lt;br /&gt;
&lt;br /&gt;
La transformació de les etiquetes XHTML habituals genera dos nodes: el primer és el node de tipus ''Element'' (corresponent a la pròpia etiqueta XHTML) i el segon és un node de tipus ''Text'' que conté el text tancat per aquesta etiqueta XHTML.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=iso-8859-1&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Página sencilla&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Esta página es &amp;lt;strong&amp;gt;muy sencilla&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fitxer:dom2.gif|center]]&lt;br /&gt;
L'especificació completa de DOM defineix 12 tipus de nodes:&lt;br /&gt;
[[Fitxer:dom3.png|center]]&lt;br /&gt;
Encara que les pàgines XHTML habituals es poden manipular manejant solament quatre o cinc tipus de nodes:&lt;br /&gt;
*''Document'', node arrel del que deriven tots els altres nodes de l'arbre.&lt;br /&gt;
*''Element'', representa cadascuna de les etiquetes XHTML. Es tracta de l'únic node que pot contenir atributs i l'únic del que poden derivar altres nodes.&lt;br /&gt;
*''Attr'', es defineix un node d'aquest tipus per representar cadascun dels atributs de les etiquetes XHTML, és a dir, un per cada parell atribut=valor.&lt;br /&gt;
*''Text'', node que conté el text tancat per una etiqueta XHTML.&lt;br /&gt;
*''Comment'', representa els comentaris inclosos a la pàgina XHTML.&lt;br /&gt;
&lt;br /&gt;
Cada node té diverses propietats que reflecteixen el grau parentiu amb els altres. Alguna d'aquestes propietats son les següents:&lt;br /&gt;
*childNodes: array amb els nodes fills.&lt;br /&gt;
*firstChild: primer node fills&lt;br /&gt;
*lastchild: últim node fill&lt;br /&gt;
*parentNode: node pare&lt;br /&gt;
*nextSibling: següent germà (node al mateix nivell i amb el mateix pare)&lt;br /&gt;
*lastSibling: germà anterior.&lt;br /&gt;
Exemple:&lt;br /&gt;
[[Fitxer:dom4.png|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul id=&amp;quot;myList&amp;quot;&amp;gt;&amp;lt;li&amp;gt;Coffee&amp;lt;/li&amp;gt;&amp;lt;li id=&amp;quot;arribaHermano&amp;quot;&amp;gt;Tea&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Mejillones&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var pri = document.getElementById(&amp;quot;myList&amp;quot;).firstChild.innerHTML;&lt;br /&gt;
var ulti = document.getElementById(&amp;quot;myList&amp;quot;).lastChild.innerHTML;&lt;br /&gt;
var x = document.getElementById(&amp;quot;myList&amp;quot;).parentNode.nodeName;&lt;br /&gt;
var Upbrother = document.getElementById(&amp;quot;arribaHermano&amp;quot;).previousSibling.innerHTML;&lt;br /&gt;
var ProHermano = document.getElementById(&amp;quot;arribaHermano&amp;quot;).nextSibling.innerHTML;&lt;br /&gt;
&lt;br /&gt;
var nuevoItem = document.createElement(&amp;quot;LI&amp;quot;);       // Crear un nodo &amp;lt;li&amp;gt;&lt;br /&gt;
var nodoTexto = document.createTextNode(&amp;quot;Nuevo Elemnto&amp;quot;);  // crea un texto de nodo&lt;br /&gt;
nuevoItem.appendChild(nodoTexto);                    // Adjunta el texto a la &amp;lt;li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var list = document.getElementById(&amp;quot;myList&amp;quot;);    // Obtiene el &amp;lt;ul&amp;gt; elemento para insertar un nuevo nodo&lt;br /&gt;
list.insertBefore(nuevoItem, list.childNodes[0]);&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;demo&amp;quot;).innerHTML =&amp;quot;primer Hijo: &amp;quot;+ pri+&amp;quot; Último Hijo: &amp;quot;+ ulti +&amp;quot; Nodo Padre: &amp;quot;+ x +&amp;quot; Hermano Previo: &amp;quot;+ Upbrother + &amp;quot; Próximo Hermano: &amp;quot;+ProHermano;&lt;br /&gt;
        &lt;br /&gt;
       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''!CUIDADO'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;myList&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Coffee&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li id=&amp;quot;arribaHermano&amp;quot;&amp;gt;Tea&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Mejillones&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var primerHijoEspacio=document.getElementById(&amp;quot;myList&amp;quot;).firstChild; //selecciona primer espacio&lt;br /&gt;
var PrimerElementoCoffe=primerHijoEspacio.nextSibling;  // selecciona el siguiente nodo que corresponde con el elemento.&lt;br /&gt;
var siguienteNodoEspacio=PrimerElementoCoffe.nextSibling; //selecciona el siguiente nodo que es un espacio.&lt;br /&gt;
var SegundoElementoTea=siguienteNodoEspacio.nextElementSibling;  //selecciona el siguiente elemento.&lt;br /&gt;
var TercerElementoMejillones=SegundoElementoTea.nextElementSibling;  //selecciona el siguiente elemento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var TodoHijosEspacioElementos=document.getElementById(&amp;quot;myList&amp;quot;).childNodes; //incluye texto/comentarios y elementos&lt;br /&gt;
var ElementosHijos=document.getElementById(&amp;quot;myList&amp;quot;).children;  //sólo elementos&lt;br /&gt;
&lt;br /&gt;
//let primerElementoHijo=document.getElementById(&amp;quot;myList&amp;quot;).firstElementChild();  //selecciona el primer Nodo que corresponde con un Elemento&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mètodes d'accés als nodes de l'arbre ==&lt;br /&gt;
És important recordar que l'accés als nodes, la seva modificació i la seva eliminació solament és possible quan l'arbre DOM ha estat construït completament, és a dir, després que la pàgina XHTML es carregui per complet.&lt;br /&gt;
A continuació es mostren les diferents formes per aconseguir un node de l'arbre de manera directa, sense haver de recórrer-ho:&lt;br /&gt;
*''getElementsByTagName(nomEtiqueta)'' : obté tots els elements de la pàgina XHTML l'etiqueta de la qual sigui igual que el paràmetre que se li passa a la funció.&lt;br /&gt;
El següent exemple mostra com obtenir tots els paràgrafs d'una pàgina XHTML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	var parrafos = document.getElementsByTagName(&amp;quot;p&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El valor que retorna la funció és un array amb tots els nodes que compleixen la condició que la seva etiqueta coincideix amb el paràmetre proporcionat. El valor retornat és un array de nodes DOM, no un array de cadenes de text o un array d'objectes normals. Per tant, s'ha de processar cada valor del array de la forma que es mostra:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
for(var i=0; i&amp;lt;parrafos.length; i++) {&lt;br /&gt;
  //Obtenim tots els enllaços del cada paràgraf  &lt;br /&gt;
  var enlaces = parrafos[i].getElementsByTagName(&amp;quot;a&amp;quot;);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*''getElementsByName(&amp;quot;nomElement&amp;quot;)'':En aquest cas es busquen els elements l'atribut dels quals name sigui igual al paràmetre proporcionat. &lt;br /&gt;
En el següent exemple, s'obté directament l'únic paràgraf amb el nom indicat:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var parrafoEspecial = document.getElementsByName(&amp;quot;especial&amp;quot;);&lt;br /&gt;
&amp;lt;p name=&amp;quot;prueba&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p name=&amp;quot;especial&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Normalment l'atribut name és únic per als elements HTML que ho defineixen, per la qual cosa és un mètode molt pràctic per accedir directament al node desitjat. En el cas dels elements HTML '''radiobutton''', l'atribut '''name''' és comú a tots els radiobutton que estan relacionats, per la qual cosa la funció retorna una col·lecció d'elements.&lt;br /&gt;
&lt;br /&gt;
*''getElementById(idelement)'': Retorna l'element XHTML l'atribut del qual coincideix amb el paràmetre indicat en la funció. Com l'atribut ha de ser únic per a cada element d'una mateixa pàgina, la funció retorna únicament el node desitjat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var cabecera = document.getElementById(&amp;quot;cabecera&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div id=&amp;quot;cabecera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/&amp;quot; id=&amp;quot;logo&amp;quot;&amp;gt;...&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*''getElementsByClassName(&amp;quot;nomclass&amp;quot;)'': retorna una col·lecció de tots els elements en el document amb el nom de classe especificat, com un objecte nodelist. L'objecte nodelist representa una col·lecció de nodes. Els nodes poden ser accedits per nombres d'índex. L'índex comença en 0.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;exemple&amp;quot;&amp;gt;Primer Element amb class=&amp;quot;exemple&amp;quot;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;exemple&amp;quot;&amp;gt;Segon Element amb class=&amp;quot;exemple&amp;quot;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var x = document.getElementsByClassName(&amp;quot;exemple&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*''document.querySelector()'' :Retorna el primer element que compleixi amb el criteri donat. Pot ser invocada sobre el document o sobre algun element. En cas d'usar-se sobre un element, les cerca es limita als fills d'aquest element.&lt;br /&gt;
Si la cerca no troba res, retorna null.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
document.querySelector()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 class=&amp;quot;example&amp;quot;&amp;gt;A heading with class=&amp;quot;example&amp;quot;&amp;lt;/h2&amp;gt;  &amp;lt;!--retorna la primera aparació--&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;example&amp;quot;&amp;gt;A paragraph with class=&amp;quot;example&amp;quot;.&amp;lt;/p&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
document.querySelector(&amp;quot;.example&amp;quot;).style.backgroundColor = &amp;quot;red&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*''document.querySelectorAll()'' Retorna tots els elements que compleixin amb el criteri donat. A l'igual que querySelector pot ser invocada sobre el document o sobre algun element. Sempre retorna 1 nodelist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*Selecciona tots els elements i retorna un NodeList, després per cada iteració afeig un 'border'*/&lt;br /&gt;
var tags = document.querySelectorAll('h1,h2,h3,h4,h5,h6,div,p');&lt;br /&gt;
for (var i = tags.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
  tags[i].style.outline = &amp;quot;1px solid green&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Accedir als atributs d'un node ===&lt;br /&gt;
Els atributs XHTML dels elements de la pàgina es transformen automàticament en propietats dels nodes. Per accedir al seu valor, simplement s'indica el nom de l'atribut XHTML darrere del nom del node.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var enlace = document.getElementById(&amp;quot;enlace&amp;quot;);&lt;br /&gt;
alert(enlace.href); // muestra http://www...com&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace&amp;quot; href=&amp;quot;http://www...com&amp;quot;&amp;gt;Enlace&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per obtenir el valor de qualsevol propietat CSS del node, s'ha d'utilitzar l'atribut style. El següent exemple obté el valor de la propietat margin de la imatge:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var imagen = document.getElementById(&amp;quot;imagen&amp;quot;);&lt;br /&gt;
alert(imagen.style.margin);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;img id=&amp;quot;imagen&amp;quot; style=&amp;quot;margin:0; border:0;&amp;quot; src=&amp;quot;logo.png&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Creació i eliminació nodes de l'arbre ==&lt;br /&gt;
=== Creació de nodes XHTML simples ===&lt;br /&gt;
crear i afegir a la pàgina un nou element XHTML senzill consta de quatre passos diferents:&lt;br /&gt;
&lt;br /&gt;
*Creació d'un node de tipus Element que representi a l'element.&lt;br /&gt;
*Creació d'un node de tipus Text que representi el contingut de l'element.&lt;br /&gt;
*Afegir el node Text com a node fill del node Element.&lt;br /&gt;
*Afegir el node Element a la pàgina, en forma de node fill del node corresponent al lloc en el qual es vol inserir l'element.&lt;br /&gt;
D'aquesta manera, si es vol afegir un paràgraf simple al final d'una pàgina XHTML, és necessari incloure el següent codi Javascript:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Crear nodo de tipo Element&lt;br /&gt;
var parrafo = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
// Crear nodo de tipo Text&lt;br /&gt;
var contenido = document.createTextNode(&amp;quot;Hola Mundo!&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
// Añadir el nodo Text como hijo del nodo Element&lt;br /&gt;
parrafo.appendChild(contenido);&lt;br /&gt;
 &lt;br /&gt;
// Añadir el nodo Element como hijo de la pagina&lt;br /&gt;
document.body.appendChild(parrafo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcions utilitzades per a la creació del node:&lt;br /&gt;
*''createElement(etiqueta)'': Crea un node de tipus '''element''' que representa l'element XHTML.&lt;br /&gt;
*''createTextNode(contingut)'': crea un node de tipus '''text''' que emmagatzema el contingut textual (innerHTML).&lt;br /&gt;
*''nodepare.appendChild(nodefill)'': afegeix el '''nodefill''' com a fill de '''nodepare'''.&lt;br /&gt;
&lt;br /&gt;
=== Eliminació de nodes XHTML ===&lt;br /&gt;
Per eliminar un node és molt senzill, només s'ha d'utilitzar la funció ''removeChild(nodeAeliminar)''.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var parrafo = document.getElementById(&amp;quot;provisional&amp;quot;);&lt;br /&gt;
parrafo.parentNode.removeChild(parrafo);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p id=&amp;quot;provisional&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per eliminar un node d'una pàgina XHTML s'invoca a la funció removeChild() des del valor parentNode del node que es vol eliminar. Quan s'elimina un node, també s'eliminen automàticament tots els nodes fills que tingui, per la qual cosa no és necessari esborrar manualment cada node fill.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Esdeveniments dinàmics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var btn = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
    var contenido = document.createTextNode(&amp;quot;Hola Mundo!&amp;quot;);&lt;br /&gt;
    btn.appendChild(contenido);&lt;br /&gt;
    btn.addEventListener('click', function(){alert(&amp;quot;hola mundo&amp;quot;);}, false);&lt;br /&gt;
    document.body.appendChild(btn);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opció 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var i = 1;&lt;br /&gt;
document.getElementById('creator').addEventListener('click',function(){&lt;br /&gt;
  var div = document.createElement('div');&lt;br /&gt;
  var text = document.createTextNode('New Div ' + i);&lt;br /&gt;
  div.appendChild(text);&lt;br /&gt;
  document.body.appendChild(div);&lt;br /&gt;
  i++;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener('click',function(e){&lt;br /&gt;
    // Fixed&lt;br /&gt;
    if(e.target.tagName.toLowerCase() === 'div'){&lt;br /&gt;
        console.log(e.target);&lt;br /&gt;
    }&lt;br /&gt;
 })&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  Div actual&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;button id='creator'&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2022/2023 ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Crea un document HTML amb diferents enllaços i paràgrafs i digues:&lt;br /&gt;
*Nombre d'enllaços de la pàgina&lt;br /&gt;
*Direcció a la qual enllaça el penúltim enllaç&lt;br /&gt;
*Nombre d'enllaços del tercer paràgraf&lt;br /&gt;
:[[solucio_enllaços]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici mostrar/ocultar nodes DOM ===&lt;br /&gt;
Afegeix a l'exercici anterior un combo box (&amp;lt;select&amp;gt;) amb els valors 1, 2 i 3 de text amb l'etiqueta &amp;quot;paràgraf&amp;quot; i dos botons amb el text &amp;quot;mostrar&amp;quot; i &amp;quot;ocultar&amp;quot;.&lt;br /&gt;
*Quan es faci click al botó mostrar, es mostrarà (estil &amp;quot;display:block;&amp;quot;) el paràgraf indicat pel valor seleccionat al combo box.&lt;br /&gt;
*Quan es faci click al botó ocultar, s'ocultarà (estil &amp;quot;display:none;&amp;quot;) el paràgraf indicat pel valor seleccionat al combo box.&lt;br /&gt;
&lt;br /&gt;
=== Exercici Carta Restaurant ===&lt;br /&gt;
La carta d'un restaurant té 5 primers plats, 5 segons plats i 5 postres/cafè. Cada plat tindrà un preu associat.&lt;br /&gt;
Fes una pàgina que permeti prendre una comanda al cambrer. Primer es mostraran els primers plats seleccionats, a continuació els segons plats seleccionats, a continuació els postres/cafè seleccionats i finalment el preu total de la comanda.&lt;br /&gt;
*Inicialment la comanda estarà en blanc i el preu serà de 0,00 €.&lt;br /&gt;
*Al peu de pàgina hi haurà tres botons amb els texts &amp;quot;afegir primer&amp;quot;, &amp;quot;afegir segon&amp;quot; i &amp;quot;afegir postre/cafè&amp;quot; respectivament.&lt;br /&gt;
*Quan es premi el botó &amp;quot;afegir primer&amp;quot; s'afegirà un combo box (&amp;lt;select&amp;gt;) amb els possibles primers plats a la secció de primers plats de la pàgina.&lt;br /&gt;
*Els botons &amp;quot;afegir segon&amp;quot; i &amp;quot;afegir postre/cafè&amp;quot; tindran un comportament equivalent pels segons i postres/cafès respectivament.&lt;br /&gt;
*Sempre que es canvii el valor seleccionat a un dels combos es recalcularà el preu total de la comanda.&lt;br /&gt;
&lt;br /&gt;
== Exercicis cursos passats ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Crea un document HTML amb diferents enllaços i paràgrafs i digues:&lt;br /&gt;
*Nombre d'enllaços de la pàgina&lt;br /&gt;
*Direcció a la qual enllaça el penúltim enllaç&lt;br /&gt;
*Nombre d'enllaços del tercer paràgraf&lt;br /&gt;
:[[solucio_enllaços]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici llista ===&lt;br /&gt;
Utilitzar les funcions DOM per crear nous nodes i afegir-los a una llista ordenada existent.&lt;br /&gt;
:[[solucio_llista_dom]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Mostra Direcció ===&lt;br /&gt;
Crea aquesta llista d'enllaços, en passar el ratolí per la llista, mostra la direcció a la qual apunten a l'editor de text (dins un input)&lt;br /&gt;
:[[solucio_mostra_direccio]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Canvi Fons ===&lt;br /&gt;
Crea una pàgina amb tres botons que ens permetin seleccionar la imatge de fons del document.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_boto_fons]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici llista afegir Altre ===&lt;br /&gt;
Realitzar un script que quan premem en l'opció d'uns dels radiobutton (Html, Css, Altre) en el cas de ser l'opció  'Altre' es mostri l'editor de text (input)&lt;br /&gt;
:[[solucio_afegir_altre]]&lt;br /&gt;
&lt;br /&gt;
=== Ejercicio Añadir Diversos Elementos ===&lt;br /&gt;
Se dispondrá de 5 botones:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Crear Párrafo&amp;quot;, &amp;quot;Crear Imagen&amp;quot;, &amp;quot;Borrar último&amp;quot;, &amp;quot;Borrar Primero&amp;quot;, &amp;quot;sustituir primer párrafo por vacio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Para poder Crear un párrafo deberá existir un textArea donde introduciremos un texto que irá añadiéndose cada vez que cliquemos y de color rojo.&lt;br /&gt;
&lt;br /&gt;
El botón crear Imagen nos pedirá un prompt de una url o dirección de una imagen y después su atributo &amp;quot;alt&amp;quot; para darle una descripción.&lt;br /&gt;
&lt;br /&gt;
Borrar último, borrará el último elemento creado.&lt;br /&gt;
&lt;br /&gt;
Borrar primero, borrará el primer elemento creado&lt;br /&gt;
&lt;br /&gt;
El último botón se tratará de sustituir el primer párrafo por otro que tenga como texto &amp;quot;vacio&amp;quot;. (replaceChild)&lt;br /&gt;
&lt;br /&gt;
:[[solucio_Anadir_diversos_elementos]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Web Dinámica ===&lt;br /&gt;
a) Crea un HTML amb els següents camps:&lt;br /&gt;
Input text1 : Que demani la etiqueta que es vol crear&lt;br /&gt;
Input text2 : Que demani On es vol crear (una altre etiqueta que ja hauria d'existir)&lt;br /&gt;
Boto crear: Crea el node del input text1 com a fill de input text2.&lt;br /&gt;
:[[solucio_crea_html]]&lt;br /&gt;
&lt;br /&gt;
b)Creació automática:&lt;br /&gt;
Crea automàticament una Web via DOM que contingui:&lt;br /&gt;
Tants paràgrafs com text trobis a la web http://www.lipsum.com/&lt;br /&gt;
Cada paràgraf ha de tenir un botó per tal de poder-lo eliminar.&lt;br /&gt;
:[[solucio_web_dom]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Botons Celestials ===&lt;br /&gt;
Crea una pàgina web amb dos botons amb el text:&lt;br /&gt;
*Text boto 1: 'Angelet'&lt;br /&gt;
*Text boto 2: 'Diablet'&lt;br /&gt;
El comportament ha de ser el següent:&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Angelet' es creen ''n'' botons més, on ''n'' és un número aleatori entre 1 i 10 i aquests botons poden ser 'Angelets o Diablets'.&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Diablet' s'eliminen ''n'' botons, on ''n'' és un número aleatori entre 1 i 20.&lt;br /&gt;
:[[solucio_botons_celestials]]&lt;br /&gt;
&lt;br /&gt;
== Bibliografia ==&lt;br /&gt;
&lt;br /&gt;
https://www.w3schools.com/jsref/dom_obj_document.asp&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Model_d%27objectes_del_document&amp;diff=17183</id>
		<title>NF2 - Model d'objectes del document</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Model_d%27objectes_del_document&amp;diff=17183"/>
				<updated>2023-03-07T18:06:29Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis curs 2022/2023 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Document Object Model =&lt;br /&gt;
És un conjunt d'objectes (API) Javascript que permeten interactuar amb el document HTML. Podem realitzar les següents operacions:&lt;br /&gt;
*Canviar i llegir el contingut i la estructura&lt;br /&gt;
*Canviar i llegir estils CSS&lt;br /&gt;
*Gestionar events&lt;br /&gt;
&lt;br /&gt;
Existeixen diversos nivells (versions) de DOM :&lt;br /&gt;
*Nivell 0: Introduït per Netscape i Microsoft a principis dels 90 durant la guerra dels navegadors. Per aixó, no existeix un DOM estàndard.&lt;br /&gt;
*Nivell 1: A partir d'aquí es va fer càrrec del DOM el W3C. Va introduir contingut dinàmic.&lt;br /&gt;
*Nivell 2: &amp;quot;Serialització&amp;quot; de XML (ex: permet guardar documents), events de teclat,...&lt;br /&gt;
&lt;br /&gt;
Els navegadors per poder utilitzar les utilitats de DOM, necessiten transformar la pàgina original. Una pàgina HTML normal no és més que una successió de caràcters, per la qual cosa és un format molt difícil de manipular. Per això, els navegadors web transformen automàticament totes les pàgines web en una estructura més eficient de manipular.&lt;br /&gt;
&lt;br /&gt;
== Arbre DOM ==&lt;br /&gt;
DOM transforma tots els documents XHTML en un conjunt d'elements anomenats nodes, que estan interconnectats i que representen els continguts de les pàgines web i les relacions entre ells. Pel seu aspecte, la unió de tots els nodes es diu &amp;quot;arbre de nodes&amp;quot;.&lt;br /&gt;
[[Fitxer:dom1.png|center]]&lt;br /&gt;
&lt;br /&gt;
L'arrel de l'arbre de nodes de qualsevol pàgina XHTML sempre és la mateixa: un node de tipus especial denominat ''Document''.&lt;br /&gt;
&lt;br /&gt;
A partir d'aquest node arrel, cada etiqueta XHTML es transforma en un node de tipus ''Element''. La conversió d'etiquetes en nodes es realitza de forma jeràrquica. D'aquesta forma, del node arrel solament poden derivar els nodes HEAD i BODY. A partir d'aquesta derivació inicial, cada etiqueta XHTML es transforma en un node que deriva del node corresponent a la seva '''etiqueta pare'''.&lt;br /&gt;
&lt;br /&gt;
La transformació de les etiquetes XHTML habituals genera dos nodes: el primer és el node de tipus ''Element'' (corresponent a la pròpia etiqueta XHTML) i el segon és un node de tipus ''Text'' que conté el text tancat per aquesta etiqueta XHTML.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=iso-8859-1&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Página sencilla&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Esta página es &amp;lt;strong&amp;gt;muy sencilla&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fitxer:dom2.gif|center]]&lt;br /&gt;
L'especificació completa de DOM defineix 12 tipus de nodes:&lt;br /&gt;
[[Fitxer:dom3.png|center]]&lt;br /&gt;
Encara que les pàgines XHTML habituals es poden manipular manejant solament quatre o cinc tipus de nodes:&lt;br /&gt;
*''Document'', node arrel del que deriven tots els altres nodes de l'arbre.&lt;br /&gt;
*''Element'', representa cadascuna de les etiquetes XHTML. Es tracta de l'únic node que pot contenir atributs i l'únic del que poden derivar altres nodes.&lt;br /&gt;
*''Attr'', es defineix un node d'aquest tipus per representar cadascun dels atributs de les etiquetes XHTML, és a dir, un per cada parell atribut=valor.&lt;br /&gt;
*''Text'', node que conté el text tancat per una etiqueta XHTML.&lt;br /&gt;
*''Comment'', representa els comentaris inclosos a la pàgina XHTML.&lt;br /&gt;
&lt;br /&gt;
Cada node té diverses propietats que reflecteixen el grau parentiu amb els altres. Alguna d'aquestes propietats son les següents:&lt;br /&gt;
*childNodes: array amb els nodes fills.&lt;br /&gt;
*firstChild: primer node fills&lt;br /&gt;
*lastchild: últim node fill&lt;br /&gt;
*parentNode: node pare&lt;br /&gt;
*nextSibling: següent germà (node al mateix nivell i amb el mateix pare)&lt;br /&gt;
*lastSibling: germà anterior.&lt;br /&gt;
Exemple:&lt;br /&gt;
[[Fitxer:dom4.png|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul id=&amp;quot;myList&amp;quot;&amp;gt;&amp;lt;li&amp;gt;Coffee&amp;lt;/li&amp;gt;&amp;lt;li id=&amp;quot;arribaHermano&amp;quot;&amp;gt;Tea&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Mejillones&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var pri = document.getElementById(&amp;quot;myList&amp;quot;).firstChild.innerHTML;&lt;br /&gt;
var ulti = document.getElementById(&amp;quot;myList&amp;quot;).lastChild.innerHTML;&lt;br /&gt;
var x = document.getElementById(&amp;quot;myList&amp;quot;).parentNode.nodeName;&lt;br /&gt;
var Upbrother = document.getElementById(&amp;quot;arribaHermano&amp;quot;).previousSibling.innerHTML;&lt;br /&gt;
var ProHermano = document.getElementById(&amp;quot;arribaHermano&amp;quot;).nextSibling.innerHTML;&lt;br /&gt;
&lt;br /&gt;
var nuevoItem = document.createElement(&amp;quot;LI&amp;quot;);       // Crear un nodo &amp;lt;li&amp;gt;&lt;br /&gt;
var nodoTexto = document.createTextNode(&amp;quot;Nuevo Elemnto&amp;quot;);  // crea un texto de nodo&lt;br /&gt;
nuevoItem.appendChild(nodoTexto);                    // Adjunta el texto a la &amp;lt;li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var list = document.getElementById(&amp;quot;myList&amp;quot;);    // Obtiene el &amp;lt;ul&amp;gt; elemento para insertar un nuevo nodo&lt;br /&gt;
list.insertBefore(nuevoItem, list.childNodes[0]);&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;demo&amp;quot;).innerHTML =&amp;quot;primer Hijo: &amp;quot;+ pri+&amp;quot; Último Hijo: &amp;quot;+ ulti +&amp;quot; Nodo Padre: &amp;quot;+ x +&amp;quot; Hermano Previo: &amp;quot;+ Upbrother + &amp;quot; Próximo Hermano: &amp;quot;+ProHermano;&lt;br /&gt;
        &lt;br /&gt;
       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''!CUIDADO'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;myList&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Coffee&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li id=&amp;quot;arribaHermano&amp;quot;&amp;gt;Tea&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Mejillones&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var primerHijoEspacio=document.getElementById(&amp;quot;myList&amp;quot;).firstChild; //selecciona primer espacio&lt;br /&gt;
var PrimerElementoCoffe=primerHijoEspacio.nextSibling;  // selecciona el siguiente nodo que corresponde con el elemento.&lt;br /&gt;
var siguienteNodoEspacio=PrimerElementoCoffe.nextSibling; //selecciona el siguiente nodo que es un espacio.&lt;br /&gt;
var SegundoElementoTea=siguienteNodoEspacio.nextElementSibling;  //selecciona el siguiente elemento.&lt;br /&gt;
var TercerElementoMejillones=SegundoElementoTea.nextElementSibling;  //selecciona el siguiente elemento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var TodoHijosEspacioElementos=document.getElementById(&amp;quot;myList&amp;quot;).childNodes; //incluye texto/comentarios y elementos&lt;br /&gt;
var ElementosHijos=document.getElementById(&amp;quot;myList&amp;quot;).children;  //sólo elementos&lt;br /&gt;
&lt;br /&gt;
//let primerElementoHijo=document.getElementById(&amp;quot;myList&amp;quot;).firstElementChild();  //selecciona el primer Nodo que corresponde con un Elemento&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mètodes d'accés als nodes de l'arbre ==&lt;br /&gt;
És important recordar que l'accés als nodes, la seva modificació i la seva eliminació solament és possible quan l'arbre DOM ha estat construït completament, és a dir, després que la pàgina XHTML es carregui per complet.&lt;br /&gt;
A continuació es mostren les diferents formes per aconseguir un node de l'arbre de manera directa, sense haver de recórrer-ho:&lt;br /&gt;
*''getElementsByTagName(nomEtiqueta)'' : obté tots els elements de la pàgina XHTML l'etiqueta de la qual sigui igual que el paràmetre que se li passa a la funció.&lt;br /&gt;
El següent exemple mostra com obtenir tots els paràgrafs d'una pàgina XHTML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	var parrafos = document.getElementsByTagName(&amp;quot;p&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El valor que retorna la funció és un array amb tots els nodes que compleixen la condició que la seva etiqueta coincideix amb el paràmetre proporcionat. El valor retornat és un array de nodes DOM, no un array de cadenes de text o un array d'objectes normals. Per tant, s'ha de processar cada valor del array de la forma que es mostra:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
for(var i=0; i&amp;lt;parrafos.length; i++) {&lt;br /&gt;
  //Obtenim tots els enllaços del cada paràgraf  &lt;br /&gt;
  var enlaces = parrafos[i].getElementsByTagName(&amp;quot;a&amp;quot;);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*''getElementsByName(&amp;quot;nomElement&amp;quot;)'':En aquest cas es busquen els elements l'atribut dels quals name sigui igual al paràmetre proporcionat. &lt;br /&gt;
En el següent exemple, s'obté directament l'únic paràgraf amb el nom indicat:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var parrafoEspecial = document.getElementsByName(&amp;quot;especial&amp;quot;);&lt;br /&gt;
&amp;lt;p name=&amp;quot;prueba&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p name=&amp;quot;especial&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Normalment l'atribut name és únic per als elements HTML que ho defineixen, per la qual cosa és un mètode molt pràctic per accedir directament al node desitjat. En el cas dels elements HTML '''radiobutton''', l'atribut '''name''' és comú a tots els radiobutton que estan relacionats, per la qual cosa la funció retorna una col·lecció d'elements.&lt;br /&gt;
&lt;br /&gt;
*''getElementById(idelement)'': Retorna l'element XHTML l'atribut del qual coincideix amb el paràmetre indicat en la funció. Com l'atribut ha de ser únic per a cada element d'una mateixa pàgina, la funció retorna únicament el node desitjat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var cabecera = document.getElementById(&amp;quot;cabecera&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div id=&amp;quot;cabecera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/&amp;quot; id=&amp;quot;logo&amp;quot;&amp;gt;...&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*''getElementsByClassName(&amp;quot;nomclass&amp;quot;)'': retorna una col·lecció de tots els elements en el document amb el nom de classe especificat, com un objecte nodelist. L'objecte nodelist representa una col·lecció de nodes. Els nodes poden ser accedits per nombres d'índex. L'índex comença en 0.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;exemple&amp;quot;&amp;gt;Primer Element amb class=&amp;quot;exemple&amp;quot;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;exemple&amp;quot;&amp;gt;Segon Element amb class=&amp;quot;exemple&amp;quot;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var x = document.getElementsByClassName(&amp;quot;exemple&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*''document.querySelector()'' :Retorna el primer element que compleixi amb el criteri donat. Pot ser invocada sobre el document o sobre algun element. En cas d'usar-se sobre un element, les cerca es limita als fills d'aquest element.&lt;br /&gt;
Si la cerca no troba res, retorna null.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
document.querySelector()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 class=&amp;quot;example&amp;quot;&amp;gt;A heading with class=&amp;quot;example&amp;quot;&amp;lt;/h2&amp;gt;  &amp;lt;!--retorna la primera aparació--&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;example&amp;quot;&amp;gt;A paragraph with class=&amp;quot;example&amp;quot;.&amp;lt;/p&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
document.querySelector(&amp;quot;.example&amp;quot;).style.backgroundColor = &amp;quot;red&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*''document.querySelectorAll()'' Retorna tots els elements que compleixin amb el criteri donat. A l'igual que querySelector pot ser invocada sobre el document o sobre algun element. Sempre retorna 1 nodelist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*Selecciona tots els elements i retorna un NodeList, després per cada iteració afeig un 'border'*/&lt;br /&gt;
var tags = document.querySelectorAll('h1,h2,h3,h4,h5,h6,div,p');&lt;br /&gt;
for (var i = tags.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
  tags[i].style.outline = &amp;quot;1px solid green&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Accedir als atributs d'un node ===&lt;br /&gt;
Els atributs XHTML dels elements de la pàgina es transformen automàticament en propietats dels nodes. Per accedir al seu valor, simplement s'indica el nom de l'atribut XHTML darrere del nom del node.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var enlace = document.getElementById(&amp;quot;enlace&amp;quot;);&lt;br /&gt;
alert(enlace.href); // muestra http://www...com&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace&amp;quot; href=&amp;quot;http://www...com&amp;quot;&amp;gt;Enlace&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per obtenir el valor de qualsevol propietat CSS del node, s'ha d'utilitzar l'atribut style. El següent exemple obté el valor de la propietat margin de la imatge:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var imagen = document.getElementById(&amp;quot;imagen&amp;quot;);&lt;br /&gt;
alert(imagen.style.margin);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;img id=&amp;quot;imagen&amp;quot; style=&amp;quot;margin:0; border:0;&amp;quot; src=&amp;quot;logo.png&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Creació i eliminació nodes de l'arbre ==&lt;br /&gt;
=== Creació de nodes XHTML simples ===&lt;br /&gt;
crear i afegir a la pàgina un nou element XHTML senzill consta de quatre passos diferents:&lt;br /&gt;
&lt;br /&gt;
*Creació d'un node de tipus Element que representi a l'element.&lt;br /&gt;
*Creació d'un node de tipus Text que representi el contingut de l'element.&lt;br /&gt;
*Afegir el node Text com a node fill del node Element.&lt;br /&gt;
*Afegir el node Element a la pàgina, en forma de node fill del node corresponent al lloc en el qual es vol inserir l'element.&lt;br /&gt;
D'aquesta manera, si es vol afegir un paràgraf simple al final d'una pàgina XHTML, és necessari incloure el següent codi Javascript:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Crear nodo de tipo Element&lt;br /&gt;
var parrafo = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
// Crear nodo de tipo Text&lt;br /&gt;
var contenido = document.createTextNode(&amp;quot;Hola Mundo!&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
// Añadir el nodo Text como hijo del nodo Element&lt;br /&gt;
parrafo.appendChild(contenido);&lt;br /&gt;
 &lt;br /&gt;
// Añadir el nodo Element como hijo de la pagina&lt;br /&gt;
document.body.appendChild(parrafo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcions utilitzades per a la creació del node:&lt;br /&gt;
*''createElement(etiqueta)'': Crea un node de tipus '''element''' que representa l'element XHTML.&lt;br /&gt;
*''createTextNode(contingut)'': crea un node de tipus '''text''' que emmagatzema el contingut textual (innerHTML).&lt;br /&gt;
*''nodepare.appendChild(nodefill)'': afegeix el '''nodefill''' com a fill de '''nodepare'''.&lt;br /&gt;
&lt;br /&gt;
=== Eliminació de nodes XHTML ===&lt;br /&gt;
Per eliminar un node és molt senzill, només s'ha d'utilitzar la funció ''removeChild(nodeAeliminar)''.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var parrafo = document.getElementById(&amp;quot;provisional&amp;quot;);&lt;br /&gt;
parrafo.parentNode.removeChild(parrafo);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p id=&amp;quot;provisional&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per eliminar un node d'una pàgina XHTML s'invoca a la funció removeChild() des del valor parentNode del node que es vol eliminar. Quan s'elimina un node, també s'eliminen automàticament tots els nodes fills que tingui, per la qual cosa no és necessari esborrar manualment cada node fill.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Esdeveniments dinàmics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var btn = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
    var contenido = document.createTextNode(&amp;quot;Hola Mundo!&amp;quot;);&lt;br /&gt;
    btn.appendChild(contenido);&lt;br /&gt;
    btn.addEventListener('click', function(){alert(&amp;quot;hola mundo&amp;quot;);}, false);&lt;br /&gt;
    document.body.appendChild(btn);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opció 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var i = 1;&lt;br /&gt;
document.getElementById('creator').addEventListener('click',function(){&lt;br /&gt;
  var div = document.createElement('div');&lt;br /&gt;
  var text = document.createTextNode('New Div ' + i);&lt;br /&gt;
  div.appendChild(text);&lt;br /&gt;
  document.body.appendChild(div);&lt;br /&gt;
  i++;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener('click',function(e){&lt;br /&gt;
    // Fixed&lt;br /&gt;
    if(e.target.tagName.toLowerCase() === 'div'){&lt;br /&gt;
        console.log(e.target);&lt;br /&gt;
    }&lt;br /&gt;
 })&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  Div actual&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;button id='creator'&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2022/2023 ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Crea un document HTML amb diferents enllaços i paràgrafs i digues:&lt;br /&gt;
*Nombre d'enllaços de la pàgina&lt;br /&gt;
*Direcció a la qual enllaça el penúltim enllaç&lt;br /&gt;
*Nombre d'enllaços del tercer paràgraf&lt;br /&gt;
:[[solucio_enllaços]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici mostrar/ocultar nodes DOM ===&lt;br /&gt;
Afegeix a l'exercici anterior un combo box (&amp;lt;select&amp;gt;) amb els valors 1, 2 i 3 de text amb l'etiqueta &amp;quot;paràgraf&amp;quot; i dos botons amb el text &amp;quot;mostrar&amp;quot; i &amp;quot;ocultar&amp;quot;.&lt;br /&gt;
*Quan es faci click al botó mostrar, es mostrarà (estil &amp;quot;display:block;&amp;quot;) el paràgraf indicat pel valor seleccionat al combo box.&lt;br /&gt;
*Quan es faci click al botó ocultar, s'ocultarà (estil &amp;quot;display:none;&amp;quot;) el paràgraf indicat pel valor seleccionat al combo box.&lt;br /&gt;
&lt;br /&gt;
=== Exercici Carta Restaurant ===&lt;br /&gt;
La carta d'un restaurant té 5 primers plats, 5 segons plats i 5 postres/cafè. Cada plat tindrà un preu associat.&lt;br /&gt;
Fes una pàgina que permeti prendre una comanda al cambrer. Primer es mostraran els primers plats seleccionats, a continuació els segons plats seleccionats, a continuació els postres/cafè seleccionats i finalment el preu total de la comanda.&lt;br /&gt;
*Inicialment la comanda estarà en blanc i el preu serà de 0,00 €.&lt;br /&gt;
*Al peu de pàgina hi haurà tres botons amb els texts &amp;quot;afegir primer&amp;quot;, &amp;quot;afegir segon&amp;quot; i &amp;quot;afegir postre/cafè&amp;quot; respectivament.&lt;br /&gt;
*Quan es premi el botó &amp;quot;afegir primer&amp;quot; s'afegirà un combo box (&amp;lt;select&amp;gt;) amb els possibles primers plats a la secció de primers plats de la pàgina.&lt;br /&gt;
*Els botons &amp;quot;afegir segon&amp;quot; i &amp;quot;afegir postre/cafè&amp;quot; tindran un comportament equivalent pels segons i postres/cafès respectivament.&lt;br /&gt;
&lt;br /&gt;
== Exercicis cursos passats ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Crea un document HTML amb diferents enllaços i paràgrafs i digues:&lt;br /&gt;
*Nombre d'enllaços de la pàgina&lt;br /&gt;
*Direcció a la qual enllaça el penúltim enllaç&lt;br /&gt;
*Nombre d'enllaços del tercer paràgraf&lt;br /&gt;
:[[solucio_enllaços]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici llista ===&lt;br /&gt;
Utilitzar les funcions DOM per crear nous nodes i afegir-los a una llista ordenada existent.&lt;br /&gt;
:[[solucio_llista_dom]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Mostra Direcció ===&lt;br /&gt;
Crea aquesta llista d'enllaços, en passar el ratolí per la llista, mostra la direcció a la qual apunten a l'editor de text (dins un input)&lt;br /&gt;
:[[solucio_mostra_direccio]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Canvi Fons ===&lt;br /&gt;
Crea una pàgina amb tres botons que ens permetin seleccionar la imatge de fons del document.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_boto_fons]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici llista afegir Altre ===&lt;br /&gt;
Realitzar un script que quan premem en l'opció d'uns dels radiobutton (Html, Css, Altre) en el cas de ser l'opció  'Altre' es mostri l'editor de text (input)&lt;br /&gt;
:[[solucio_afegir_altre]]&lt;br /&gt;
&lt;br /&gt;
=== Ejercicio Añadir Diversos Elementos ===&lt;br /&gt;
Se dispondrá de 5 botones:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Crear Párrafo&amp;quot;, &amp;quot;Crear Imagen&amp;quot;, &amp;quot;Borrar último&amp;quot;, &amp;quot;Borrar Primero&amp;quot;, &amp;quot;sustituir primer párrafo por vacio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Para poder Crear un párrafo deberá existir un textArea donde introduciremos un texto que irá añadiéndose cada vez que cliquemos y de color rojo.&lt;br /&gt;
&lt;br /&gt;
El botón crear Imagen nos pedirá un prompt de una url o dirección de una imagen y después su atributo &amp;quot;alt&amp;quot; para darle una descripción.&lt;br /&gt;
&lt;br /&gt;
Borrar último, borrará el último elemento creado.&lt;br /&gt;
&lt;br /&gt;
Borrar primero, borrará el primer elemento creado&lt;br /&gt;
&lt;br /&gt;
El último botón se tratará de sustituir el primer párrafo por otro que tenga como texto &amp;quot;vacio&amp;quot;. (replaceChild)&lt;br /&gt;
&lt;br /&gt;
:[[solucio_Anadir_diversos_elementos]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Web Dinámica ===&lt;br /&gt;
a) Crea un HTML amb els següents camps:&lt;br /&gt;
Input text1 : Que demani la etiqueta que es vol crear&lt;br /&gt;
Input text2 : Que demani On es vol crear (una altre etiqueta que ja hauria d'existir)&lt;br /&gt;
Boto crear: Crea el node del input text1 com a fill de input text2.&lt;br /&gt;
:[[solucio_crea_html]]&lt;br /&gt;
&lt;br /&gt;
b)Creació automática:&lt;br /&gt;
Crea automàticament una Web via DOM que contingui:&lt;br /&gt;
Tants paràgrafs com text trobis a la web http://www.lipsum.com/&lt;br /&gt;
Cada paràgraf ha de tenir un botó per tal de poder-lo eliminar.&lt;br /&gt;
:[[solucio_web_dom]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Botons Celestials ===&lt;br /&gt;
Crea una pàgina web amb dos botons amb el text:&lt;br /&gt;
*Text boto 1: 'Angelet'&lt;br /&gt;
*Text boto 2: 'Diablet'&lt;br /&gt;
El comportament ha de ser el següent:&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Angelet' es creen ''n'' botons més, on ''n'' és un número aleatori entre 1 i 10 i aquests botons poden ser 'Angelets o Diablets'.&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Diablet' s'eliminen ''n'' botons, on ''n'' és un número aleatori entre 1 i 20.&lt;br /&gt;
:[[solucio_botons_celestials]]&lt;br /&gt;
&lt;br /&gt;
== Bibliografia ==&lt;br /&gt;
&lt;br /&gt;
https://www.w3schools.com/jsref/dom_obj_document.asp&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Model_d%27objectes_del_document&amp;diff=17182</id>
		<title>NF2 - Model d'objectes del document</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Model_d%27objectes_del_document&amp;diff=17182"/>
				<updated>2023-03-07T17:35:48Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici Enllaços DOM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Document Object Model =&lt;br /&gt;
És un conjunt d'objectes (API) Javascript que permeten interactuar amb el document HTML. Podem realitzar les següents operacions:&lt;br /&gt;
*Canviar i llegir el contingut i la estructura&lt;br /&gt;
*Canviar i llegir estils CSS&lt;br /&gt;
*Gestionar events&lt;br /&gt;
&lt;br /&gt;
Existeixen diversos nivells (versions) de DOM :&lt;br /&gt;
*Nivell 0: Introduït per Netscape i Microsoft a principis dels 90 durant la guerra dels navegadors. Per aixó, no existeix un DOM estàndard.&lt;br /&gt;
*Nivell 1: A partir d'aquí es va fer càrrec del DOM el W3C. Va introduir contingut dinàmic.&lt;br /&gt;
*Nivell 2: &amp;quot;Serialització&amp;quot; de XML (ex: permet guardar documents), events de teclat,...&lt;br /&gt;
&lt;br /&gt;
Els navegadors per poder utilitzar les utilitats de DOM, necessiten transformar la pàgina original. Una pàgina HTML normal no és més que una successió de caràcters, per la qual cosa és un format molt difícil de manipular. Per això, els navegadors web transformen automàticament totes les pàgines web en una estructura més eficient de manipular.&lt;br /&gt;
&lt;br /&gt;
== Arbre DOM ==&lt;br /&gt;
DOM transforma tots els documents XHTML en un conjunt d'elements anomenats nodes, que estan interconnectats i que representen els continguts de les pàgines web i les relacions entre ells. Pel seu aspecte, la unió de tots els nodes es diu &amp;quot;arbre de nodes&amp;quot;.&lt;br /&gt;
[[Fitxer:dom1.png|center]]&lt;br /&gt;
&lt;br /&gt;
L'arrel de l'arbre de nodes de qualsevol pàgina XHTML sempre és la mateixa: un node de tipus especial denominat ''Document''.&lt;br /&gt;
&lt;br /&gt;
A partir d'aquest node arrel, cada etiqueta XHTML es transforma en un node de tipus ''Element''. La conversió d'etiquetes en nodes es realitza de forma jeràrquica. D'aquesta forma, del node arrel solament poden derivar els nodes HEAD i BODY. A partir d'aquesta derivació inicial, cada etiqueta XHTML es transforma en un node que deriva del node corresponent a la seva '''etiqueta pare'''.&lt;br /&gt;
&lt;br /&gt;
La transformació de les etiquetes XHTML habituals genera dos nodes: el primer és el node de tipus ''Element'' (corresponent a la pròpia etiqueta XHTML) i el segon és un node de tipus ''Text'' que conté el text tancat per aquesta etiqueta XHTML.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=iso-8859-1&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Página sencilla&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Esta página es &amp;lt;strong&amp;gt;muy sencilla&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fitxer:dom2.gif|center]]&lt;br /&gt;
L'especificació completa de DOM defineix 12 tipus de nodes:&lt;br /&gt;
[[Fitxer:dom3.png|center]]&lt;br /&gt;
Encara que les pàgines XHTML habituals es poden manipular manejant solament quatre o cinc tipus de nodes:&lt;br /&gt;
*''Document'', node arrel del que deriven tots els altres nodes de l'arbre.&lt;br /&gt;
*''Element'', representa cadascuna de les etiquetes XHTML. Es tracta de l'únic node que pot contenir atributs i l'únic del que poden derivar altres nodes.&lt;br /&gt;
*''Attr'', es defineix un node d'aquest tipus per representar cadascun dels atributs de les etiquetes XHTML, és a dir, un per cada parell atribut=valor.&lt;br /&gt;
*''Text'', node que conté el text tancat per una etiqueta XHTML.&lt;br /&gt;
*''Comment'', representa els comentaris inclosos a la pàgina XHTML.&lt;br /&gt;
&lt;br /&gt;
Cada node té diverses propietats que reflecteixen el grau parentiu amb els altres. Alguna d'aquestes propietats son les següents:&lt;br /&gt;
*childNodes: array amb els nodes fills.&lt;br /&gt;
*firstChild: primer node fills&lt;br /&gt;
*lastchild: últim node fill&lt;br /&gt;
*parentNode: node pare&lt;br /&gt;
*nextSibling: següent germà (node al mateix nivell i amb el mateix pare)&lt;br /&gt;
*lastSibling: germà anterior.&lt;br /&gt;
Exemple:&lt;br /&gt;
[[Fitxer:dom4.png|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul id=&amp;quot;myList&amp;quot;&amp;gt;&amp;lt;li&amp;gt;Coffee&amp;lt;/li&amp;gt;&amp;lt;li id=&amp;quot;arribaHermano&amp;quot;&amp;gt;Tea&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Mejillones&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var pri = document.getElementById(&amp;quot;myList&amp;quot;).firstChild.innerHTML;&lt;br /&gt;
var ulti = document.getElementById(&amp;quot;myList&amp;quot;).lastChild.innerHTML;&lt;br /&gt;
var x = document.getElementById(&amp;quot;myList&amp;quot;).parentNode.nodeName;&lt;br /&gt;
var Upbrother = document.getElementById(&amp;quot;arribaHermano&amp;quot;).previousSibling.innerHTML;&lt;br /&gt;
var ProHermano = document.getElementById(&amp;quot;arribaHermano&amp;quot;).nextSibling.innerHTML;&lt;br /&gt;
&lt;br /&gt;
var nuevoItem = document.createElement(&amp;quot;LI&amp;quot;);       // Crear un nodo &amp;lt;li&amp;gt;&lt;br /&gt;
var nodoTexto = document.createTextNode(&amp;quot;Nuevo Elemnto&amp;quot;);  // crea un texto de nodo&lt;br /&gt;
nuevoItem.appendChild(nodoTexto);                    // Adjunta el texto a la &amp;lt;li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var list = document.getElementById(&amp;quot;myList&amp;quot;);    // Obtiene el &amp;lt;ul&amp;gt; elemento para insertar un nuevo nodo&lt;br /&gt;
list.insertBefore(nuevoItem, list.childNodes[0]);&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;demo&amp;quot;).innerHTML =&amp;quot;primer Hijo: &amp;quot;+ pri+&amp;quot; Último Hijo: &amp;quot;+ ulti +&amp;quot; Nodo Padre: &amp;quot;+ x +&amp;quot; Hermano Previo: &amp;quot;+ Upbrother + &amp;quot; Próximo Hermano: &amp;quot;+ProHermano;&lt;br /&gt;
        &lt;br /&gt;
       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''!CUIDADO'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;myList&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Coffee&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li id=&amp;quot;arribaHermano&amp;quot;&amp;gt;Tea&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Mejillones&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var primerHijoEspacio=document.getElementById(&amp;quot;myList&amp;quot;).firstChild; //selecciona primer espacio&lt;br /&gt;
var PrimerElementoCoffe=primerHijoEspacio.nextSibling;  // selecciona el siguiente nodo que corresponde con el elemento.&lt;br /&gt;
var siguienteNodoEspacio=PrimerElementoCoffe.nextSibling; //selecciona el siguiente nodo que es un espacio.&lt;br /&gt;
var SegundoElementoTea=siguienteNodoEspacio.nextElementSibling;  //selecciona el siguiente elemento.&lt;br /&gt;
var TercerElementoMejillones=SegundoElementoTea.nextElementSibling;  //selecciona el siguiente elemento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var TodoHijosEspacioElementos=document.getElementById(&amp;quot;myList&amp;quot;).childNodes; //incluye texto/comentarios y elementos&lt;br /&gt;
var ElementosHijos=document.getElementById(&amp;quot;myList&amp;quot;).children;  //sólo elementos&lt;br /&gt;
&lt;br /&gt;
//let primerElementoHijo=document.getElementById(&amp;quot;myList&amp;quot;).firstElementChild();  //selecciona el primer Nodo que corresponde con un Elemento&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mètodes d'accés als nodes de l'arbre ==&lt;br /&gt;
És important recordar que l'accés als nodes, la seva modificació i la seva eliminació solament és possible quan l'arbre DOM ha estat construït completament, és a dir, després que la pàgina XHTML es carregui per complet.&lt;br /&gt;
A continuació es mostren les diferents formes per aconseguir un node de l'arbre de manera directa, sense haver de recórrer-ho:&lt;br /&gt;
*''getElementsByTagName(nomEtiqueta)'' : obté tots els elements de la pàgina XHTML l'etiqueta de la qual sigui igual que el paràmetre que se li passa a la funció.&lt;br /&gt;
El següent exemple mostra com obtenir tots els paràgrafs d'una pàgina XHTML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	var parrafos = document.getElementsByTagName(&amp;quot;p&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El valor que retorna la funció és un array amb tots els nodes que compleixen la condició que la seva etiqueta coincideix amb el paràmetre proporcionat. El valor retornat és un array de nodes DOM, no un array de cadenes de text o un array d'objectes normals. Per tant, s'ha de processar cada valor del array de la forma que es mostra:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
for(var i=0; i&amp;lt;parrafos.length; i++) {&lt;br /&gt;
  //Obtenim tots els enllaços del cada paràgraf  &lt;br /&gt;
  var enlaces = parrafos[i].getElementsByTagName(&amp;quot;a&amp;quot;);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*''getElementsByName(&amp;quot;nomElement&amp;quot;)'':En aquest cas es busquen els elements l'atribut dels quals name sigui igual al paràmetre proporcionat. &lt;br /&gt;
En el següent exemple, s'obté directament l'únic paràgraf amb el nom indicat:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var parrafoEspecial = document.getElementsByName(&amp;quot;especial&amp;quot;);&lt;br /&gt;
&amp;lt;p name=&amp;quot;prueba&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p name=&amp;quot;especial&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Normalment l'atribut name és únic per als elements HTML que ho defineixen, per la qual cosa és un mètode molt pràctic per accedir directament al node desitjat. En el cas dels elements HTML '''radiobutton''', l'atribut '''name''' és comú a tots els radiobutton que estan relacionats, per la qual cosa la funció retorna una col·lecció d'elements.&lt;br /&gt;
&lt;br /&gt;
*''getElementById(idelement)'': Retorna l'element XHTML l'atribut del qual coincideix amb el paràmetre indicat en la funció. Com l'atribut ha de ser únic per a cada element d'una mateixa pàgina, la funció retorna únicament el node desitjat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var cabecera = document.getElementById(&amp;quot;cabecera&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div id=&amp;quot;cabecera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/&amp;quot; id=&amp;quot;logo&amp;quot;&amp;gt;...&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*''getElementsByClassName(&amp;quot;nomclass&amp;quot;)'': retorna una col·lecció de tots els elements en el document amb el nom de classe especificat, com un objecte nodelist. L'objecte nodelist representa una col·lecció de nodes. Els nodes poden ser accedits per nombres d'índex. L'índex comença en 0.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;exemple&amp;quot;&amp;gt;Primer Element amb class=&amp;quot;exemple&amp;quot;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;exemple&amp;quot;&amp;gt;Segon Element amb class=&amp;quot;exemple&amp;quot;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var x = document.getElementsByClassName(&amp;quot;exemple&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*''document.querySelector()'' :Retorna el primer element que compleixi amb el criteri donat. Pot ser invocada sobre el document o sobre algun element. En cas d'usar-se sobre un element, les cerca es limita als fills d'aquest element.&lt;br /&gt;
Si la cerca no troba res, retorna null.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
document.querySelector()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 class=&amp;quot;example&amp;quot;&amp;gt;A heading with class=&amp;quot;example&amp;quot;&amp;lt;/h2&amp;gt;  &amp;lt;!--retorna la primera aparació--&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;example&amp;quot;&amp;gt;A paragraph with class=&amp;quot;example&amp;quot;.&amp;lt;/p&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
document.querySelector(&amp;quot;.example&amp;quot;).style.backgroundColor = &amp;quot;red&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*''document.querySelectorAll()'' Retorna tots els elements que compleixin amb el criteri donat. A l'igual que querySelector pot ser invocada sobre el document o sobre algun element. Sempre retorna 1 nodelist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*Selecciona tots els elements i retorna un NodeList, després per cada iteració afeig un 'border'*/&lt;br /&gt;
var tags = document.querySelectorAll('h1,h2,h3,h4,h5,h6,div,p');&lt;br /&gt;
for (var i = tags.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
  tags[i].style.outline = &amp;quot;1px solid green&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Accedir als atributs d'un node ===&lt;br /&gt;
Els atributs XHTML dels elements de la pàgina es transformen automàticament en propietats dels nodes. Per accedir al seu valor, simplement s'indica el nom de l'atribut XHTML darrere del nom del node.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var enlace = document.getElementById(&amp;quot;enlace&amp;quot;);&lt;br /&gt;
alert(enlace.href); // muestra http://www...com&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace&amp;quot; href=&amp;quot;http://www...com&amp;quot;&amp;gt;Enlace&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per obtenir el valor de qualsevol propietat CSS del node, s'ha d'utilitzar l'atribut style. El següent exemple obté el valor de la propietat margin de la imatge:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var imagen = document.getElementById(&amp;quot;imagen&amp;quot;);&lt;br /&gt;
alert(imagen.style.margin);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;img id=&amp;quot;imagen&amp;quot; style=&amp;quot;margin:0; border:0;&amp;quot; src=&amp;quot;logo.png&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Creació i eliminació nodes de l'arbre ==&lt;br /&gt;
=== Creació de nodes XHTML simples ===&lt;br /&gt;
crear i afegir a la pàgina un nou element XHTML senzill consta de quatre passos diferents:&lt;br /&gt;
&lt;br /&gt;
*Creació d'un node de tipus Element que representi a l'element.&lt;br /&gt;
*Creació d'un node de tipus Text que representi el contingut de l'element.&lt;br /&gt;
*Afegir el node Text com a node fill del node Element.&lt;br /&gt;
*Afegir el node Element a la pàgina, en forma de node fill del node corresponent al lloc en el qual es vol inserir l'element.&lt;br /&gt;
D'aquesta manera, si es vol afegir un paràgraf simple al final d'una pàgina XHTML, és necessari incloure el següent codi Javascript:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Crear nodo de tipo Element&lt;br /&gt;
var parrafo = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
// Crear nodo de tipo Text&lt;br /&gt;
var contenido = document.createTextNode(&amp;quot;Hola Mundo!&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
// Añadir el nodo Text como hijo del nodo Element&lt;br /&gt;
parrafo.appendChild(contenido);&lt;br /&gt;
 &lt;br /&gt;
// Añadir el nodo Element como hijo de la pagina&lt;br /&gt;
document.body.appendChild(parrafo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcions utilitzades per a la creació del node:&lt;br /&gt;
*''createElement(etiqueta)'': Crea un node de tipus '''element''' que representa l'element XHTML.&lt;br /&gt;
*''createTextNode(contingut)'': crea un node de tipus '''text''' que emmagatzema el contingut textual (innerHTML).&lt;br /&gt;
*''nodepare.appendChild(nodefill)'': afegeix el '''nodefill''' com a fill de '''nodepare'''.&lt;br /&gt;
&lt;br /&gt;
=== Eliminació de nodes XHTML ===&lt;br /&gt;
Per eliminar un node és molt senzill, només s'ha d'utilitzar la funció ''removeChild(nodeAeliminar)''.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var parrafo = document.getElementById(&amp;quot;provisional&amp;quot;);&lt;br /&gt;
parrafo.parentNode.removeChild(parrafo);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p id=&amp;quot;provisional&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per eliminar un node d'una pàgina XHTML s'invoca a la funció removeChild() des del valor parentNode del node que es vol eliminar. Quan s'elimina un node, també s'eliminen automàticament tots els nodes fills que tingui, per la qual cosa no és necessari esborrar manualment cada node fill.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Esdeveniments dinàmics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var btn = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
    var contenido = document.createTextNode(&amp;quot;Hola Mundo!&amp;quot;);&lt;br /&gt;
    btn.appendChild(contenido);&lt;br /&gt;
    btn.addEventListener('click', function(){alert(&amp;quot;hola mundo&amp;quot;);}, false);&lt;br /&gt;
    document.body.appendChild(btn);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opció 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var i = 1;&lt;br /&gt;
document.getElementById('creator').addEventListener('click',function(){&lt;br /&gt;
  var div = document.createElement('div');&lt;br /&gt;
  var text = document.createTextNode('New Div ' + i);&lt;br /&gt;
  div.appendChild(text);&lt;br /&gt;
  document.body.appendChild(div);&lt;br /&gt;
  i++;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener('click',function(e){&lt;br /&gt;
    // Fixed&lt;br /&gt;
    if(e.target.tagName.toLowerCase() === 'div'){&lt;br /&gt;
        console.log(e.target);&lt;br /&gt;
    }&lt;br /&gt;
 })&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  Div actual&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;button id='creator'&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2022/2023 ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Crea un document HTML amb diferents enllaços i paràgrafs i digues:&lt;br /&gt;
*Nombre d'enllaços de la pàgina&lt;br /&gt;
*Direcció a la qual enllaça el penúltim enllaç&lt;br /&gt;
*Nombre d'enllaços del tercer paràgraf&lt;br /&gt;
:[[solucio_enllaços]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici mostrar/ocultar nodes DOM ===&lt;br /&gt;
Afegeix a l'exercici anterior un combo box (&amp;lt;select&amp;gt;) amb els valors 1, 2 i 3 de text amb l'etiqueta &amp;quot;paràgraf&amp;quot; i dos botons amb el text &amp;quot;mostrar&amp;quot; i &amp;quot;ocultar&amp;quot;.&lt;br /&gt;
*Quan es faci click al botó mostrar, es mostrarà (estil &amp;quot;display:block;&amp;quot;) el paràgraf indicat pel valor seleccionat al combo box.&lt;br /&gt;
*Quan es faci click al botó ocultar, s'ocultarà (estil &amp;quot;display:none;&amp;quot;) el paràgraf indicat pel valor seleccionat al combo box.&lt;br /&gt;
&lt;br /&gt;
== Exercicis cursos passats ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Crea un document HTML amb diferents enllaços i paràgrafs i digues:&lt;br /&gt;
*Nombre d'enllaços de la pàgina&lt;br /&gt;
*Direcció a la qual enllaça el penúltim enllaç&lt;br /&gt;
*Nombre d'enllaços del tercer paràgraf&lt;br /&gt;
:[[solucio_enllaços]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici llista ===&lt;br /&gt;
Utilitzar les funcions DOM per crear nous nodes i afegir-los a una llista ordenada existent.&lt;br /&gt;
:[[solucio_llista_dom]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Mostra Direcció ===&lt;br /&gt;
Crea aquesta llista d'enllaços, en passar el ratolí per la llista, mostra la direcció a la qual apunten a l'editor de text (dins un input)&lt;br /&gt;
:[[solucio_mostra_direccio]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Canvi Fons ===&lt;br /&gt;
Crea una pàgina amb tres botons que ens permetin seleccionar la imatge de fons del document.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_boto_fons]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici llista afegir Altre ===&lt;br /&gt;
Realitzar un script que quan premem en l'opció d'uns dels radiobutton (Html, Css, Altre) en el cas de ser l'opció  'Altre' es mostri l'editor de text (input)&lt;br /&gt;
:[[solucio_afegir_altre]]&lt;br /&gt;
&lt;br /&gt;
=== Ejercicio Añadir Diversos Elementos ===&lt;br /&gt;
Se dispondrá de 5 botones:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Crear Párrafo&amp;quot;, &amp;quot;Crear Imagen&amp;quot;, &amp;quot;Borrar último&amp;quot;, &amp;quot;Borrar Primero&amp;quot;, &amp;quot;sustituir primer párrafo por vacio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Para poder Crear un párrafo deberá existir un textArea donde introduciremos un texto que irá añadiéndose cada vez que cliquemos y de color rojo.&lt;br /&gt;
&lt;br /&gt;
El botón crear Imagen nos pedirá un prompt de una url o dirección de una imagen y después su atributo &amp;quot;alt&amp;quot; para darle una descripción.&lt;br /&gt;
&lt;br /&gt;
Borrar último, borrará el último elemento creado.&lt;br /&gt;
&lt;br /&gt;
Borrar primero, borrará el primer elemento creado&lt;br /&gt;
&lt;br /&gt;
El último botón se tratará de sustituir el primer párrafo por otro que tenga como texto &amp;quot;vacio&amp;quot;. (replaceChild)&lt;br /&gt;
&lt;br /&gt;
:[[solucio_Anadir_diversos_elementos]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Web Dinámica ===&lt;br /&gt;
a) Crea un HTML amb els següents camps:&lt;br /&gt;
Input text1 : Que demani la etiqueta que es vol crear&lt;br /&gt;
Input text2 : Que demani On es vol crear (una altre etiqueta que ja hauria d'existir)&lt;br /&gt;
Boto crear: Crea el node del input text1 com a fill de input text2.&lt;br /&gt;
:[[solucio_crea_html]]&lt;br /&gt;
&lt;br /&gt;
b)Creació automática:&lt;br /&gt;
Crea automàticament una Web via DOM que contingui:&lt;br /&gt;
Tants paràgrafs com text trobis a la web http://www.lipsum.com/&lt;br /&gt;
Cada paràgraf ha de tenir un botó per tal de poder-lo eliminar.&lt;br /&gt;
:[[solucio_web_dom]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Botons Celestials ===&lt;br /&gt;
Crea una pàgina web amb dos botons amb el text:&lt;br /&gt;
*Text boto 1: 'Angelet'&lt;br /&gt;
*Text boto 2: 'Diablet'&lt;br /&gt;
El comportament ha de ser el següent:&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Angelet' es creen ''n'' botons més, on ''n'' és un número aleatori entre 1 i 10 i aquests botons poden ser 'Angelets o Diablets'.&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Diablet' s'eliminen ''n'' botons, on ''n'' és un número aleatori entre 1 i 20.&lt;br /&gt;
:[[solucio_botons_celestials]]&lt;br /&gt;
&lt;br /&gt;
== Bibliografia ==&lt;br /&gt;
&lt;br /&gt;
https://www.w3schools.com/jsref/dom_obj_document.asp&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Model_d%27objectes_del_document&amp;diff=17181</id>
		<title>NF2 - Model d'objectes del document</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Model_d%27objectes_del_document&amp;diff=17181"/>
				<updated>2023-03-07T17:35:19Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercici Enllaços DOM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Document Object Model =&lt;br /&gt;
És un conjunt d'objectes (API) Javascript que permeten interactuar amb el document HTML. Podem realitzar les següents operacions:&lt;br /&gt;
*Canviar i llegir el contingut i la estructura&lt;br /&gt;
*Canviar i llegir estils CSS&lt;br /&gt;
*Gestionar events&lt;br /&gt;
&lt;br /&gt;
Existeixen diversos nivells (versions) de DOM :&lt;br /&gt;
*Nivell 0: Introduït per Netscape i Microsoft a principis dels 90 durant la guerra dels navegadors. Per aixó, no existeix un DOM estàndard.&lt;br /&gt;
*Nivell 1: A partir d'aquí es va fer càrrec del DOM el W3C. Va introduir contingut dinàmic.&lt;br /&gt;
*Nivell 2: &amp;quot;Serialització&amp;quot; de XML (ex: permet guardar documents), events de teclat,...&lt;br /&gt;
&lt;br /&gt;
Els navegadors per poder utilitzar les utilitats de DOM, necessiten transformar la pàgina original. Una pàgina HTML normal no és més que una successió de caràcters, per la qual cosa és un format molt difícil de manipular. Per això, els navegadors web transformen automàticament totes les pàgines web en una estructura més eficient de manipular.&lt;br /&gt;
&lt;br /&gt;
== Arbre DOM ==&lt;br /&gt;
DOM transforma tots els documents XHTML en un conjunt d'elements anomenats nodes, que estan interconnectats i que representen els continguts de les pàgines web i les relacions entre ells. Pel seu aspecte, la unió de tots els nodes es diu &amp;quot;arbre de nodes&amp;quot;.&lt;br /&gt;
[[Fitxer:dom1.png|center]]&lt;br /&gt;
&lt;br /&gt;
L'arrel de l'arbre de nodes de qualsevol pàgina XHTML sempre és la mateixa: un node de tipus especial denominat ''Document''.&lt;br /&gt;
&lt;br /&gt;
A partir d'aquest node arrel, cada etiqueta XHTML es transforma en un node de tipus ''Element''. La conversió d'etiquetes en nodes es realitza de forma jeràrquica. D'aquesta forma, del node arrel solament poden derivar els nodes HEAD i BODY. A partir d'aquesta derivació inicial, cada etiqueta XHTML es transforma en un node que deriva del node corresponent a la seva '''etiqueta pare'''.&lt;br /&gt;
&lt;br /&gt;
La transformació de les etiquetes XHTML habituals genera dos nodes: el primer és el node de tipus ''Element'' (corresponent a la pròpia etiqueta XHTML) i el segon és un node de tipus ''Text'' que conté el text tancat per aquesta etiqueta XHTML.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=iso-8859-1&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Página sencilla&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Esta página es &amp;lt;strong&amp;gt;muy sencilla&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fitxer:dom2.gif|center]]&lt;br /&gt;
L'especificació completa de DOM defineix 12 tipus de nodes:&lt;br /&gt;
[[Fitxer:dom3.png|center]]&lt;br /&gt;
Encara que les pàgines XHTML habituals es poden manipular manejant solament quatre o cinc tipus de nodes:&lt;br /&gt;
*''Document'', node arrel del que deriven tots els altres nodes de l'arbre.&lt;br /&gt;
*''Element'', representa cadascuna de les etiquetes XHTML. Es tracta de l'únic node que pot contenir atributs i l'únic del que poden derivar altres nodes.&lt;br /&gt;
*''Attr'', es defineix un node d'aquest tipus per representar cadascun dels atributs de les etiquetes XHTML, és a dir, un per cada parell atribut=valor.&lt;br /&gt;
*''Text'', node que conté el text tancat per una etiqueta XHTML.&lt;br /&gt;
*''Comment'', representa els comentaris inclosos a la pàgina XHTML.&lt;br /&gt;
&lt;br /&gt;
Cada node té diverses propietats que reflecteixen el grau parentiu amb els altres. Alguna d'aquestes propietats son les següents:&lt;br /&gt;
*childNodes: array amb els nodes fills.&lt;br /&gt;
*firstChild: primer node fills&lt;br /&gt;
*lastchild: últim node fill&lt;br /&gt;
*parentNode: node pare&lt;br /&gt;
*nextSibling: següent germà (node al mateix nivell i amb el mateix pare)&lt;br /&gt;
*lastSibling: germà anterior.&lt;br /&gt;
Exemple:&lt;br /&gt;
[[Fitxer:dom4.png|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul id=&amp;quot;myList&amp;quot;&amp;gt;&amp;lt;li&amp;gt;Coffee&amp;lt;/li&amp;gt;&amp;lt;li id=&amp;quot;arribaHermano&amp;quot;&amp;gt;Tea&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Mejillones&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var pri = document.getElementById(&amp;quot;myList&amp;quot;).firstChild.innerHTML;&lt;br /&gt;
var ulti = document.getElementById(&amp;quot;myList&amp;quot;).lastChild.innerHTML;&lt;br /&gt;
var x = document.getElementById(&amp;quot;myList&amp;quot;).parentNode.nodeName;&lt;br /&gt;
var Upbrother = document.getElementById(&amp;quot;arribaHermano&amp;quot;).previousSibling.innerHTML;&lt;br /&gt;
var ProHermano = document.getElementById(&amp;quot;arribaHermano&amp;quot;).nextSibling.innerHTML;&lt;br /&gt;
&lt;br /&gt;
var nuevoItem = document.createElement(&amp;quot;LI&amp;quot;);       // Crear un nodo &amp;lt;li&amp;gt;&lt;br /&gt;
var nodoTexto = document.createTextNode(&amp;quot;Nuevo Elemnto&amp;quot;);  // crea un texto de nodo&lt;br /&gt;
nuevoItem.appendChild(nodoTexto);                    // Adjunta el texto a la &amp;lt;li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var list = document.getElementById(&amp;quot;myList&amp;quot;);    // Obtiene el &amp;lt;ul&amp;gt; elemento para insertar un nuevo nodo&lt;br /&gt;
list.insertBefore(nuevoItem, list.childNodes[0]);&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;demo&amp;quot;).innerHTML =&amp;quot;primer Hijo: &amp;quot;+ pri+&amp;quot; Último Hijo: &amp;quot;+ ulti +&amp;quot; Nodo Padre: &amp;quot;+ x +&amp;quot; Hermano Previo: &amp;quot;+ Upbrother + &amp;quot; Próximo Hermano: &amp;quot;+ProHermano;&lt;br /&gt;
        &lt;br /&gt;
       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''!CUIDADO'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;myList&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Coffee&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li id=&amp;quot;arribaHermano&amp;quot;&amp;gt;Tea&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Mejillones&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var primerHijoEspacio=document.getElementById(&amp;quot;myList&amp;quot;).firstChild; //selecciona primer espacio&lt;br /&gt;
var PrimerElementoCoffe=primerHijoEspacio.nextSibling;  // selecciona el siguiente nodo que corresponde con el elemento.&lt;br /&gt;
var siguienteNodoEspacio=PrimerElementoCoffe.nextSibling; //selecciona el siguiente nodo que es un espacio.&lt;br /&gt;
var SegundoElementoTea=siguienteNodoEspacio.nextElementSibling;  //selecciona el siguiente elemento.&lt;br /&gt;
var TercerElementoMejillones=SegundoElementoTea.nextElementSibling;  //selecciona el siguiente elemento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var TodoHijosEspacioElementos=document.getElementById(&amp;quot;myList&amp;quot;).childNodes; //incluye texto/comentarios y elementos&lt;br /&gt;
var ElementosHijos=document.getElementById(&amp;quot;myList&amp;quot;).children;  //sólo elementos&lt;br /&gt;
&lt;br /&gt;
//let primerElementoHijo=document.getElementById(&amp;quot;myList&amp;quot;).firstElementChild();  //selecciona el primer Nodo que corresponde con un Elemento&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mètodes d'accés als nodes de l'arbre ==&lt;br /&gt;
És important recordar que l'accés als nodes, la seva modificació i la seva eliminació solament és possible quan l'arbre DOM ha estat construït completament, és a dir, després que la pàgina XHTML es carregui per complet.&lt;br /&gt;
A continuació es mostren les diferents formes per aconseguir un node de l'arbre de manera directa, sense haver de recórrer-ho:&lt;br /&gt;
*''getElementsByTagName(nomEtiqueta)'' : obté tots els elements de la pàgina XHTML l'etiqueta de la qual sigui igual que el paràmetre que se li passa a la funció.&lt;br /&gt;
El següent exemple mostra com obtenir tots els paràgrafs d'una pàgina XHTML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	var parrafos = document.getElementsByTagName(&amp;quot;p&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El valor que retorna la funció és un array amb tots els nodes que compleixen la condició que la seva etiqueta coincideix amb el paràmetre proporcionat. El valor retornat és un array de nodes DOM, no un array de cadenes de text o un array d'objectes normals. Per tant, s'ha de processar cada valor del array de la forma que es mostra:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
for(var i=0; i&amp;lt;parrafos.length; i++) {&lt;br /&gt;
  //Obtenim tots els enllaços del cada paràgraf  &lt;br /&gt;
  var enlaces = parrafos[i].getElementsByTagName(&amp;quot;a&amp;quot;);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*''getElementsByName(&amp;quot;nomElement&amp;quot;)'':En aquest cas es busquen els elements l'atribut dels quals name sigui igual al paràmetre proporcionat. &lt;br /&gt;
En el següent exemple, s'obté directament l'únic paràgraf amb el nom indicat:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var parrafoEspecial = document.getElementsByName(&amp;quot;especial&amp;quot;);&lt;br /&gt;
&amp;lt;p name=&amp;quot;prueba&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p name=&amp;quot;especial&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Normalment l'atribut name és únic per als elements HTML que ho defineixen, per la qual cosa és un mètode molt pràctic per accedir directament al node desitjat. En el cas dels elements HTML '''radiobutton''', l'atribut '''name''' és comú a tots els radiobutton que estan relacionats, per la qual cosa la funció retorna una col·lecció d'elements.&lt;br /&gt;
&lt;br /&gt;
*''getElementById(idelement)'': Retorna l'element XHTML l'atribut del qual coincideix amb el paràmetre indicat en la funció. Com l'atribut ha de ser únic per a cada element d'una mateixa pàgina, la funció retorna únicament el node desitjat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var cabecera = document.getElementById(&amp;quot;cabecera&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div id=&amp;quot;cabecera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/&amp;quot; id=&amp;quot;logo&amp;quot;&amp;gt;...&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*''getElementsByClassName(&amp;quot;nomclass&amp;quot;)'': retorna una col·lecció de tots els elements en el document amb el nom de classe especificat, com un objecte nodelist. L'objecte nodelist representa una col·lecció de nodes. Els nodes poden ser accedits per nombres d'índex. L'índex comença en 0.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;exemple&amp;quot;&amp;gt;Primer Element amb class=&amp;quot;exemple&amp;quot;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;exemple&amp;quot;&amp;gt;Segon Element amb class=&amp;quot;exemple&amp;quot;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var x = document.getElementsByClassName(&amp;quot;exemple&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*''document.querySelector()'' :Retorna el primer element que compleixi amb el criteri donat. Pot ser invocada sobre el document o sobre algun element. En cas d'usar-se sobre un element, les cerca es limita als fills d'aquest element.&lt;br /&gt;
Si la cerca no troba res, retorna null.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
document.querySelector()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 class=&amp;quot;example&amp;quot;&amp;gt;A heading with class=&amp;quot;example&amp;quot;&amp;lt;/h2&amp;gt;  &amp;lt;!--retorna la primera aparació--&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;example&amp;quot;&amp;gt;A paragraph with class=&amp;quot;example&amp;quot;.&amp;lt;/p&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
document.querySelector(&amp;quot;.example&amp;quot;).style.backgroundColor = &amp;quot;red&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*''document.querySelectorAll()'' Retorna tots els elements que compleixin amb el criteri donat. A l'igual que querySelector pot ser invocada sobre el document o sobre algun element. Sempre retorna 1 nodelist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*Selecciona tots els elements i retorna un NodeList, després per cada iteració afeig un 'border'*/&lt;br /&gt;
var tags = document.querySelectorAll('h1,h2,h3,h4,h5,h6,div,p');&lt;br /&gt;
for (var i = tags.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
  tags[i].style.outline = &amp;quot;1px solid green&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Accedir als atributs d'un node ===&lt;br /&gt;
Els atributs XHTML dels elements de la pàgina es transformen automàticament en propietats dels nodes. Per accedir al seu valor, simplement s'indica el nom de l'atribut XHTML darrere del nom del node.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var enlace = document.getElementById(&amp;quot;enlace&amp;quot;);&lt;br /&gt;
alert(enlace.href); // muestra http://www...com&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace&amp;quot; href=&amp;quot;http://www...com&amp;quot;&amp;gt;Enlace&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per obtenir el valor de qualsevol propietat CSS del node, s'ha d'utilitzar l'atribut style. El següent exemple obté el valor de la propietat margin de la imatge:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var imagen = document.getElementById(&amp;quot;imagen&amp;quot;);&lt;br /&gt;
alert(imagen.style.margin);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;img id=&amp;quot;imagen&amp;quot; style=&amp;quot;margin:0; border:0;&amp;quot; src=&amp;quot;logo.png&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Creació i eliminació nodes de l'arbre ==&lt;br /&gt;
=== Creació de nodes XHTML simples ===&lt;br /&gt;
crear i afegir a la pàgina un nou element XHTML senzill consta de quatre passos diferents:&lt;br /&gt;
&lt;br /&gt;
*Creació d'un node de tipus Element que representi a l'element.&lt;br /&gt;
*Creació d'un node de tipus Text que representi el contingut de l'element.&lt;br /&gt;
*Afegir el node Text com a node fill del node Element.&lt;br /&gt;
*Afegir el node Element a la pàgina, en forma de node fill del node corresponent al lloc en el qual es vol inserir l'element.&lt;br /&gt;
D'aquesta manera, si es vol afegir un paràgraf simple al final d'una pàgina XHTML, és necessari incloure el següent codi Javascript:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Crear nodo de tipo Element&lt;br /&gt;
var parrafo = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
// Crear nodo de tipo Text&lt;br /&gt;
var contenido = document.createTextNode(&amp;quot;Hola Mundo!&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
// Añadir el nodo Text como hijo del nodo Element&lt;br /&gt;
parrafo.appendChild(contenido);&lt;br /&gt;
 &lt;br /&gt;
// Añadir el nodo Element como hijo de la pagina&lt;br /&gt;
document.body.appendChild(parrafo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcions utilitzades per a la creació del node:&lt;br /&gt;
*''createElement(etiqueta)'': Crea un node de tipus '''element''' que representa l'element XHTML.&lt;br /&gt;
*''createTextNode(contingut)'': crea un node de tipus '''text''' que emmagatzema el contingut textual (innerHTML).&lt;br /&gt;
*''nodepare.appendChild(nodefill)'': afegeix el '''nodefill''' com a fill de '''nodepare'''.&lt;br /&gt;
&lt;br /&gt;
=== Eliminació de nodes XHTML ===&lt;br /&gt;
Per eliminar un node és molt senzill, només s'ha d'utilitzar la funció ''removeChild(nodeAeliminar)''.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var parrafo = document.getElementById(&amp;quot;provisional&amp;quot;);&lt;br /&gt;
parrafo.parentNode.removeChild(parrafo);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p id=&amp;quot;provisional&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per eliminar un node d'una pàgina XHTML s'invoca a la funció removeChild() des del valor parentNode del node que es vol eliminar. Quan s'elimina un node, també s'eliminen automàticament tots els nodes fills que tingui, per la qual cosa no és necessari esborrar manualment cada node fill.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Esdeveniments dinàmics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var btn = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
    var contenido = document.createTextNode(&amp;quot;Hola Mundo!&amp;quot;);&lt;br /&gt;
    btn.appendChild(contenido);&lt;br /&gt;
    btn.addEventListener('click', function(){alert(&amp;quot;hola mundo&amp;quot;);}, false);&lt;br /&gt;
    document.body.appendChild(btn);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opció 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var i = 1;&lt;br /&gt;
document.getElementById('creator').addEventListener('click',function(){&lt;br /&gt;
  var div = document.createElement('div');&lt;br /&gt;
  var text = document.createTextNode('New Div ' + i);&lt;br /&gt;
  div.appendChild(text);&lt;br /&gt;
  document.body.appendChild(div);&lt;br /&gt;
  i++;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener('click',function(e){&lt;br /&gt;
    // Fixed&lt;br /&gt;
    if(e.target.tagName.toLowerCase() === 'div'){&lt;br /&gt;
        console.log(e.target);&lt;br /&gt;
    }&lt;br /&gt;
 })&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  Div actual&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;button id='creator'&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2022/2023 ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Crea un document HTML amb diferents enllaços i paràgrafs i digues:&lt;br /&gt;
*Nombre d'enllaços de la pàgina&lt;br /&gt;
*Direcció a la qual enllaça el penúltim enllaç&lt;br /&gt;
*Nombre d'enllaços del tercer paràgraf&lt;br /&gt;
:[[solucio_enllaços]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Afegeix a l'exercici anterior un combo box (&amp;lt;select&amp;gt;) amb els valors 1, 2 i 3 de text amb l'etiqueta &amp;quot;paràgraf&amp;quot; i dos botons amb el text &amp;quot;mostrar&amp;quot; i &amp;quot;ocultar&amp;quot;.&lt;br /&gt;
*Quan es faci click al botó mostrar, es mostrarà (estil &amp;quot;display:block;&amp;quot;) el paràgraf indicat pel valor seleccionat al combo box.&lt;br /&gt;
*Quan es faci click al botó ocultar, s'ocultarà (estil &amp;quot;display:none;&amp;quot;) el paràgraf indicat pel valor seleccionat al combo box.&lt;br /&gt;
&lt;br /&gt;
== Exercicis cursos passats ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Crea un document HTML amb diferents enllaços i paràgrafs i digues:&lt;br /&gt;
*Nombre d'enllaços de la pàgina&lt;br /&gt;
*Direcció a la qual enllaça el penúltim enllaç&lt;br /&gt;
*Nombre d'enllaços del tercer paràgraf&lt;br /&gt;
:[[solucio_enllaços]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici llista ===&lt;br /&gt;
Utilitzar les funcions DOM per crear nous nodes i afegir-los a una llista ordenada existent.&lt;br /&gt;
:[[solucio_llista_dom]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Mostra Direcció ===&lt;br /&gt;
Crea aquesta llista d'enllaços, en passar el ratolí per la llista, mostra la direcció a la qual apunten a l'editor de text (dins un input)&lt;br /&gt;
:[[solucio_mostra_direccio]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Canvi Fons ===&lt;br /&gt;
Crea una pàgina amb tres botons que ens permetin seleccionar la imatge de fons del document.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_boto_fons]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici llista afegir Altre ===&lt;br /&gt;
Realitzar un script que quan premem en l'opció d'uns dels radiobutton (Html, Css, Altre) en el cas de ser l'opció  'Altre' es mostri l'editor de text (input)&lt;br /&gt;
:[[solucio_afegir_altre]]&lt;br /&gt;
&lt;br /&gt;
=== Ejercicio Añadir Diversos Elementos ===&lt;br /&gt;
Se dispondrá de 5 botones:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Crear Párrafo&amp;quot;, &amp;quot;Crear Imagen&amp;quot;, &amp;quot;Borrar último&amp;quot;, &amp;quot;Borrar Primero&amp;quot;, &amp;quot;sustituir primer párrafo por vacio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Para poder Crear un párrafo deberá existir un textArea donde introduciremos un texto que irá añadiéndose cada vez que cliquemos y de color rojo.&lt;br /&gt;
&lt;br /&gt;
El botón crear Imagen nos pedirá un prompt de una url o dirección de una imagen y después su atributo &amp;quot;alt&amp;quot; para darle una descripción.&lt;br /&gt;
&lt;br /&gt;
Borrar último, borrará el último elemento creado.&lt;br /&gt;
&lt;br /&gt;
Borrar primero, borrará el primer elemento creado&lt;br /&gt;
&lt;br /&gt;
El último botón se tratará de sustituir el primer párrafo por otro que tenga como texto &amp;quot;vacio&amp;quot;. (replaceChild)&lt;br /&gt;
&lt;br /&gt;
:[[solucio_Anadir_diversos_elementos]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Web Dinámica ===&lt;br /&gt;
a) Crea un HTML amb els següents camps:&lt;br /&gt;
Input text1 : Que demani la etiqueta que es vol crear&lt;br /&gt;
Input text2 : Que demani On es vol crear (una altre etiqueta que ja hauria d'existir)&lt;br /&gt;
Boto crear: Crea el node del input text1 com a fill de input text2.&lt;br /&gt;
:[[solucio_crea_html]]&lt;br /&gt;
&lt;br /&gt;
b)Creació automática:&lt;br /&gt;
Crea automàticament una Web via DOM que contingui:&lt;br /&gt;
Tants paràgrafs com text trobis a la web http://www.lipsum.com/&lt;br /&gt;
Cada paràgraf ha de tenir un botó per tal de poder-lo eliminar.&lt;br /&gt;
:[[solucio_web_dom]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Botons Celestials ===&lt;br /&gt;
Crea una pàgina web amb dos botons amb el text:&lt;br /&gt;
*Text boto 1: 'Angelet'&lt;br /&gt;
*Text boto 2: 'Diablet'&lt;br /&gt;
El comportament ha de ser el següent:&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Angelet' es creen ''n'' botons més, on ''n'' és un número aleatori entre 1 i 10 i aquests botons poden ser 'Angelets o Diablets'.&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Diablet' s'eliminen ''n'' botons, on ''n'' és un número aleatori entre 1 i 20.&lt;br /&gt;
:[[solucio_botons_celestials]]&lt;br /&gt;
&lt;br /&gt;
== Bibliografia ==&lt;br /&gt;
&lt;br /&gt;
https://www.w3schools.com/jsref/dom_obj_document.asp&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Model_d%27objectes_del_document&amp;diff=17180</id>
		<title>NF2 - Model d'objectes del document</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Model_d%27objectes_del_document&amp;diff=17180"/>
				<updated>2023-03-07T16:12:56Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis curs 2022s passats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Document Object Model =&lt;br /&gt;
És un conjunt d'objectes (API) Javascript que permeten interactuar amb el document HTML. Podem realitzar les següents operacions:&lt;br /&gt;
*Canviar i llegir el contingut i la estructura&lt;br /&gt;
*Canviar i llegir estils CSS&lt;br /&gt;
*Gestionar events&lt;br /&gt;
&lt;br /&gt;
Existeixen diversos nivells (versions) de DOM :&lt;br /&gt;
*Nivell 0: Introduït per Netscape i Microsoft a principis dels 90 durant la guerra dels navegadors. Per aixó, no existeix un DOM estàndard.&lt;br /&gt;
*Nivell 1: A partir d'aquí es va fer càrrec del DOM el W3C. Va introduir contingut dinàmic.&lt;br /&gt;
*Nivell 2: &amp;quot;Serialització&amp;quot; de XML (ex: permet guardar documents), events de teclat,...&lt;br /&gt;
&lt;br /&gt;
Els navegadors per poder utilitzar les utilitats de DOM, necessiten transformar la pàgina original. Una pàgina HTML normal no és més que una successió de caràcters, per la qual cosa és un format molt difícil de manipular. Per això, els navegadors web transformen automàticament totes les pàgines web en una estructura més eficient de manipular.&lt;br /&gt;
&lt;br /&gt;
== Arbre DOM ==&lt;br /&gt;
DOM transforma tots els documents XHTML en un conjunt d'elements anomenats nodes, que estan interconnectats i que representen els continguts de les pàgines web i les relacions entre ells. Pel seu aspecte, la unió de tots els nodes es diu &amp;quot;arbre de nodes&amp;quot;.&lt;br /&gt;
[[Fitxer:dom1.png|center]]&lt;br /&gt;
&lt;br /&gt;
L'arrel de l'arbre de nodes de qualsevol pàgina XHTML sempre és la mateixa: un node de tipus especial denominat ''Document''.&lt;br /&gt;
&lt;br /&gt;
A partir d'aquest node arrel, cada etiqueta XHTML es transforma en un node de tipus ''Element''. La conversió d'etiquetes en nodes es realitza de forma jeràrquica. D'aquesta forma, del node arrel solament poden derivar els nodes HEAD i BODY. A partir d'aquesta derivació inicial, cada etiqueta XHTML es transforma en un node que deriva del node corresponent a la seva '''etiqueta pare'''.&lt;br /&gt;
&lt;br /&gt;
La transformació de les etiquetes XHTML habituals genera dos nodes: el primer és el node de tipus ''Element'' (corresponent a la pròpia etiqueta XHTML) i el segon és un node de tipus ''Text'' que conté el text tancat per aquesta etiqueta XHTML.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=iso-8859-1&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Página sencilla&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Esta página es &amp;lt;strong&amp;gt;muy sencilla&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fitxer:dom2.gif|center]]&lt;br /&gt;
L'especificació completa de DOM defineix 12 tipus de nodes:&lt;br /&gt;
[[Fitxer:dom3.png|center]]&lt;br /&gt;
Encara que les pàgines XHTML habituals es poden manipular manejant solament quatre o cinc tipus de nodes:&lt;br /&gt;
*''Document'', node arrel del que deriven tots els altres nodes de l'arbre.&lt;br /&gt;
*''Element'', representa cadascuna de les etiquetes XHTML. Es tracta de l'únic node que pot contenir atributs i l'únic del que poden derivar altres nodes.&lt;br /&gt;
*''Attr'', es defineix un node d'aquest tipus per representar cadascun dels atributs de les etiquetes XHTML, és a dir, un per cada parell atribut=valor.&lt;br /&gt;
*''Text'', node que conté el text tancat per una etiqueta XHTML.&lt;br /&gt;
*''Comment'', representa els comentaris inclosos a la pàgina XHTML.&lt;br /&gt;
&lt;br /&gt;
Cada node té diverses propietats que reflecteixen el grau parentiu amb els altres. Alguna d'aquestes propietats son les següents:&lt;br /&gt;
*childNodes: array amb els nodes fills.&lt;br /&gt;
*firstChild: primer node fills&lt;br /&gt;
*lastchild: últim node fill&lt;br /&gt;
*parentNode: node pare&lt;br /&gt;
*nextSibling: següent germà (node al mateix nivell i amb el mateix pare)&lt;br /&gt;
*lastSibling: germà anterior.&lt;br /&gt;
Exemple:&lt;br /&gt;
[[Fitxer:dom4.png|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul id=&amp;quot;myList&amp;quot;&amp;gt;&amp;lt;li&amp;gt;Coffee&amp;lt;/li&amp;gt;&amp;lt;li id=&amp;quot;arribaHermano&amp;quot;&amp;gt;Tea&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Mejillones&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var pri = document.getElementById(&amp;quot;myList&amp;quot;).firstChild.innerHTML;&lt;br /&gt;
var ulti = document.getElementById(&amp;quot;myList&amp;quot;).lastChild.innerHTML;&lt;br /&gt;
var x = document.getElementById(&amp;quot;myList&amp;quot;).parentNode.nodeName;&lt;br /&gt;
var Upbrother = document.getElementById(&amp;quot;arribaHermano&amp;quot;).previousSibling.innerHTML;&lt;br /&gt;
var ProHermano = document.getElementById(&amp;quot;arribaHermano&amp;quot;).nextSibling.innerHTML;&lt;br /&gt;
&lt;br /&gt;
var nuevoItem = document.createElement(&amp;quot;LI&amp;quot;);       // Crear un nodo &amp;lt;li&amp;gt;&lt;br /&gt;
var nodoTexto = document.createTextNode(&amp;quot;Nuevo Elemnto&amp;quot;);  // crea un texto de nodo&lt;br /&gt;
nuevoItem.appendChild(nodoTexto);                    // Adjunta el texto a la &amp;lt;li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var list = document.getElementById(&amp;quot;myList&amp;quot;);    // Obtiene el &amp;lt;ul&amp;gt; elemento para insertar un nuevo nodo&lt;br /&gt;
list.insertBefore(nuevoItem, list.childNodes[0]);&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;demo&amp;quot;).innerHTML =&amp;quot;primer Hijo: &amp;quot;+ pri+&amp;quot; Último Hijo: &amp;quot;+ ulti +&amp;quot; Nodo Padre: &amp;quot;+ x +&amp;quot; Hermano Previo: &amp;quot;+ Upbrother + &amp;quot; Próximo Hermano: &amp;quot;+ProHermano;&lt;br /&gt;
        &lt;br /&gt;
       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''!CUIDADO'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;myList&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Coffee&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li id=&amp;quot;arribaHermano&amp;quot;&amp;gt;Tea&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Mejillones&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var primerHijoEspacio=document.getElementById(&amp;quot;myList&amp;quot;).firstChild; //selecciona primer espacio&lt;br /&gt;
var PrimerElementoCoffe=primerHijoEspacio.nextSibling;  // selecciona el siguiente nodo que corresponde con el elemento.&lt;br /&gt;
var siguienteNodoEspacio=PrimerElementoCoffe.nextSibling; //selecciona el siguiente nodo que es un espacio.&lt;br /&gt;
var SegundoElementoTea=siguienteNodoEspacio.nextElementSibling;  //selecciona el siguiente elemento.&lt;br /&gt;
var TercerElementoMejillones=SegundoElementoTea.nextElementSibling;  //selecciona el siguiente elemento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var TodoHijosEspacioElementos=document.getElementById(&amp;quot;myList&amp;quot;).childNodes; //incluye texto/comentarios y elementos&lt;br /&gt;
var ElementosHijos=document.getElementById(&amp;quot;myList&amp;quot;).children;  //sólo elementos&lt;br /&gt;
&lt;br /&gt;
//let primerElementoHijo=document.getElementById(&amp;quot;myList&amp;quot;).firstElementChild();  //selecciona el primer Nodo que corresponde con un Elemento&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mètodes d'accés als nodes de l'arbre ==&lt;br /&gt;
És important recordar que l'accés als nodes, la seva modificació i la seva eliminació solament és possible quan l'arbre DOM ha estat construït completament, és a dir, després que la pàgina XHTML es carregui per complet.&lt;br /&gt;
A continuació es mostren les diferents formes per aconseguir un node de l'arbre de manera directa, sense haver de recórrer-ho:&lt;br /&gt;
*''getElementsByTagName(nomEtiqueta)'' : obté tots els elements de la pàgina XHTML l'etiqueta de la qual sigui igual que el paràmetre que se li passa a la funció.&lt;br /&gt;
El següent exemple mostra com obtenir tots els paràgrafs d'una pàgina XHTML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	var parrafos = document.getElementsByTagName(&amp;quot;p&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El valor que retorna la funció és un array amb tots els nodes que compleixen la condició que la seva etiqueta coincideix amb el paràmetre proporcionat. El valor retornat és un array de nodes DOM, no un array de cadenes de text o un array d'objectes normals. Per tant, s'ha de processar cada valor del array de la forma que es mostra:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
for(var i=0; i&amp;lt;parrafos.length; i++) {&lt;br /&gt;
  //Obtenim tots els enllaços del cada paràgraf  &lt;br /&gt;
  var enlaces = parrafos[i].getElementsByTagName(&amp;quot;a&amp;quot;);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*''getElementsByName(&amp;quot;nomElement&amp;quot;)'':En aquest cas es busquen els elements l'atribut dels quals name sigui igual al paràmetre proporcionat. &lt;br /&gt;
En el següent exemple, s'obté directament l'únic paràgraf amb el nom indicat:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var parrafoEspecial = document.getElementsByName(&amp;quot;especial&amp;quot;);&lt;br /&gt;
&amp;lt;p name=&amp;quot;prueba&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p name=&amp;quot;especial&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Normalment l'atribut name és únic per als elements HTML que ho defineixen, per la qual cosa és un mètode molt pràctic per accedir directament al node desitjat. En el cas dels elements HTML '''radiobutton''', l'atribut '''name''' és comú a tots els radiobutton que estan relacionats, per la qual cosa la funció retorna una col·lecció d'elements.&lt;br /&gt;
&lt;br /&gt;
*''getElementById(idelement)'': Retorna l'element XHTML l'atribut del qual coincideix amb el paràmetre indicat en la funció. Com l'atribut ha de ser únic per a cada element d'una mateixa pàgina, la funció retorna únicament el node desitjat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var cabecera = document.getElementById(&amp;quot;cabecera&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div id=&amp;quot;cabecera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/&amp;quot; id=&amp;quot;logo&amp;quot;&amp;gt;...&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*''getElementsByClassName(&amp;quot;nomclass&amp;quot;)'': retorna una col·lecció de tots els elements en el document amb el nom de classe especificat, com un objecte nodelist. L'objecte nodelist representa una col·lecció de nodes. Els nodes poden ser accedits per nombres d'índex. L'índex comença en 0.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;exemple&amp;quot;&amp;gt;Primer Element amb class=&amp;quot;exemple&amp;quot;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;exemple&amp;quot;&amp;gt;Segon Element amb class=&amp;quot;exemple&amp;quot;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var x = document.getElementsByClassName(&amp;quot;exemple&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*''document.querySelector()'' :Retorna el primer element que compleixi amb el criteri donat. Pot ser invocada sobre el document o sobre algun element. En cas d'usar-se sobre un element, les cerca es limita als fills d'aquest element.&lt;br /&gt;
Si la cerca no troba res, retorna null.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
document.querySelector()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 class=&amp;quot;example&amp;quot;&amp;gt;A heading with class=&amp;quot;example&amp;quot;&amp;lt;/h2&amp;gt;  &amp;lt;!--retorna la primera aparació--&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;example&amp;quot;&amp;gt;A paragraph with class=&amp;quot;example&amp;quot;.&amp;lt;/p&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
document.querySelector(&amp;quot;.example&amp;quot;).style.backgroundColor = &amp;quot;red&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*''document.querySelectorAll()'' Retorna tots els elements que compleixin amb el criteri donat. A l'igual que querySelector pot ser invocada sobre el document o sobre algun element. Sempre retorna 1 nodelist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*Selecciona tots els elements i retorna un NodeList, després per cada iteració afeig un 'border'*/&lt;br /&gt;
var tags = document.querySelectorAll('h1,h2,h3,h4,h5,h6,div,p');&lt;br /&gt;
for (var i = tags.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
  tags[i].style.outline = &amp;quot;1px solid green&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Accedir als atributs d'un node ===&lt;br /&gt;
Els atributs XHTML dels elements de la pàgina es transformen automàticament en propietats dels nodes. Per accedir al seu valor, simplement s'indica el nom de l'atribut XHTML darrere del nom del node.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var enlace = document.getElementById(&amp;quot;enlace&amp;quot;);&lt;br /&gt;
alert(enlace.href); // muestra http://www...com&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace&amp;quot; href=&amp;quot;http://www...com&amp;quot;&amp;gt;Enlace&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per obtenir el valor de qualsevol propietat CSS del node, s'ha d'utilitzar l'atribut style. El següent exemple obté el valor de la propietat margin de la imatge:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var imagen = document.getElementById(&amp;quot;imagen&amp;quot;);&lt;br /&gt;
alert(imagen.style.margin);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;img id=&amp;quot;imagen&amp;quot; style=&amp;quot;margin:0; border:0;&amp;quot; src=&amp;quot;logo.png&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Creació i eliminació nodes de l'arbre ==&lt;br /&gt;
=== Creació de nodes XHTML simples ===&lt;br /&gt;
crear i afegir a la pàgina un nou element XHTML senzill consta de quatre passos diferents:&lt;br /&gt;
&lt;br /&gt;
*Creació d'un node de tipus Element que representi a l'element.&lt;br /&gt;
*Creació d'un node de tipus Text que representi el contingut de l'element.&lt;br /&gt;
*Afegir el node Text com a node fill del node Element.&lt;br /&gt;
*Afegir el node Element a la pàgina, en forma de node fill del node corresponent al lloc en el qual es vol inserir l'element.&lt;br /&gt;
D'aquesta manera, si es vol afegir un paràgraf simple al final d'una pàgina XHTML, és necessari incloure el següent codi Javascript:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Crear nodo de tipo Element&lt;br /&gt;
var parrafo = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
// Crear nodo de tipo Text&lt;br /&gt;
var contenido = document.createTextNode(&amp;quot;Hola Mundo!&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
// Añadir el nodo Text como hijo del nodo Element&lt;br /&gt;
parrafo.appendChild(contenido);&lt;br /&gt;
 &lt;br /&gt;
// Añadir el nodo Element como hijo de la pagina&lt;br /&gt;
document.body.appendChild(parrafo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcions utilitzades per a la creació del node:&lt;br /&gt;
*''createElement(etiqueta)'': Crea un node de tipus '''element''' que representa l'element XHTML.&lt;br /&gt;
*''createTextNode(contingut)'': crea un node de tipus '''text''' que emmagatzema el contingut textual (innerHTML).&lt;br /&gt;
*''nodepare.appendChild(nodefill)'': afegeix el '''nodefill''' com a fill de '''nodepare'''.&lt;br /&gt;
&lt;br /&gt;
=== Eliminació de nodes XHTML ===&lt;br /&gt;
Per eliminar un node és molt senzill, només s'ha d'utilitzar la funció ''removeChild(nodeAeliminar)''.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var parrafo = document.getElementById(&amp;quot;provisional&amp;quot;);&lt;br /&gt;
parrafo.parentNode.removeChild(parrafo);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p id=&amp;quot;provisional&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per eliminar un node d'una pàgina XHTML s'invoca a la funció removeChild() des del valor parentNode del node que es vol eliminar. Quan s'elimina un node, també s'eliminen automàticament tots els nodes fills que tingui, per la qual cosa no és necessari esborrar manualment cada node fill.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Esdeveniments dinàmics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var btn = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
    var contenido = document.createTextNode(&amp;quot;Hola Mundo!&amp;quot;);&lt;br /&gt;
    btn.appendChild(contenido);&lt;br /&gt;
    btn.addEventListener('click', function(){alert(&amp;quot;hola mundo&amp;quot;);}, false);&lt;br /&gt;
    document.body.appendChild(btn);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opció 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var i = 1;&lt;br /&gt;
document.getElementById('creator').addEventListener('click',function(){&lt;br /&gt;
  var div = document.createElement('div');&lt;br /&gt;
  var text = document.createTextNode('New Div ' + i);&lt;br /&gt;
  div.appendChild(text);&lt;br /&gt;
  document.body.appendChild(div);&lt;br /&gt;
  i++;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener('click',function(e){&lt;br /&gt;
    // Fixed&lt;br /&gt;
    if(e.target.tagName.toLowerCase() === 'div'){&lt;br /&gt;
        console.log(e.target);&lt;br /&gt;
    }&lt;br /&gt;
 })&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  Div actual&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;button id='creator'&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2022/2023 ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Crea un document HTML amb diferents enllaços i paràgrafs i digues:&lt;br /&gt;
*Nombre d'enllaços de la pàgina&lt;br /&gt;
*Direcció a la qual enllaça el penúltim enllaç&lt;br /&gt;
*Nombre d'enllaços del tercer paràgraf&lt;br /&gt;
:[[solucio_enllaços]]&lt;br /&gt;
&lt;br /&gt;
== Exercicis cursos passats ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Crea un document HTML amb diferents enllaços i paràgrafs i digues:&lt;br /&gt;
*Nombre d'enllaços de la pàgina&lt;br /&gt;
*Direcció a la qual enllaça el penúltim enllaç&lt;br /&gt;
*Nombre d'enllaços del tercer paràgraf&lt;br /&gt;
:[[solucio_enllaços]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici llista ===&lt;br /&gt;
Utilitzar les funcions DOM per crear nous nodes i afegir-los a una llista ordenada existent.&lt;br /&gt;
:[[solucio_llista_dom]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Mostra Direcció ===&lt;br /&gt;
Crea aquesta llista d'enllaços, en passar el ratolí per la llista, mostra la direcció a la qual apunten a l'editor de text (dins un input)&lt;br /&gt;
:[[solucio_mostra_direccio]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Canvi Fons ===&lt;br /&gt;
Crea una pàgina amb tres botons que ens permetin seleccionar la imatge de fons del document.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_boto_fons]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici llista afegir Altre ===&lt;br /&gt;
Realitzar un script que quan premem en l'opció d'uns dels radiobutton (Html, Css, Altre) en el cas de ser l'opció  'Altre' es mostri l'editor de text (input)&lt;br /&gt;
:[[solucio_afegir_altre]]&lt;br /&gt;
&lt;br /&gt;
=== Ejercicio Añadir Diversos Elementos ===&lt;br /&gt;
Se dispondrá de 5 botones:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Crear Párrafo&amp;quot;, &amp;quot;Crear Imagen&amp;quot;, &amp;quot;Borrar último&amp;quot;, &amp;quot;Borrar Primero&amp;quot;, &amp;quot;sustituir primer párrafo por vacio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Para poder Crear un párrafo deberá existir un textArea donde introduciremos un texto que irá añadiéndose cada vez que cliquemos y de color rojo.&lt;br /&gt;
&lt;br /&gt;
El botón crear Imagen nos pedirá un prompt de una url o dirección de una imagen y después su atributo &amp;quot;alt&amp;quot; para darle una descripción.&lt;br /&gt;
&lt;br /&gt;
Borrar último, borrará el último elemento creado.&lt;br /&gt;
&lt;br /&gt;
Borrar primero, borrará el primer elemento creado&lt;br /&gt;
&lt;br /&gt;
El último botón se tratará de sustituir el primer párrafo por otro que tenga como texto &amp;quot;vacio&amp;quot;. (replaceChild)&lt;br /&gt;
&lt;br /&gt;
:[[solucio_Anadir_diversos_elementos]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Web Dinámica ===&lt;br /&gt;
a) Crea un HTML amb els següents camps:&lt;br /&gt;
Input text1 : Que demani la etiqueta que es vol crear&lt;br /&gt;
Input text2 : Que demani On es vol crear (una altre etiqueta que ja hauria d'existir)&lt;br /&gt;
Boto crear: Crea el node del input text1 com a fill de input text2.&lt;br /&gt;
:[[solucio_crea_html]]&lt;br /&gt;
&lt;br /&gt;
b)Creació automática:&lt;br /&gt;
Crea automàticament una Web via DOM que contingui:&lt;br /&gt;
Tants paràgrafs com text trobis a la web http://www.lipsum.com/&lt;br /&gt;
Cada paràgraf ha de tenir un botó per tal de poder-lo eliminar.&lt;br /&gt;
:[[solucio_web_dom]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Botons Celestials ===&lt;br /&gt;
Crea una pàgina web amb dos botons amb el text:&lt;br /&gt;
*Text boto 1: 'Angelet'&lt;br /&gt;
*Text boto 2: 'Diablet'&lt;br /&gt;
El comportament ha de ser el següent:&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Angelet' es creen ''n'' botons més, on ''n'' és un número aleatori entre 1 i 10 i aquests botons poden ser 'Angelets o Diablets'.&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Diablet' s'eliminen ''n'' botons, on ''n'' és un número aleatori entre 1 i 20.&lt;br /&gt;
:[[solucio_botons_celestials]]&lt;br /&gt;
&lt;br /&gt;
== Bibliografia ==&lt;br /&gt;
&lt;br /&gt;
https://www.w3schools.com/jsref/dom_obj_document.asp&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Model_d%27objectes_del_document&amp;diff=17179</id>
		<title>NF2 - Model d'objectes del document</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Model_d%27objectes_del_document&amp;diff=17179"/>
				<updated>2023-03-07T16:12:20Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Document Object Model =&lt;br /&gt;
És un conjunt d'objectes (API) Javascript que permeten interactuar amb el document HTML. Podem realitzar les següents operacions:&lt;br /&gt;
*Canviar i llegir el contingut i la estructura&lt;br /&gt;
*Canviar i llegir estils CSS&lt;br /&gt;
*Gestionar events&lt;br /&gt;
&lt;br /&gt;
Existeixen diversos nivells (versions) de DOM :&lt;br /&gt;
*Nivell 0: Introduït per Netscape i Microsoft a principis dels 90 durant la guerra dels navegadors. Per aixó, no existeix un DOM estàndard.&lt;br /&gt;
*Nivell 1: A partir d'aquí es va fer càrrec del DOM el W3C. Va introduir contingut dinàmic.&lt;br /&gt;
*Nivell 2: &amp;quot;Serialització&amp;quot; de XML (ex: permet guardar documents), events de teclat,...&lt;br /&gt;
&lt;br /&gt;
Els navegadors per poder utilitzar les utilitats de DOM, necessiten transformar la pàgina original. Una pàgina HTML normal no és més que una successió de caràcters, per la qual cosa és un format molt difícil de manipular. Per això, els navegadors web transformen automàticament totes les pàgines web en una estructura més eficient de manipular.&lt;br /&gt;
&lt;br /&gt;
== Arbre DOM ==&lt;br /&gt;
DOM transforma tots els documents XHTML en un conjunt d'elements anomenats nodes, que estan interconnectats i que representen els continguts de les pàgines web i les relacions entre ells. Pel seu aspecte, la unió de tots els nodes es diu &amp;quot;arbre de nodes&amp;quot;.&lt;br /&gt;
[[Fitxer:dom1.png|center]]&lt;br /&gt;
&lt;br /&gt;
L'arrel de l'arbre de nodes de qualsevol pàgina XHTML sempre és la mateixa: un node de tipus especial denominat ''Document''.&lt;br /&gt;
&lt;br /&gt;
A partir d'aquest node arrel, cada etiqueta XHTML es transforma en un node de tipus ''Element''. La conversió d'etiquetes en nodes es realitza de forma jeràrquica. D'aquesta forma, del node arrel solament poden derivar els nodes HEAD i BODY. A partir d'aquesta derivació inicial, cada etiqueta XHTML es transforma en un node que deriva del node corresponent a la seva '''etiqueta pare'''.&lt;br /&gt;
&lt;br /&gt;
La transformació de les etiquetes XHTML habituals genera dos nodes: el primer és el node de tipus ''Element'' (corresponent a la pròpia etiqueta XHTML) i el segon és un node de tipus ''Text'' que conté el text tancat per aquesta etiqueta XHTML.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=iso-8859-1&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;Página sencilla&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Esta página es &amp;lt;strong&amp;gt;muy sencilla&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fitxer:dom2.gif|center]]&lt;br /&gt;
L'especificació completa de DOM defineix 12 tipus de nodes:&lt;br /&gt;
[[Fitxer:dom3.png|center]]&lt;br /&gt;
Encara que les pàgines XHTML habituals es poden manipular manejant solament quatre o cinc tipus de nodes:&lt;br /&gt;
*''Document'', node arrel del que deriven tots els altres nodes de l'arbre.&lt;br /&gt;
*''Element'', representa cadascuna de les etiquetes XHTML. Es tracta de l'únic node que pot contenir atributs i l'únic del que poden derivar altres nodes.&lt;br /&gt;
*''Attr'', es defineix un node d'aquest tipus per representar cadascun dels atributs de les etiquetes XHTML, és a dir, un per cada parell atribut=valor.&lt;br /&gt;
*''Text'', node que conté el text tancat per una etiqueta XHTML.&lt;br /&gt;
*''Comment'', representa els comentaris inclosos a la pàgina XHTML.&lt;br /&gt;
&lt;br /&gt;
Cada node té diverses propietats que reflecteixen el grau parentiu amb els altres. Alguna d'aquestes propietats son les següents:&lt;br /&gt;
*childNodes: array amb els nodes fills.&lt;br /&gt;
*firstChild: primer node fills&lt;br /&gt;
*lastchild: últim node fill&lt;br /&gt;
*parentNode: node pare&lt;br /&gt;
*nextSibling: següent germà (node al mateix nivell i amb el mateix pare)&lt;br /&gt;
*lastSibling: germà anterior.&lt;br /&gt;
Exemple:&lt;br /&gt;
[[Fitxer:dom4.png|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul id=&amp;quot;myList&amp;quot;&amp;gt;&amp;lt;li&amp;gt;Coffee&amp;lt;/li&amp;gt;&amp;lt;li id=&amp;quot;arribaHermano&amp;quot;&amp;gt;Tea&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Mejillones&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var pri = document.getElementById(&amp;quot;myList&amp;quot;).firstChild.innerHTML;&lt;br /&gt;
var ulti = document.getElementById(&amp;quot;myList&amp;quot;).lastChild.innerHTML;&lt;br /&gt;
var x = document.getElementById(&amp;quot;myList&amp;quot;).parentNode.nodeName;&lt;br /&gt;
var Upbrother = document.getElementById(&amp;quot;arribaHermano&amp;quot;).previousSibling.innerHTML;&lt;br /&gt;
var ProHermano = document.getElementById(&amp;quot;arribaHermano&amp;quot;).nextSibling.innerHTML;&lt;br /&gt;
&lt;br /&gt;
var nuevoItem = document.createElement(&amp;quot;LI&amp;quot;);       // Crear un nodo &amp;lt;li&amp;gt;&lt;br /&gt;
var nodoTexto = document.createTextNode(&amp;quot;Nuevo Elemnto&amp;quot;);  // crea un texto de nodo&lt;br /&gt;
nuevoItem.appendChild(nodoTexto);                    // Adjunta el texto a la &amp;lt;li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var list = document.getElementById(&amp;quot;myList&amp;quot;);    // Obtiene el &amp;lt;ul&amp;gt; elemento para insertar un nuevo nodo&lt;br /&gt;
list.insertBefore(nuevoItem, list.childNodes[0]);&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;demo&amp;quot;).innerHTML =&amp;quot;primer Hijo: &amp;quot;+ pri+&amp;quot; Último Hijo: &amp;quot;+ ulti +&amp;quot; Nodo Padre: &amp;quot;+ x +&amp;quot; Hermano Previo: &amp;quot;+ Upbrother + &amp;quot; Próximo Hermano: &amp;quot;+ProHermano;&lt;br /&gt;
        &lt;br /&gt;
       &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''!CUIDADO'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;myList&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Coffee&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li id=&amp;quot;arribaHermano&amp;quot;&amp;gt;Tea&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Mejillones&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var primerHijoEspacio=document.getElementById(&amp;quot;myList&amp;quot;).firstChild; //selecciona primer espacio&lt;br /&gt;
var PrimerElementoCoffe=primerHijoEspacio.nextSibling;  // selecciona el siguiente nodo que corresponde con el elemento.&lt;br /&gt;
var siguienteNodoEspacio=PrimerElementoCoffe.nextSibling; //selecciona el siguiente nodo que es un espacio.&lt;br /&gt;
var SegundoElementoTea=siguienteNodoEspacio.nextElementSibling;  //selecciona el siguiente elemento.&lt;br /&gt;
var TercerElementoMejillones=SegundoElementoTea.nextElementSibling;  //selecciona el siguiente elemento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var TodoHijosEspacioElementos=document.getElementById(&amp;quot;myList&amp;quot;).childNodes; //incluye texto/comentarios y elementos&lt;br /&gt;
var ElementosHijos=document.getElementById(&amp;quot;myList&amp;quot;).children;  //sólo elementos&lt;br /&gt;
&lt;br /&gt;
//let primerElementoHijo=document.getElementById(&amp;quot;myList&amp;quot;).firstElementChild();  //selecciona el primer Nodo que corresponde con un Elemento&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mètodes d'accés als nodes de l'arbre ==&lt;br /&gt;
És important recordar que l'accés als nodes, la seva modificació i la seva eliminació solament és possible quan l'arbre DOM ha estat construït completament, és a dir, després que la pàgina XHTML es carregui per complet.&lt;br /&gt;
A continuació es mostren les diferents formes per aconseguir un node de l'arbre de manera directa, sense haver de recórrer-ho:&lt;br /&gt;
*''getElementsByTagName(nomEtiqueta)'' : obté tots els elements de la pàgina XHTML l'etiqueta de la qual sigui igual que el paràmetre que se li passa a la funció.&lt;br /&gt;
El següent exemple mostra com obtenir tots els paràgrafs d'una pàgina XHTML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	var parrafos = document.getElementsByTagName(&amp;quot;p&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El valor que retorna la funció és un array amb tots els nodes que compleixen la condició que la seva etiqueta coincideix amb el paràmetre proporcionat. El valor retornat és un array de nodes DOM, no un array de cadenes de text o un array d'objectes normals. Per tant, s'ha de processar cada valor del array de la forma que es mostra:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
for(var i=0; i&amp;lt;parrafos.length; i++) {&lt;br /&gt;
  //Obtenim tots els enllaços del cada paràgraf  &lt;br /&gt;
  var enlaces = parrafos[i].getElementsByTagName(&amp;quot;a&amp;quot;);&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*''getElementsByName(&amp;quot;nomElement&amp;quot;)'':En aquest cas es busquen els elements l'atribut dels quals name sigui igual al paràmetre proporcionat. &lt;br /&gt;
En el següent exemple, s'obté directament l'únic paràgraf amb el nom indicat:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var parrafoEspecial = document.getElementsByName(&amp;quot;especial&amp;quot;);&lt;br /&gt;
&amp;lt;p name=&amp;quot;prueba&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p name=&amp;quot;especial&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Normalment l'atribut name és únic per als elements HTML que ho defineixen, per la qual cosa és un mètode molt pràctic per accedir directament al node desitjat. En el cas dels elements HTML '''radiobutton''', l'atribut '''name''' és comú a tots els radiobutton que estan relacionats, per la qual cosa la funció retorna una col·lecció d'elements.&lt;br /&gt;
&lt;br /&gt;
*''getElementById(idelement)'': Retorna l'element XHTML l'atribut del qual coincideix amb el paràmetre indicat en la funció. Com l'atribut ha de ser únic per a cada element d'una mateixa pàgina, la funció retorna únicament el node desitjat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var cabecera = document.getElementById(&amp;quot;cabecera&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div id=&amp;quot;cabecera&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/&amp;quot; id=&amp;quot;logo&amp;quot;&amp;gt;...&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*''getElementsByClassName(&amp;quot;nomclass&amp;quot;)'': retorna una col·lecció de tots els elements en el document amb el nom de classe especificat, com un objecte nodelist. L'objecte nodelist representa una col·lecció de nodes. Els nodes poden ser accedits per nombres d'índex. L'índex comença en 0.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;exemple&amp;quot;&amp;gt;Primer Element amb class=&amp;quot;exemple&amp;quot;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;exemple&amp;quot;&amp;gt;Segon Element amb class=&amp;quot;exemple&amp;quot;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var x = document.getElementsByClassName(&amp;quot;exemple&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*''document.querySelector()'' :Retorna el primer element que compleixi amb el criteri donat. Pot ser invocada sobre el document o sobre algun element. En cas d'usar-se sobre un element, les cerca es limita als fills d'aquest element.&lt;br /&gt;
Si la cerca no troba res, retorna null.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
document.querySelector()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 class=&amp;quot;example&amp;quot;&amp;gt;A heading with class=&amp;quot;example&amp;quot;&amp;lt;/h2&amp;gt;  &amp;lt;!--retorna la primera aparació--&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;example&amp;quot;&amp;gt;A paragraph with class=&amp;quot;example&amp;quot;.&amp;lt;/p&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
document.querySelector(&amp;quot;.example&amp;quot;).style.backgroundColor = &amp;quot;red&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*''document.querySelectorAll()'' Retorna tots els elements que compleixin amb el criteri donat. A l'igual que querySelector pot ser invocada sobre el document o sobre algun element. Sempre retorna 1 nodelist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*Selecciona tots els elements i retorna un NodeList, després per cada iteració afeig un 'border'*/&lt;br /&gt;
var tags = document.querySelectorAll('h1,h2,h3,h4,h5,h6,div,p');&lt;br /&gt;
for (var i = tags.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
  tags[i].style.outline = &amp;quot;1px solid green&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Accedir als atributs d'un node ===&lt;br /&gt;
Els atributs XHTML dels elements de la pàgina es transformen automàticament en propietats dels nodes. Per accedir al seu valor, simplement s'indica el nom de l'atribut XHTML darrere del nom del node.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var enlace = document.getElementById(&amp;quot;enlace&amp;quot;);&lt;br /&gt;
alert(enlace.href); // muestra http://www...com&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace&amp;quot; href=&amp;quot;http://www...com&amp;quot;&amp;gt;Enlace&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per obtenir el valor de qualsevol propietat CSS del node, s'ha d'utilitzar l'atribut style. El següent exemple obté el valor de la propietat margin de la imatge:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var imagen = document.getElementById(&amp;quot;imagen&amp;quot;);&lt;br /&gt;
alert(imagen.style.margin);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;img id=&amp;quot;imagen&amp;quot; style=&amp;quot;margin:0; border:0;&amp;quot; src=&amp;quot;logo.png&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Creació i eliminació nodes de l'arbre ==&lt;br /&gt;
=== Creació de nodes XHTML simples ===&lt;br /&gt;
crear i afegir a la pàgina un nou element XHTML senzill consta de quatre passos diferents:&lt;br /&gt;
&lt;br /&gt;
*Creació d'un node de tipus Element que representi a l'element.&lt;br /&gt;
*Creació d'un node de tipus Text que representi el contingut de l'element.&lt;br /&gt;
*Afegir el node Text com a node fill del node Element.&lt;br /&gt;
*Afegir el node Element a la pàgina, en forma de node fill del node corresponent al lloc en el qual es vol inserir l'element.&lt;br /&gt;
D'aquesta manera, si es vol afegir un paràgraf simple al final d'una pàgina XHTML, és necessari incloure el següent codi Javascript:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Crear nodo de tipo Element&lt;br /&gt;
var parrafo = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
// Crear nodo de tipo Text&lt;br /&gt;
var contenido = document.createTextNode(&amp;quot;Hola Mundo!&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
// Añadir el nodo Text como hijo del nodo Element&lt;br /&gt;
parrafo.appendChild(contenido);&lt;br /&gt;
 &lt;br /&gt;
// Añadir el nodo Element como hijo de la pagina&lt;br /&gt;
document.body.appendChild(parrafo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcions utilitzades per a la creació del node:&lt;br /&gt;
*''createElement(etiqueta)'': Crea un node de tipus '''element''' que representa l'element XHTML.&lt;br /&gt;
*''createTextNode(contingut)'': crea un node de tipus '''text''' que emmagatzema el contingut textual (innerHTML).&lt;br /&gt;
*''nodepare.appendChild(nodefill)'': afegeix el '''nodefill''' com a fill de '''nodepare'''.&lt;br /&gt;
&lt;br /&gt;
=== Eliminació de nodes XHTML ===&lt;br /&gt;
Per eliminar un node és molt senzill, només s'ha d'utilitzar la funció ''removeChild(nodeAeliminar)''.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var parrafo = document.getElementById(&amp;quot;provisional&amp;quot;);&lt;br /&gt;
parrafo.parentNode.removeChild(parrafo);&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p id=&amp;quot;provisional&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per eliminar un node d'una pàgina XHTML s'invoca a la funció removeChild() des del valor parentNode del node que es vol eliminar. Quan s'elimina un node, també s'eliminen automàticament tots els nodes fills que tingui, per la qual cosa no és necessari esborrar manualment cada node fill.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Esdeveniments dinàmics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var btn = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
    var contenido = document.createTextNode(&amp;quot;Hola Mundo!&amp;quot;);&lt;br /&gt;
    btn.appendChild(contenido);&lt;br /&gt;
    btn.addEventListener('click', function(){alert(&amp;quot;hola mundo&amp;quot;);}, false);&lt;br /&gt;
    document.body.appendChild(btn);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opció 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var i = 1;&lt;br /&gt;
document.getElementById('creator').addEventListener('click',function(){&lt;br /&gt;
  var div = document.createElement('div');&lt;br /&gt;
  var text = document.createTextNode('New Div ' + i);&lt;br /&gt;
  div.appendChild(text);&lt;br /&gt;
  document.body.appendChild(div);&lt;br /&gt;
  i++;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener('click',function(e){&lt;br /&gt;
    // Fixed&lt;br /&gt;
    if(e.target.tagName.toLowerCase() === 'div'){&lt;br /&gt;
        console.log(e.target);&lt;br /&gt;
    }&lt;br /&gt;
 })&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  Div actual&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;button id='creator'&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis curs 2022s passats ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Crea un document HTML amb diferents enllaços i paràgrafs i digues:&lt;br /&gt;
*Nombre d'enllaços de la pàgina&lt;br /&gt;
*Direcció a la qual enllaça el penúltim enllaç&lt;br /&gt;
*Nombre d'enllaços del tercer paràgraf&lt;br /&gt;
:[[solucio_enllaços]]&lt;br /&gt;
&lt;br /&gt;
== Exercicis cursos passats ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici Enllaços DOM ===&lt;br /&gt;
Crea un document HTML amb diferents enllaços i paràgrafs i digues:&lt;br /&gt;
*Nombre d'enllaços de la pàgina&lt;br /&gt;
*Direcció a la qual enllaça el penúltim enllaç&lt;br /&gt;
*Nombre d'enllaços del tercer paràgraf&lt;br /&gt;
:[[solucio_enllaços]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici llista ===&lt;br /&gt;
Utilitzar les funcions DOM per crear nous nodes i afegir-los a una llista ordenada existent.&lt;br /&gt;
:[[solucio_llista_dom]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Mostra Direcció ===&lt;br /&gt;
Crea aquesta llista d'enllaços, en passar el ratolí per la llista, mostra la direcció a la qual apunten a l'editor de text (dins un input)&lt;br /&gt;
:[[solucio_mostra_direccio]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Canvi Fons ===&lt;br /&gt;
Crea una pàgina amb tres botons que ens permetin seleccionar la imatge de fons del document.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_boto_fons]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici llista afegir Altre ===&lt;br /&gt;
Realitzar un script que quan premem en l'opció d'uns dels radiobutton (Html, Css, Altre) en el cas de ser l'opció  'Altre' es mostri l'editor de text (input)&lt;br /&gt;
:[[solucio_afegir_altre]]&lt;br /&gt;
&lt;br /&gt;
=== Ejercicio Añadir Diversos Elementos ===&lt;br /&gt;
Se dispondrá de 5 botones:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Crear Párrafo&amp;quot;, &amp;quot;Crear Imagen&amp;quot;, &amp;quot;Borrar último&amp;quot;, &amp;quot;Borrar Primero&amp;quot;, &amp;quot;sustituir primer párrafo por vacio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Para poder Crear un párrafo deberá existir un textArea donde introduciremos un texto que irá añadiéndose cada vez que cliquemos y de color rojo.&lt;br /&gt;
&lt;br /&gt;
El botón crear Imagen nos pedirá un prompt de una url o dirección de una imagen y después su atributo &amp;quot;alt&amp;quot; para darle una descripción.&lt;br /&gt;
&lt;br /&gt;
Borrar último, borrará el último elemento creado.&lt;br /&gt;
&lt;br /&gt;
Borrar primero, borrará el primer elemento creado&lt;br /&gt;
&lt;br /&gt;
El último botón se tratará de sustituir el primer párrafo por otro que tenga como texto &amp;quot;vacio&amp;quot;. (replaceChild)&lt;br /&gt;
&lt;br /&gt;
:[[solucio_Anadir_diversos_elementos]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Web Dinámica ===&lt;br /&gt;
a) Crea un HTML amb els següents camps:&lt;br /&gt;
Input text1 : Que demani la etiqueta que es vol crear&lt;br /&gt;
Input text2 : Que demani On es vol crear (una altre etiqueta que ja hauria d'existir)&lt;br /&gt;
Boto crear: Crea el node del input text1 com a fill de input text2.&lt;br /&gt;
:[[solucio_crea_html]]&lt;br /&gt;
&lt;br /&gt;
b)Creació automática:&lt;br /&gt;
Crea automàticament una Web via DOM que contingui:&lt;br /&gt;
Tants paràgrafs com text trobis a la web http://www.lipsum.com/&lt;br /&gt;
Cada paràgraf ha de tenir un botó per tal de poder-lo eliminar.&lt;br /&gt;
:[[solucio_web_dom]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Botons Celestials ===&lt;br /&gt;
Crea una pàgina web amb dos botons amb el text:&lt;br /&gt;
*Text boto 1: 'Angelet'&lt;br /&gt;
*Text boto 2: 'Diablet'&lt;br /&gt;
El comportament ha de ser el següent:&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Angelet' es creen ''n'' botons més, on ''n'' és un número aleatori entre 1 i 10 i aquests botons poden ser 'Angelets o Diablets'.&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Diablet' s'eliminen ''n'' botons, on ''n'' és un número aleatori entre 1 i 20.&lt;br /&gt;
:[[solucio_botons_celestials]]&lt;br /&gt;
&lt;br /&gt;
== Bibliografia ==&lt;br /&gt;
&lt;br /&gt;
https://www.w3schools.com/jsref/dom_obj_document.asp&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_Esdeveniments_i_Validacio_de_formularis&amp;diff=17139</id>
		<title>NF1 - Esdeveniments i Validacio de formularis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_Esdeveniments_i_Validacio_de_formularis&amp;diff=17139"/>
				<updated>2023-02-28T17:10:20Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* solució */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Esdeveniments =&lt;br /&gt;
Fins ara, totes les aplicacions i scripts que s'han creat tenen alguna cosa en comú: s'executen des de la primera instrucció fins a l'última de forma seqüencial. Gràcies a les estructures de control de flux (if, for, while) és possible modificar lleugerament aquest comportament i repetir alguns trossos del script i saltar-se altres trossos en funció d'algunes condicions.&lt;br /&gt;
&lt;br /&gt;
Aquest tipus d'aplicacions són poc útils, ja que no interactuen amb els usuaris i no poden respondre als diferents esdeveniments que es produeixen durant l'execució d'una aplicació. Afortunadament, les aplicacions web creades amb el llenguatge Javascript poden utilitzar el model de programació basada en esdeveniments.&lt;br /&gt;
&lt;br /&gt;
En aquest tipus de programació, els scripts es dediquen a esperar al fet que l'usuari &amp;quot;faci alguna cosa&amp;quot; (que premi una tecla, que mogui el ratolí, que tanqui la finestra del navegador). A continuació, el script respon a l'acció de l'usuari normalment processant aquesta informació i generant un resultat.&lt;br /&gt;
&lt;br /&gt;
Els esdeveniments fan possible que els usuaris transmetin informació als programes. Javascript defineix nombrosos esdeveniments que permeten una interacció completa entre l'usuari i les pàgines/aplicacions web. La pulsació d'una tecla constitueix un esdeveniment, així com punxar o moure el ratolí, seleccionar un element d'un formulari, redimensionar la finestra del navegador, etc.&lt;br /&gt;
&lt;br /&gt;
Javascript permet assignar una funció a cadascun dels esdeveniments. D'aquesta forma, quan es produeix qualsevol esdeveniment, Javascript executa la seva funció associada. Aquest tipus de funcions es denominen &amp;quot;event handlers&amp;quot; en anglès i solen traduir-se per &amp;quot;manegadors d'esdeveniments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Model bàsic d'esdeveniments ==&lt;br /&gt;
=== Tipus d'esdeveniments ===&lt;br /&gt;
En aquest model, cada element o etiqueta XHTML defineix la seva pròpia llista de possibles esdeveniments que se li poden assignar. Un mateix tipus d'esdeveniment (per exemple, clicar el botó esquerre del ratolí) pot estar definit per a diversos elements XHTML diferents i un mateix element XHTML pot tenir associats varis esdeveniments diferents.&lt;br /&gt;
&lt;br /&gt;
El nom de cada esdeveniment es construeix mitjançant el prefix ''on'', seguit del nom en anglès de l'acció associada a l'esdeveniment. Així, l'esdeveniment de punxar un element amb el ratolí es denomina ''onclick'' i l'esdeveniment associat a l'acció de moure el ratolí es denomina ''onmousemove''.&lt;br /&gt;
&lt;br /&gt;
La següent taula resumeix els esdeveniments més importants definits per Javascript:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Event&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Descripció&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Elements per els que está definit&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onblur&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deseleccionar l'element (el contrari de onfocus)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;button&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;label&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onchange&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Succeeix quan el valor del element ha canviat&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onclick&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;clicar i deixar anar el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;ondblclick&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;clicar dos vegades seguides amb el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onfocus&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Seleccionar un element&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;button&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;label&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeydown&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer una tecla (sense deixar-la anar)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeypress&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer una tecla&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeyup&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deixar anar una tecla premuda&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onload&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;La pàgina s'ha carregat completament&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmousedown&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer (sense deixar anar) un botn del ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmousemove&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Moure el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseout&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;El ratolí &amp;lt;em&amp;gt;&amp;quot;surt&amp;quot;&amp;lt;/em&amp;gt; de l'element (passa sobre un altre element)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseover&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;El ratoli &amp;lt;em&amp;gt;&amp;quot;entra&amp;quot;&amp;lt;/em&amp;gt; dintre de l'elemento (passa per sobre de l'element)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseup&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deixar anar el botó que estava premut en el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onreset&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Inicialitzar el formulari (esborrar totes les dades)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;form&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onresize&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;S'ha modificat la mida de la finestra del navegador&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onselect&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Seleccionar un text&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onsubmit&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Enviar el formulari&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;form&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onunload&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;S'abandona la pàgina (per exemple al tancar el navegador)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu veure tots el esdeveniments [[http://www.w3schools.com/jsref/dom_obj_event.asp aquí]]&lt;br /&gt;
&lt;br /&gt;
===Gestor  d'esdeveniments===&lt;br /&gt;
&lt;br /&gt;
Un esdeveniment de Javascript per si mateix manca d'utilitat. Perquè els esdeveniments resultin útils, s'han d'associar funcions o codi Javascript a cada esdeveniment. D'aquesta forma, quan es produeix un esdeveniment s'executa el codi indicat, per la qual cosa l'aplicació pot respondre davant qualsevol esdeveniment que es produeixi durant la seva execució.&lt;br /&gt;
&lt;br /&gt;
Les funcions o codi Javascript que es defineixen per a cada esdeveniment es denominen &amp;quot;manegador d'esdeveniments&amp;quot; i com Javascript és un llenguatge molt flexible, existeixen diverses formes diferents d'indicar els manegadors:&lt;br /&gt;
&lt;br /&gt;
*Manejadores com a atributs dels elements XHTML.&lt;br /&gt;
*Manejadores com a funcions Javascript externes.&lt;br /&gt;
*Manejadores &amp;quot;semàntics&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments com a atributs XHTML ====&lt;br /&gt;
&lt;br /&gt;
Es tracta del mètode més senzill i alhora menys professional d'indicar el codi Javascript que s'ha d'executar quan es produeixi un esdeveniment. En aquest cas, el codi s'inclou en un atribut del propi element XHTML. En el següent exemple, es vol mostrar un missatge quan l'usuari cliqui amb el ratolí sobre un botó:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquest mètode, es defineixen atributs XHTML amb el mateix nom que els esdeveniments que es volen manejar. L'exemple anterior només vol controlar l'esdeveniment de clicar amb el ratolí, el nom del qual és onclick. Així, l'element XHTML pel qual es vol definir aquest esdeveniment, ha d'incloure un atribut anomenat onclick.&lt;br /&gt;
&lt;br /&gt;
El contingut de l'atribut és una cadena de text que conté totes les instruccions Javascript que s'executen quan es produeix l'esdeveniment. En aquest cas, el codi Javascript és molt senzill (alert('Gràcies per clicar');), ja que solament es tracta de mostrar un missatge.&lt;br /&gt;
&lt;br /&gt;
En aquest altre exemple, quan l'usuari punxa sobre l'element &amp;lt;div&amp;gt; es mostra un missatge i quan l'usuari passa el ratolí per sobre de l'element, es mostra un altre missatge:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div onclick=&amp;quot;alert('Has clicat amb el ratolí');&amp;quot; onmouseover=&amp;quot;alert('Acabes de passar el ratolí per damunt');&amp;quot;&amp;gt;Ratolí&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pots clicar sobre aquest element o simplement passar el ratolí per damunt.&lt;br /&gt;
Aquest altre exemple inclou una de les instruccions més utilitzades en les aplicacions Javascript més antigues:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body onload=&amp;quot;alert(&amp;quot;La pàgina s'ha carregat completament &amp;quot;);&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior es mostra després que la pàgina s'hagi carregat completament, és a dir, després que s'hagi descarregat el seu codi HTML, les seves imatges i qualsevol altre objecte inclòs a la pàgina.&lt;br /&gt;
&lt;br /&gt;
L'esdeveniment onload és un dels més utilitzats ja que, com veurem en el capítol de DOM, les funcions que permeten accedir i manipular els nodes de l'arbre DOM solament estan disponibles quan la pàgina s'ha carregat completament.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments i variable this ====&lt;br /&gt;
&lt;br /&gt;
En els esdeveniments, es pot utilitzar la variable '''this''' per referir-se a l'element XHTML que ha provocat l'esdeveniment. Aquesta variable és molt útil per a exemples com el següent:&lt;br /&gt;
&lt;br /&gt;
Quan l'usuari passa el ratolí per sobre de el &amp;lt;div&amp;gt;, el color de la vora es mostra de color negre. Quan el ratolí surt de el &amp;lt;div&amp;gt;, es torna a mostrar la vora amb el color gris clar original.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Element &amp;lt;div&amp;gt; original:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si no s'utilitza la variable this, el codi necessari per modificar el color de les vores, seria el següent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;document.getElementById('continguts').style.borderColor='black';&amp;quot; onmouseout=&amp;quot;document.getElementById('continguts').style.borderColor='silver';&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codi anterior és massa llarg i massa propens a cometre errors. Dins del codi d'un esdeveniment, Javascript crea automàticament la variable this, que fa referència a l'element XHTML que ha provocat l'esdeveniment. Així, l'exemple anterior es pot reescriure de la següent manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;this.style.borderColor='black';&amp;quot; onmouseout=&amp;quot;this.style.borderColor='silver';&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codi anterior és molt més compacte, més fàcil de llegir i d'escriure i segueix funcionant correctament encara que es modifiqui el valor de l'atribut ''id'' de el &amp;lt; div &amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments com a funcions externes ====&lt;br /&gt;
&lt;br /&gt;
La definició dels manegadores d'esdeveniments en els atributs XHTML és el mètode més senzill però menys aconsellable de tractar amb els esdeveniments en Javascript. El principal inconvenient és que es complica a l'excés quan s'afegeixen algunes poques instruccions, per la qual cosa solament és recomanable per als casos més senzills.&lt;br /&gt;
&lt;br /&gt;
Si es realitzen aplicacions complexes, com per exemple la validació d'un formulari, és aconsellable agrupar tot el codi Javascript en una funció externa i cridar a aquesta funció des de l'element XHTML.&lt;br /&gt;
&lt;br /&gt;
Seguint amb l'exemple anterior que mostra un missatge en clicar sobre un botó:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilitzant funcions externes es pot transformar en:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function mostraMissatge() {&lt;br /&gt;
  alert('Gràcies per clicar');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;mostraMissatge()&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquesta tècnica consisteix a extreure totes les instruccions de Javascript i agrupar-les en una funció externa. Una vegada definida la funció, en l'atribut de l'element XHTML s'inclou el nom de la funció, per indicar que és la funció que s'executa quan es produeix l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
La crida a la funció es realitza de la forma habitual, indicant el seu nom seguit dels parèntesis i de forma opcional, incloent tots els arguments i paràmetres que es necessitin.&lt;br /&gt;
&lt;br /&gt;
El principal inconvenient d'aquest mètode és que en les funcions externes no es pot seguir utilitzant la variable '''this''' i per tant, és necessari passar aquesta variable com a paràmetre a la funció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ressalta(element) {&lt;br /&gt;
	switch(element.style.borderColor) {&lt;br /&gt;
		case 'silver':&lt;br /&gt;
		case 'silver silver silver silver':&lt;br /&gt;
		case '#c0c0c0':&lt;br /&gt;
			element.style.borderColor = 'black';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'black':&lt;br /&gt;
		case 'black black black black':&lt;br /&gt;
		case '#000000':&lt;br /&gt;
			element.style.borderColor = 'silver';&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;ressalta(this)&amp;quot; onmouseout=&amp;quot;ressalta(this)&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En l'exemple anterior, la funció externa és cridada amb el paràmetre ''this'', que dins de la funció es denomina element. La complexitat de l'exemple es produeix sobretot per la forma en la qual els diferents navegadors emmagatzemen el valor de la propietat *&lt;br /&gt;
''borderColor''.&lt;br /&gt;
&lt;br /&gt;
Mentre que Firefox emmagatzema (en cas que les quatre vores coincideixin en color) el valor ''black'', Internet Explorer ho emmagatzema com ''black black black black'' i Opera emmagatzema la seva representació hexadecimal ''#000000''.&lt;br /&gt;
&lt;br /&gt;
====Gestor d'esdeveniments semàntics====&lt;br /&gt;
Els mètodes que s'han vist per afegir manejadores d'esdeveniments (com a atributs XHTML i com a funcions externes) tenen un greu inconvenient: &amp;quot;embruten&amp;quot; el codi XHTML de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Com és conegut, una de les bones pràctiques bàsiques en el disseny de pàgines i aplicacions web és la separació dels continguts (XHTML) i el seu aspecte o presentació (CSS). Sempre que sigui possible, també es recomana separar els continguts (XHTML) i el seu comportament o programació (Javascript).&lt;br /&gt;
&lt;br /&gt;
Barrejar el codi Javascript amb els elements XHTML solament contribueix a complicar el codi font de la pàgina, a dificultar la modificació i manteniment de la pàgina i a reduir la semàntica del document final produït.&lt;br /&gt;
&lt;br /&gt;
Afortunadament, existeix un mètode alternatiu per definir els manegadores d'esdeveniments de Javascript. Aquesta tècnica és una evolució del mètode de les funcions externes, ja que es basa a utilitzar les propietats DOM dels elements XHTML per assignar totes les funcions externes que actuen de manejadores d'esdeveniments. Així, el següent exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;clica&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Es pot transformar en:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Funció externa&lt;br /&gt;
function mostraMissatge() {&lt;br /&gt;
alert('Gràcies per clicar');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Assignar la funció externa a l'element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&lt;br /&gt;
// Element XHTML&lt;br /&gt;
&amp;lt;input id=&amp;quot;clica&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tècnica dels manegadores semàntics consisteix en:&lt;br /&gt;
&lt;br /&gt;
*Assignar un identificador únic a l'element XHTML mitjançant l'atribut ''id''.&lt;br /&gt;
*Crear una funció de Javascript encarregada de manejar l'esdeveniment.&lt;br /&gt;
*Assignar la funció externa a l'esdeveniment corresponent en l'element desitjat.&lt;br /&gt;
*L'últim pas és la clau d'aquesta tècnica. En primer lloc, s'obté l'element al que es desitja associar la funció externa:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A continuació, s'utilitza una propietat de l'element amb el mateix nom que l'esdeveniment que es vol manejar. En aquest cas, la propietat és ''onclick'':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'assigna la funció externa mitjançant el seu nom sense parèntesi. El més important (i la causa més comuna d'errors) és indicar solament el nom de la funció, és a dir, prescindir dels parèntesis en assignar la funció:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'afegeixen els parèntesis després del nom de la funció, en realitat s'està executant la funció i guardant el valor retornat per la funció en la propietat onclick d'element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Assignar una funció externa a un esdeveniment d'un element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&lt;br /&gt;
// Executar una funció i guardar el seu resultat en una propietat d'un element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El gran avantatge d'aquest mètode és que el codi XHTML resultant és molt &amp;quot;net&amp;quot;, ja que no es barreja amb el codi Javascript. A més, dins de les funcions externes assignades sí que es pot utilitzar la variable '''this''' per referir-se a l'element que provoca l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
L'únic inconvenient d'aquest mètode és que la pàgina s'ha de carregar completament abans que es puguin utilitzar les funcions DOM que assignen els manegadors als elements XHTML. Una de les formes més senzilles d'assegurar que cert codi es va a executar després que la pàgina es carregui per complet és utilitzar l'esdeveniment '''onload''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = muestraMensaje;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gestor d'esdeveniments amb DOM====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El mètode addEventListener ens permet incloure un gestor d'esdeveniment. La sintaxi de addEventListener és la següent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
element_que_escolta.addEventListener('event',funció_a_llançar, booleà);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''element_que_escolta'' - és qualsevol element present en un document al qual es vol associar l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
''esdeveniment'' - és el succés ocorregut sobre l'element (clic, load, ...).&lt;br /&gt;
&lt;br /&gt;
''funció_a_llançar'' - és qualsevol funció definida que vulguem que s'executi quan passi l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
''booleà'' - és un valor que defineix l'ordre del flux d'esdeveniments.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si es vol escoltar un esdeveniment només una vegada i després eliminar-ho s'ha d'utilitzar el mètode removeEventListener:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
element_que_escolta.removeEventListener ('esdeveniment',funció_a_llançar, booleà);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTA 1:'' Explicació del paràmetre booleà del mètode addEventListener amb un exemple.&lt;br /&gt;
Suposem que tenim això:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Exemple de fluix events&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;Clica aqui&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quan fem clic al div no només ho estem fent sobre ell, sinó sobre els elements que el contenen en l'arbre del DOM, és a dir, hem fet clic a més sobre l'element html i sobre l'element body. Sí només hi ha una funció assignada a una escolta per al div no hi ha major problema, però si a més hi ha una per al html i una altra per al body, quin és l'ordre en què s'han de llançar les tres funcions?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per contestar a aquesta pregunta hi ha un model de comportament, el flux d'esdeveniments (anglès). Segons aquest, quan es fa clic sobre un element, l'esdeveniment es propaga en dues fases, una que és la captura -el esdeveniment comença en el nivell superior del document i recorre els elements de pares a fills- i l'altra la bombolla -el ordre invers, ascendint de fills a pares-.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un cop vist això, podem comprendre el tercer paràmetre de addEventListener, que el que fa és permetre'ns escollir l'ordre de propagació:&lt;br /&gt;
&lt;br /&gt;
'''true''': El flux d'esdeveniments és com el representat, i la fase de captura passa en llançar l'esdeveniment. L'ordre de propagació per l'exemple seria, per tant, l'indicat, ''html-body-div.''&lt;br /&gt;
&lt;br /&gt;
'''false''': Permet saltar la fase de captura, i la propagació seguiria només la bombolla. Així, l'ordre seria ''div-body-html.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTA 2:'' A internet explorer no funciona en les versions anteriors a la 7 (inclosa).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        function alerta(){&lt;br /&gt;
            alert(this);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        window.onload = function (){&lt;br /&gt;
            var elBody = document.getElementsByTagName('body')[0];&lt;br /&gt;
            var elDiv = document.getElementById('elDiv');&lt;br /&gt;
            var elButton = document.getElementById('elButton');&lt;br /&gt;
         &lt;br /&gt;
            elBody.addEventListener('click',alerta,false);&lt;br /&gt;
            elDiv.addEventListener('click',alerta,false);&lt;br /&gt;
            elButton.addEventListener('click',alerta,false);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//event.stopPropagation();   //evita propagarse el evento en forma de burbuja&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body id=&amp;quot;body&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;elDiv&amp;quot;&amp;gt;Clica aqui&lt;br /&gt;
          &amp;lt;button id=&amp;quot;elButton&amp;quot;&amp;gt;boton&amp;lt;/button&amp;gt;&lt;br /&gt;
     &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemple d'utilització manejadores d'esdeveniments amb DOM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function muestraMensaje() {&lt;br /&gt;
  				console.log(&amp;quot;Has pulsado el ratón&amp;quot;);&lt;br /&gt;
  				elDiv.removeEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);  // borra el evento asociado de tipo click a ese elemento.&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			var elDiv = document.getElementById(&amp;quot;div_principal&amp;quot;);&lt;br /&gt;
			elDiv.addEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
En el caso que no queramos que se aplique el evento de tipo de Submit o Hipervínculo &amp;quot;&amp;lt;a&amp;gt;&amp;lt;/a&amp;gt;&amp;quot; al ser botón usaremos &amp;quot;e.preventDefault()&amp;quot; y realizará las acciones que tengamos establecidas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
window.addEventListener(&amp;quot;load&amp;quot;,ejemplo); // window.onload= ejemplo;&lt;br /&gt;
&lt;br /&gt;
	function ejemplo(){&lt;br /&gt;
			function muestraMensaje(e) {&lt;br /&gt;
  				console.log(&amp;quot;Has pulsado el ratón&amp;quot;);&lt;br /&gt;
                                e.preventDefault();  //evita que se ejecute el submit y recargue la página&lt;br /&gt;
			}&lt;br /&gt;
         document.getElementById(&amp;quot;boton&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);&lt;br /&gt;
	}      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;./index.html&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;input type=&amp;quot;submit&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;boton&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En el següent exemple, s'afegeixen esdeveniments als elements de tipus ''input=text'' d'un formulari complex:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form id=&amp;quot;formulario&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;holaa&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    function resalta() {&lt;br /&gt;
        console.log(&amp;quot;holaa&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    window.onload = function() {&lt;br /&gt;
        var formulario = document.getElementById(&amp;quot;formulario&amp;quot;);&lt;br /&gt;
        var camposInput = formulario.getElementsByTagName(&amp;quot;input&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        for(var i=0; i&amp;lt;camposInput.length; i++) {&lt;br /&gt;
            if(camposInput[i].type == &amp;quot;text&amp;quot;) {&lt;br /&gt;
                camposInput[i].onclick = resalta;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Alert ===&lt;br /&gt;
Volem provar els events de la pàgina, per fer-ho posa un alert amb un missatge en els següents casos:&lt;br /&gt;
* Al carregar-se completament la pàgina.&lt;br /&gt;
* Al clicar en un botó&lt;br /&gt;
* Al passar damunt d'un paràgraf&lt;br /&gt;
* Al passar damunt d'una imatge&lt;br /&gt;
* Al sortir del damunt d'una imatge&lt;br /&gt;
* Al clicar en un enllaç&lt;br /&gt;
&lt;br /&gt;
:[[Exercici1 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Desplegable ===&lt;br /&gt;
Es vol disposar de un menu desplegable on cada element del desplegable sigui el nom de la pàgina a la cual fa referència. Quan es seleccioni una entrada del desplegable, el navegador canvia la seva url per la del desplegable.&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 2 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Rollover ===&lt;br /&gt;
Un intercanvi d'imatge és una cosa grandiosa. L'usuari aproxima el punter del ratolí a una imatge i aquesta canvia a una altre imatge. Quan l'usuari abandona la imatge, torna a canviar a la imatge anterior. &lt;br /&gt;
Fes un programa amb javascript que reprodueixi el comportament anterior.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 3 Events]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Mostrar / Ocultar text ===&lt;br /&gt;
Donada la següent pàgina&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	function muestraOculta() {&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_1&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_1&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_2&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_2&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_3&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_3&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Realitza els següents apartats:&lt;br /&gt;
*Quan es cliqui sobre el primer enllaç, s'oculti la seva secció relacionada&lt;br /&gt;
*Quan es torni a clicar sobre el mateix enllaç, es mostri una altra vegada aquesta secció de continguts&lt;br /&gt;
*Completar la resta d'enllaços de la pàgina perquè el seu comportament sigui idèntic al del primer enllaç&lt;br /&gt;
*Quan una secció s'oculti, ha de canviar el missatge de l'enllaç associat (pista: propietat innerHTML)&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 4 Events]]&lt;br /&gt;
&lt;br /&gt;
== Obtenint informació de l'esdeveniment (objecte event)==&lt;br /&gt;
Normalment, els manegadors d'esdeveniments requereixen informació addicional per processar les seves tasques. Si una funció per exemple s'encarrega de processar l'esdeveniment onclick, potser necessiti saber que posició estava el ratolí en el moment de punxar el botó.&lt;br /&gt;
&lt;br /&gt;
No obstant això, el cas més habitual en el qual és necessari conèixer informació addicional sobre l'esdeveniment és el dels esdeveniments associats al teclat. Normalment, és molt important conèixer la tecla que s'ha premut, per exemple per diferenciar les tecles normals de les tecles especials (ENTER, tabulador, Alt, Ctrl., etc.).&lt;br /&gt;
&lt;br /&gt;
Javascript permet obtenir informació sobre el ratolí i el teclat mitjançant un objecte especial anomenat ''event''. Desafortunadament, els diferents navegadors presenten diferències molt notables en el tractament de la informació sobre els esdeveniments.&lt;br /&gt;
&lt;br /&gt;
La principal diferència resideix en la forma en la qual s'obté l'objecte event. Internet Explorer considera que aquest objecte forma part de l'objecte window i la resta de navegadors ho consideren com l'únic argument que tenen les funcions manejadoras d'esdeveniments.&lt;br /&gt;
&lt;br /&gt;
Encara que és un comportament que resulta molt estrany al principi, tots els navegadors moderns excepte Internet Explorer creen màgicament i de forma automàtica un argument que es passa a la funció manegadora, per la qual cosa no és necessari incloure-ho en la trucada a la funció manegadora. D'aquesta forma, per utilitzar aquest &amp;quot;argument màgic&amp;quot;, només és necessari assignar-li un nom, ja que els navegadors ho creen automàticament.&lt;br /&gt;
&lt;br /&gt;
En resum, en els navegadors tipus Internet Explorer, l'objecte event s'obté directament mitjançant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var esdeveniment = window.event;&lt;br /&gt;
D'altra banda, en la resta de navegadors, l'objecte event s'obté màgicament a partir de l'argument que el navegador crea automàticament:&lt;br /&gt;
&lt;br /&gt;
function manejadorEventos(elEvento) {&lt;br /&gt;
var esdeveniment = elEvento;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si es vol programar una aplicació que funcioni correctament en tots els navegadors, és necessari obtenir l'objecte event de forma correcta segons cada navegador. El següent codi mostra la forma correcta d'obtenir l'objecte event en qualsevol navegador:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function manejadorEventos(elEvento) {&lt;br /&gt;
var esdeveniment = elEvento || window.event;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una vegada obtingut l'objecte event, ja es pot accedir a tota la informació relacionada amb l'esdeveniment, que depèn del tipus d'esdeveniment produït.&lt;br /&gt;
&lt;br /&gt;
=== Informació sobre l'esdeveniment ===&lt;br /&gt;
La propietat '''type''' indica el tipus d'esdeveniment produït, la qual cosa és útil quan una mateixa funció s'utilitza per manejar diversos esdeveniments:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var tipus = esdeveniment.type;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La propietat type retorna el tipus d'esdeveniment produït, que és igual al nom de l'esdeveniment però sense el prefix '''on'''.&lt;br /&gt;
&lt;br /&gt;
Mitjançant aquesta propietat, es pot refer de forma més senzilla l'exemple anterior en el qual es ressaltava una secció de continguts en passar el ratolí per damunt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ressalta(elEvento) {&lt;br /&gt;
    var esdeveniment = elEvento || window.event;&lt;br /&gt;
    switch(esdeveniment.type) {&lt;br /&gt;
         case 'mouseover':&lt;br /&gt;
               this.style.borderColor = 'black';&lt;br /&gt;
               break;&lt;br /&gt;
         case 'mouseout':&lt;br /&gt;
               this.style.borderColor = 'silver';&lt;br /&gt;
               break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
       document.getElementById(&amp;quot;seccion&amp;quot;).onmouseover = ressalta;&lt;br /&gt;
       document.getElementById(&amp;quot;seccion&amp;quot;).onmouseout = ressalta;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;div id=&amp;quot;seccion&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot;&amp;gt;&lt;br /&gt;
  Secció de continguts...&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Informació sobre els esdeveniments de teclat ===&lt;br /&gt;
De tots els esdeveniments disponibles en Javascript, els esdeveniments relacionats amb el teclat són els més incompatibles entre diferents navegadors i per tant, els més difícils de manegar. En primer lloc, existeixen moltes diferències entre els navegadors, els teclats i els sistemes operatius dels usuaris, principalment a causa de les diferències entre idiomes.&lt;br /&gt;
&lt;br /&gt;
A més, existeixen tres esdeveniments diferents per a les pulsacions de les tecles ('''onkeyup''', '''onkeypress''' i '''onkeydown'''). Finalment, existeixen dos tipus de tecles: les tecles normals (com a lletres, nombres i símbols normals) i les tecles especials (com ENTER, Alt, Shift, etc.)&lt;br /&gt;
&lt;br /&gt;
Quan un usuari prem una tecla normal, es produeixen tres esdeveniments seguits i en aquest ordre: &lt;br /&gt;
*'''onkeydown''', &lt;br /&gt;
*'''onkeypress''' i &lt;br /&gt;
*'''onkeyup'''. &lt;br /&gt;
L'esdeveniment '''onkeydown''' es correspon amb el fet de prémer una tecla i no deixar-la anar; l'esdeveniment '''onkeypress''' és la pròpia pulsació de la tecla i l'esdeveniment '''onkeyup''' fa referència al fet de deixar anar una tecla que estava premuda.&lt;br /&gt;
&lt;br /&gt;
La forma més senzilla d'obtenir la informació sobre la tecla que s'ha premut és mitjançant l'esdeveniment '''onkeypress'''. La informació que proporcionen els esdeveniments '''onkeydown''' i '''onkeyup''' es pot considerar com més tècnica, ja que retornen el ''codi intern'' de cada tecla i no el caràcter que s'ha premut.&lt;br /&gt;
&lt;br /&gt;
A continuació s'inclou una llista amb totes les propietats diferents de tots els esdeveniments de teclat tant en Internet Explorer com en la resta de navegadors:&lt;br /&gt;
&lt;br /&gt;
*Esdeveniment keydown:&lt;br /&gt;
**Mateix comportament en tots els navegadors:&lt;br /&gt;
***Propietat keyCode: codi intern de la tecla&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
*Esdeveniment keypress:&lt;br /&gt;
**Internet Explorer:&lt;br /&gt;
***Propietat keyCode: el codi del caràcter de la tecla que s'ha premut&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
**Resta de navegadors:&lt;br /&gt;
**Propietat keyCode: per a les tecles normals, no definit. Per a les tecles especials, el codi intern de la tecla.&lt;br /&gt;
**Propietat charCode: per a les tecles normals, el codi del caràcter de la tecla que s'ha premut. Per a les tecles especials, 0.&lt;br /&gt;
*Esdeveniment keyup:&lt;br /&gt;
**Mateix comportament en tots els navegadors:&lt;br /&gt;
***Propietat keyCode: codi intern de la tecla&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
Per convertir el codi d'un caràcter (no confondre amb el codi intern) al caràcter que representa la tecla que s'ha premut, s'utilitza la funció ''String.fromCharCode().''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    window.onkeydown = teclado;&lt;br /&gt;
    window.onkeypress = teclado;&lt;br /&gt;
    window.onkeyup = teclado;&lt;br /&gt;
&lt;br /&gt;
    function teclado(magica) {&lt;br /&gt;
        var e = magica || window.event; // para salvar las deficiencias de IE=window.event&lt;br /&gt;
        mostrar(e.type, e.keyCode, e.which, e.charCode, e.key);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function mostrar(evento, keyCode, which, charCode, key) {&lt;br /&gt;
      &lt;br /&gt;
        let cadena =  &amp;quot;&amp;lt;b&amp;gt; Evento: &amp;lt;/b&amp;gt;&amp;quot; + evento &lt;br /&gt;
                     + &amp;quot; ==&amp;gt; &amp;lt;b&amp;gt; keyCode: &amp;lt;/b&amp;gt;&amp;quot; + keyCode &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; which: &amp;lt;/b&amp;gt;&amp;quot; + which &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; charCode: &amp;lt;/b&amp;gt;&amp;quot;+ charCode &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; key: &amp;lt;/b&amp;gt;&amp;quot;+ key &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; FromCharCode: &amp;lt;/b&amp;gt;&amp;quot;+String.fromCharCode(charCode)+&amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         let info = document.getElementById(&amp;quot;info&amp;quot;); //display&lt;br /&gt;
         info.innerHTML += cadena&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;info&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://sospedia.net/pinchar-el-teclado-en-javascript/&lt;br /&gt;
&lt;br /&gt;
https://www.w3.org/2002/09/tests/keys-cancel2.html&lt;br /&gt;
&lt;br /&gt;
==== Exercici Teclat ====&lt;br /&gt;
Crea un script que mostri per pantalla la següent informació cada vedada que es premi una tecla:&lt;br /&gt;
* Caràcter permut  (amb key i StringCharCode)&lt;br /&gt;
* Tipus event (keydown, keypress, keyup)&lt;br /&gt;
* Propietat keycode&lt;br /&gt;
* Propietat charcode&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 5 events]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== informació sobre els esdeveniments de ratolí ===&lt;br /&gt;
La informació més rellevant sobre els esdeveniments relacionats amb el ratolí és la de les coordenades de la posició del punter del ratolí. Encara que l'origen de les coordenades sempre es troba en la cantonada superior esquerra, el punt que es pren com a referència de les coordenades pot variar.&lt;br /&gt;
&lt;br /&gt;
D'aquesta forma, és possible obtenir la posició del ratolí respecte de la pantalla de l'ordinador, respecte de la finestra del navegador i respecte de la pròpia pàgina HTML (que s'utilitza quan l'usuari ha fet scroll sobre la pàgina). Les coordenades més senzilles són les que es refereixen a la posició del punter respecte de la finestra del navegador, que s'obtenen mitjançant les propietats clientX i clientY:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function muestraInformacion(elEvento) {&lt;br /&gt;
   var esdeveniment = elEvento || window.event;&lt;br /&gt;
   var coordenadaX = esdeveniment.clientX;&lt;br /&gt;
   var coordenadaY = esdeveniment.clientY;&lt;br /&gt;
   alert(&amp;quot;Has premut el ratolí en la posició: &amp;quot; + coordenadaX + &amp;quot;, &amp;quot; + coordenadaY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.onclick = muestraInformacion;&lt;br /&gt;
//document.addeventlistener(click,&amp;quot;muestraInformacion&amp;quot;,false);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les coordenades de la posició del punter del ratolí respecte de la pantalla completa de l'ordinador de l'usuari s'obtenen de la mateixa forma, mitjançant les propietats '''screenX''' i '''screenY''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var coordenadaX = esdeveniment.screenX;&lt;br /&gt;
var coordenadaY = esdeveniment.screenY;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En moltes ocasions, és necessari obtenir un altre parell de coordenades diferents: les que corresponen a la posició del ratolí respecte de l'origen de la pàgina. Aquestes coordenades no sempre coincideixen amb les coordenades respecte de l'origen de la finestra del navegador, ja que l'usuari pot fer scroll sobre la pàgina web. Internet Explorer no proporciona aquestes coordenades de forma directa, mentre que la resta de navegadors sí que ho fan. D'aquesta forma, és necessari detectar si el navegador és de tipus Internet Explorer i en cas afirmatiu realitzar un càlcul senzill:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Detectar si el navegador és Internet Explorer&lt;br /&gt;
var ie = navigator.userAgent.toLowerCase().indexOf('msie')!=-1;&lt;br /&gt;
&lt;br /&gt;
if(ie) {&lt;br /&gt;
     coordenadaX = esdeveniment.clientX + document.body.scrollLeft;&lt;br /&gt;
     coordenadaY = esdeveniment.clientY + document.body.scrollTop;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
     coordenadaX = esdeveniment.pageX;&lt;br /&gt;
     coordenadaY = esdeveniment.pageY;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;Has premut el ratolí en la posició: &amp;quot; + coordenadaX + &amp;quot;, &amp;quot; + coordenadaY + &amp;quot; respecte de la pàgina web&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La variable '''ie''' val '''true''' si el navegador en el qual s'executa el script és de tipus Internet Explorer (qualsevol versió) i val '''false''' en un altre cas. Per a la resta de navegadors, les coordenades respecte de l'origen de la pàgina s'obtenen mitjançant les propietats '''pageX''' i '''pageY'''. En el cas d'Internet Explorer, s'obtenen sumant la posició respecte de la finestra del navegador (clientX, clientY) i el desplaçament que ha sofert la pàgina (document.bodi.scrollLeft, document.bodi.scrollTop).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Client_page_screen.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gràfics senzills amb canvas ===&lt;br /&gt;
Amb els esdeveniments de teclat i ratolí podrem programar jocs senzills. Només ens caldrà saber com situar i moure gràfics per la pantalla. Amb aquesta finalitat ens serà d'ajuda l'ús de l'element '''canvas''' de HTML.&lt;br /&gt;
&lt;br /&gt;
Al següent exemple definim un canvas (llenç) de 800x600 píxels i hi situem la imatge d'un cotxe a la coordenada (400,300). &lt;br /&gt;
&amp;lt;source lang=&amp;quot;HTML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;canvas id=&amp;quot;myCanvas&amp;quot; width=&amp;quot;800&amp;quot; height=&amp;quot;600&amp;quot; style=&amp;quot;background-color: lightskyblue;&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img id=&amp;quot;cotxe&amp;quot; src=&amp;quot;cotxe.jpg&amp;quot; style=&amp;quot;display: none;&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var canvas;&lt;br /&gt;
var ctx;&lt;br /&gt;
var imatge;&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
         canvas= document.getElementById(&amp;quot;myCanvas&amp;quot;);&lt;br /&gt;
         ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
         imatge=document.getElementById(&amp;quot;cotxe&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ctx.drawImage(imatge,400,300);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si volem simular el moviment de la imatge haurem l'haurem d'esborrar de la posició antiga i tornar-la a dibuixar a la nova posició. Per borrar la imatge podem dibuixar un rectangle del color de fons del canvas sobre la imatge amb les instruccions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
ctx.fillStyle = &amp;quot;lightskyblue&amp;quot;&lt;br /&gt;
ctx.fillRect(0,300,100,66);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'exemple dibuixem al canvas un triangle de color lightskyblue a la coordenada (0,300) i de dimensions 100x66.&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Coordenades del punter ===&lt;br /&gt;
Crea una pàgina on es mostri constantment les coordenades del punter dins de la pàgina (propietats clientX, clientY).&lt;br /&gt;
&lt;br /&gt;
=== event MOUSEOVER ===&lt;br /&gt;
Crea una pàgina de contingut lliure que tingui els següents elements:&lt;br /&gt;
*Títol (capçalera H1)&lt;br /&gt;
*Tres paràgrafs que continguin una imatge alineada a la dreta o a l'esquerra del text. La longitud del text de cada paràgraf serà prou extensa per a superar l'alçada de la imatge respectiva.&lt;br /&gt;
*Tres títols (capçalera H2) que precediran cadascun dels paràgrafs.&lt;br /&gt;
Programa les respostes als events MOUSEOVER de cada element de forma que:&lt;br /&gt;
*tots els elements de text (quatre capçaleres i tres paràgrafs) canviin de format quan tenen el punter del ratolí al damunt. Cada element de text tornarà al seu format original quan el punter ja no sigui al damunt&lt;br /&gt;
*les imatges giraran en sentit horari quan tinguin el punter al damunt i deixaran de fer-ho quan el punter ja no sigui al damunt.&lt;br /&gt;
&lt;br /&gt;
=== Ordre dels events ===&lt;br /&gt;
Crea una pàgina amb quatre seccions DIV aniuades i etiquetades amb els noms div1, ... , div4:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;div1&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div2&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div3&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div4&amp;quot;&amp;gt;contingut random...&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Crea funcions de resposta a l'event CLICK per a cada element DIV que escrigui un missatge de l'estil &amp;quot;Has clickat sobre l'element div1&amp;quot;.&lt;br /&gt;
Com aconseguiries que l'ordre en què es disparen els elements siguin els següents?:&lt;br /&gt;
*div1,div2,div3,div4&lt;br /&gt;
*div4,div3,div2,div1&lt;br /&gt;
*div1,div3,div4,div2&lt;br /&gt;
&lt;br /&gt;
=== Event document.onload ===&lt;br /&gt;
Crea una pàgina on sigui imprescindible assignar les funcions de resposta a events quan es dispara l'event document.onload.&lt;br /&gt;
&lt;br /&gt;
=== Estrella Michelin ===&lt;br /&gt;
&lt;br /&gt;
Un restaurant té 4 tapes principals on cadascuna té un preu  1 €, 2 €, 3 € i 4 € (esquerra a dreta). &lt;br /&gt;
&lt;br /&gt;
Com el local és petit, es disposa de dos cambrers, cadascun d'ells té un botó que l'executarà en el cas de servir una tapa. Quan un cambrer serveixi una tapa haurà:&lt;br /&gt;
*1. Primer seleccionar-se amb el botó&lt;br /&gt;
*2. Clicar a la tapa o tapes servides.&lt;br /&gt;
&lt;br /&gt;
Cada vegada que el cambrer faci click a una tapa el seu preu s'incrementarà en la recaudació del cambrer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Michelin.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
:[[solucio michelin]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Fitxer:Gamepad.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
Dibuixa un rectangle i que es mova en funció del joystick, i mostre per pantalla els diferents botons.&lt;br /&gt;
 &lt;br /&gt;
http://html5gamepad.com&lt;br /&gt;
&lt;br /&gt;
:[[ejm_gamepad]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ratolí i Teclat ===&lt;br /&gt;
a) Es vol que el ratolí, en qualsevol punt de la finestra del navegador, es mostri la posició del punter respecte del navegador i respecte de la pàgina.&lt;br /&gt;
[[Fitxer:ex_ratoli.gif|100px]]&lt;br /&gt;
&lt;br /&gt;
b) Es vol que, a més a més, en prémer qualsevol tecla, el missatge mostrat ha de canviar per indicar el nou esdeveniment i la seva informació associada.&lt;br /&gt;
[[Fitxer:ex_teclat.gif|100px]]&lt;br /&gt;
&lt;br /&gt;
c)Afegir la següent característica al script: quan es prem un botó del ratolí, el color de fons del quadre de missatge ha de ser groc (#FFFFCC) i quan es prem una tecla, el color de fons ha de ser blau (#CCE6FF). En tornar a moure el ratolí, el color de fons torna a ser blanc.&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fitxer:ex_tec_rat_color.gif|200px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 6 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Posició ratolí ===&lt;br /&gt;
Crear un script que informi a l'usuari en què zona de la pantalla ha premut el ratolí. Les zones definides són les següents: esquerra a dalt, esquerra a baix, dreta a dalt i dreta a baix.&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 7 Events]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Cuadrat===&lt;br /&gt;
&lt;br /&gt;
Es desitja que un cuadrat es mova al llarg de la pantalla&lt;br /&gt;
&lt;br /&gt;
:[[sol_cuadrat]]&lt;br /&gt;
&lt;br /&gt;
=== Joc Tenis ===&lt;br /&gt;
Es tracta de implementar en Javascript un dels 1ers jocs que es va inventar per a PC. El joc del Tenis. &lt;br /&gt;
[[Fitxer:tenis.png|400px|center]]&lt;br /&gt;
Per començar el joc s'ha de pulsar la tecla 'S', per parar 'P' i per reinicializar la 'R'.&lt;br /&gt;
&lt;br /&gt;
Jugador 1:&lt;br /&gt;
*Utilitza el ratolí per el desplaçament de la raqueta&lt;br /&gt;
Jugador 2:&lt;br /&gt;
*tecla '↑' per desplaçar la raqueta cap a dalt&lt;br /&gt;
*tecla '↓' per desplaçar la raqueta cap a baix&lt;br /&gt;
Altres aspectes del joc&lt;br /&gt;
*A més a més, hi ha un marcador que indiqui qui va guanyant.&lt;br /&gt;
*També hi ha un botó, per exemple F2, per augmentar el número de pilotes&lt;br /&gt;
*També hi ha un botó per canviar els colors del joc. Pot existir diversos temes (F5-F8)&lt;br /&gt;
&lt;br /&gt;
https://www.w3schools.com/html/html5_draganddrop.asp&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Expressions Regulars =&lt;br /&gt;
Les expressions regulars son una necessitat a l'hora de validar formularis. Alguns problemes de validació no es podrien solucionar de una manera elegant sense elles.&lt;br /&gt;
Les expressions regulars son senzillament una manera d'expresar un patró per a cadenes coincidents de text. La expressions contenen termes i operadors que ens pemeten definir els patrons.&lt;br /&gt;
&lt;br /&gt;
== Creació d'expresions regulars ==&lt;br /&gt;
A Javascript, com succeeix amb la majoria d'objectes, existeixen dos formes de crear expresions regulars: &lt;br /&gt;
*mitjançant un literal&lt;br /&gt;
*creant una instància d'un objecte de tipus '''RegExp'''&lt;br /&gt;
&lt;br /&gt;
La creació d'una expressió regular amb un literal és molt sezill. Veïem un exemple. Volem crear una expressió regular que coincideixi exactament amb el string &amp;quot;test&amp;quot;:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = /test/;&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
Les expresions regulars van envoltades del caràctes /. Igual que els String van envoltades del caràcter &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
També podíem haver creat una instància del objecte RegExp de la següent manera:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = new RegExp(&amp;quot;test&amp;quot;);&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificadors ha utilitzar a l'hora de crear expressions regulars ==&lt;br /&gt;
A més a més de la propia expressió regular, podem introduïr els següents modificadors:&lt;br /&gt;
*''i'': Fa que no distingeixi de majúscules i minúscules. ex: /test/i&lt;br /&gt;
*''g'': Realitza una comparació global, en comptes de parar-se després de la primera coincidència.&lt;br /&gt;
*''m'': Realitza una comparació multilínia (més detalls a https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/multiline )&lt;br /&gt;
Exemple d'ús:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = /test/ig&lt;br /&gt;
var pattern2 = new RegExp(&amp;quot;test&amp;quot;,&amp;quot;ig&amp;quot;);&lt;br /&gt;
//exemple d'us de la expressió regular&lt;br /&gt;
alert(pattern.test(&amp;quot;test&amp;quot;));&lt;br /&gt;
alert(pattern2.test(&amp;quot;test&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termes i Operadors ==&lt;br /&gt;
&lt;br /&gt;
*''Coincidència exacta'': Tot lo que no sigui un caràcter especial o un operador haurà d'apareixer de forma literal en la expressió. Ex: /test/ la paraula '''test'' ha d'aparèixer exactament.&lt;br /&gt;
*''Combinacions de caràcters'': Moltes vegades no volem combinar un caràcter literal específic, sino un grup finit de caràcters. Podem especificar-ho col·locant el grup de caràcters que volem combinar entre claudàtors. Ex: [abc]&lt;br /&gt;
*''Combinacions de caràcters excloents'': Altres vegades volem combinar tots els caràcters trets d'uns quants. Per fer-ho podem utilitzar el símbol ''^'' seguit dels caràcters que no volem en la expresió. Ex: [^abc]. &lt;br /&gt;
*''Rang de valors'': També tenim la habilitat d'especificar un rang de valors. Ex: volem qualsevol caràcter entre '''a''' i '''m''' minmúscula --&amp;gt; [a-m] (ambdós incloses).&lt;br /&gt;
&lt;br /&gt;
=== Caràcters especials ===&lt;br /&gt;
Existeixen caràcters especials en les expresions regulars, de fet, ja hem vist uns quants: '''[''', ''']''', '''-''' i '''^'''.&lt;br /&gt;
Però encara hi ha uns quants més com serien el '''$''', '''{''', '''}''', '''?''', ''',''', '''+''' i el '''.'''&lt;br /&gt;
Com podem fer per utilitzar-los de forma literal en comptes d'utilitzar-los com a operadors de les expressions regulars? Escapant-los.&lt;br /&gt;
Però com? Utilitzant un caràcter especial: ''\''. Ex: La expressió regular '''/\[/''' significa el caràcter '''[''' i no l'inici d'un grup de caràcters.  &lt;br /&gt;
Així mateix, per poder utilitzar el caràcter '''\''' dintre de la expressió regular l'haurem d'escapar. Ex: '''\\''' correspon al literal '''\'''.&lt;br /&gt;
&lt;br /&gt;
=== Principis i finals ===&lt;br /&gt;
A vegades volem que un patró coincideixi amb el principi d'una cadena o amb el final. &lt;br /&gt;
*Principi: Utilitzarem el caràcter ''^''. Ex: /^test/ : només coincideix si la cadena '''test''' coincideix amb el principi.&lt;br /&gt;
*Final: Utilitzarem el caràcter ''$''. Ex: /test$/ : només coincideix si la cadena '''test''' coincideix amb el final.&lt;br /&gt;
*Principi i final: Ex: /^test$/ : Indica que el patró especificat ha d'incluir tota la cadena candidata.&lt;br /&gt;
&lt;br /&gt;
=== Repetició de caràcters ===&lt;br /&gt;
&lt;br /&gt;
Si volem combinar una serie de quatre caràcters 'a' podem expressar-ho amb ''/aaa/'' però que succeeix si volem utilitzar un número qualsevol de repeticions del mateix caràcter?&lt;br /&gt;
Tenim diferents opcions:&lt;br /&gt;
*Podem especificar que un caràcter és opcional, es a dir, &amp;lt;b&amp;gt;pot aparèixer alguna vegada o cap (0 ó 1)&amp;lt;/b&amp;gt;, Es fa afegint el caràcter '''''?''''' al final. Exemple: /t?est/. Aquest patró combina dues opcions: '''test i est'''.&lt;br /&gt;
*Si volem que un caràcter '''apareixi moltes vegades (1 o més)''' utilitzarem '''''+'''''. Ex: /t+est/. Aquest patró combina '''test''', '''ttest''' i '''tttest''' però no '''est'''.&lt;br /&gt;
*Si volem que un '''caràcter apareixi zero o més vegades (0 o més)''' utilitzem el caràcter '''*'''. Ex: /t*est/. Aquest patró combina '''test''', '''ttest''', '''tttest''' i també '''est'''.&lt;br /&gt;
*Podem especificar una quantitat concreta amb el número de repeticions permeses entre claudàtors '''''{}'''''Text en negreta. Per exemple, /a{4}/ indica una coincidència de quatre caràcters 'a' consecutius.&lt;br /&gt;
*També podem especificar un intérval per al compte de repeticions. Per exemple, /a{4,10}/ indica una combinació de 4 a 10 caracters 'a' consecutius.&lt;br /&gt;
*Si en aquest interval no s'indica el segon valor de l'intèrval indiquem que el número final és infinit. Ex: /a{4,}/. Aquest patró combina qualsevol cadena de cuatre o més caràcters 'a' consecutius. Fixat que és important posar la '''coma''' després del 4.&lt;br /&gt;
&lt;br /&gt;
=== Caràcters predefinits ===&lt;br /&gt;
La sintaxis de les expressions regulars ens proporcionen un nombre de termes predefinits que representen caràcters o clases de caràcters que s'utilitzen amb freqüència. &lt;br /&gt;
Taula:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Terme Predefinit&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Equivalència&lt;br /&gt;
|-&lt;br /&gt;
| \t ||Tabulació horitzontal&lt;br /&gt;
|-&lt;br /&gt;
| \b ||Retrocés&lt;br /&gt;
|-&lt;br /&gt;
| \v ||Tabulació Vertical&lt;br /&gt;
|-&lt;br /&gt;
| \f||Salt de página&lt;br /&gt;
|-&lt;br /&gt;
| \r||Retorn de carro.&lt;br /&gt;
|-&lt;br /&gt;
| \n||Nova linia&lt;br /&gt;
|-&lt;br /&gt;
| \cA : \cZ||Caràcters de control&lt;br /&gt;
|-&lt;br /&gt;
| \x0000 : \xFFFF||Unicode Hexadecimal&lt;br /&gt;
|-&lt;br /&gt;
|  \x00 : \xFF||ASCII Hexadecimal&lt;br /&gt;
|-&lt;br /&gt;
| .||Qualsevol caràcter, excepte nova linia&lt;br /&gt;
|-&lt;br /&gt;
|  \d||Qualsevol dígit decimal. Equivalent a [0-9]&lt;br /&gt;
|-&lt;br /&gt;
| \D||Qualsevol caràcter menys un dígit decimal. Equivalent a [^0-9]&lt;br /&gt;
|-&lt;br /&gt;
| \w||Qualsevol caràcter alfanuméric incloent el subratllat. [A-Za-z0-9_]&lt;br /&gt;
|-&lt;br /&gt;
| \W||Qualsevol caràcter menys els alfanumèric i el subratllat. [^A-Za-z0-9_]&lt;br /&gt;
|-&lt;br /&gt;
| \s||Qualsevol espai en blanc (espai, tabulador, salt de pàgina,etc.)&lt;br /&gt;
|-&lt;br /&gt;
| \S||Qualsevol caràcter menys un espai en blanc.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Per veure el llistat complert fes click [http://www.visibone.com/regular-expressions/ aquí].&lt;br /&gt;
&lt;br /&gt;
=== Agrupació de caràcters ===&lt;br /&gt;
De moment, hem observat que els operadors + i * només afecten al terme que els '''precedeix'''. Si volem aplicar-los a un grup de termes, podem utilitzar ''parèntesis'', igual que si es tractés d'una formula matemàtica. Per exemple: /(ab)+/. Aquest patró combina una o més aparicions de la cadena '''ab'''.&lt;br /&gt;
&lt;br /&gt;
=== Alternància de caràcters ===&lt;br /&gt;
La alternància pot expressar-se utilitzant el caràcter '''|'''. Per exemple: /a|b/ combina el caràcter '''a''' o '''b''', i /(ab)+|(cd)+/ combina només una o més repeticions de '''ab''' o '''cd'''.&lt;br /&gt;
&lt;br /&gt;
== Mètodes de les Expressions Regulars ==&lt;br /&gt;
*''pattern.test(cadena)'' : Executa la expressió regular e indica si la cadena passada per paràmetre coincideix o no. (retorna True o False)&lt;br /&gt;
*''pattern.exec(cadena)'' : Executa la expressió regular i retorna la primera coincidència.&lt;br /&gt;
== Resum Expressions Regulars ==&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Expresiones.jpg]]&lt;br /&gt;
[http://rua.ua.es/dspace/bitstream/10045/13363/6/07c-JavaScriptExpReg.pdf Resum Expressions Regulars]&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.regexr.com/ Comprovar expressions regulars]&lt;br /&gt;
&lt;br /&gt;
[https://regex101.com/ Comprovar expressions regulars II]&lt;br /&gt;
&lt;br /&gt;
Crea un patró per a cadascuna de les diferents cadenes que es mostren a continuació:&lt;br /&gt;
&lt;br /&gt;
*Codi postal. Ex: 46700&lt;br /&gt;
*Numero de telèfon amb prefix i guións, el primer nombre pot ser un 8 ó 9. Ex: 93-123-11-33&lt;br /&gt;
*Numero de telèfon amb prefix i punts. Ex: 93-1.231.1339&lt;br /&gt;
*Numero de telèfon internacional. Ex: (+34)952356817 &lt;br /&gt;
*Nom d'usuari amb un mínim de 4 i un màxim de 15. Ex: julio_30&lt;br /&gt;
*Nombre Real. Ex:  -122.33 ó 7,3 ó 8 &lt;br /&gt;
*Numero ISBN de 13 dígits: 978-3-16-148410-0&lt;br /&gt;
*Numero de la seguretat social: 01-123456789&lt;br /&gt;
*Adreça Postal amb les següent condicions: Carrer (C\), Plaza(Pz.), Avinguda(Av.). Direcció. Numero - Porta.&lt;br /&gt;
Ex: C\ Mare de Deu de montserrat. 233 - 2&lt;br /&gt;
*Numero IP d'un ordinador de la versió 4.&lt;br /&gt;
*Numero Mac d'un ordinador separats per ':'&lt;br /&gt;
*URL (amb http, https, www, etc)&lt;br /&gt;
*Data: Ex: DD/MM/AAAA&lt;br /&gt;
*Hora: 23:55:55&lt;br /&gt;
*Email&lt;br /&gt;
*Comprobar un nombre propio&lt;br /&gt;
*Targeta de crèdit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Codi postal. Ex: 46700&lt;br /&gt;
**sol: ^\d{5}$ &lt;br /&gt;
*Numero de telèfon amb prefix i guións, el primer nombre pot ser un 8 ó 9. Ex: 93-123-11-33&lt;br /&gt;
**sol: ^[89](\d-\d{3})-\d{2}-\d{2}$&lt;br /&gt;
*Numero de telèfon amb prefix i punts. Ex: 93-1.231.1339&lt;br /&gt;
**sol: ^[89](\d-\d.)\d{3}\.\d{3}$&lt;br /&gt;
*Numero de telèfon internacional. Ex: (+34)952356817 &lt;br /&gt;
**sol: ^\(\+\d{2,3}\)\d{9}$&lt;br /&gt;
*Nom d'usuari amb un mínim de 4 i un màxim de 15. Ex: julio_30&lt;br /&gt;
**sol: ^[a-z\d_]{4,15}$&lt;br /&gt;
*Nombre Real. Ex:  -122.33 ó 7,3 ó 8 &lt;br /&gt;
**sol: ^[+-]?\d+([,.]\d+)?$    &lt;br /&gt;
*Numero ISBN de 13 dígits: 978-3-16-148410-0&lt;br /&gt;
*Numero de la seguretat social: 01-123456789&lt;br /&gt;
**sol: ^\d{2}-\d{9}$&lt;br /&gt;
**sol: ^[0-1]{2}-\d{9}$&lt;br /&gt;
*Adreça Postal amb les següent condicions: Carrer (C\), Plaza(Pz.), Avinguda(Av.). Direcció. Numero - Porta.&lt;br /&gt;
Ex: C\ Mare de Deu de montserrat. 233 - 2&lt;br /&gt;
**sol: ^((C\\)|(Pz\.)|(Av\.))\s.+\.\s\d{1,5}\s-\s\d$&lt;br /&gt;
((C\\)|(Pz\.)|(Av\.))[a-zA-Z ]+\.[0-9 ]+\-[0-9 ]+&lt;br /&gt;
*Numero IP d'un ordinador de la versió 4.&lt;br /&gt;
** sol: ^((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]?)\.)((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]|[0-9])\.){2}((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]|[0-9]))$&lt;br /&gt;
 ^(?:\d{1,3}\.){3}\d{1,3}$&lt;br /&gt;
*Numero Mac d'un ordinador separats per ':'&lt;br /&gt;
*URL (amb http, https, www, etc)&lt;br /&gt;
**sol:(www\.|http:\/\/|https:\/\/)\S*\.(com|es|org))&lt;br /&gt;
*Data: Ex: DD/MM/AAAA&lt;br /&gt;
**sol: ^\d{1,2}\/\d{1,2}\/\d{2,4}$ &lt;br /&gt;
         ^([3][0-1]|[0-2][0-9])\/[0-1]?[0-2]\/[1-2]\d{3}$  coge hasta el día 31 y el mes 12 &lt;br /&gt;
*Hora: 23:55:55&lt;br /&gt;
**sol: ^(0[1-9]|1\d|2[0-3]):([0-5]\d):([0-5]\d)$ &lt;br /&gt;
*Email&lt;br /&gt;
**sol: /^[\w]+@{1}[\w]+\.[a-z]{2,3}$/&lt;br /&gt;
**sol: ^[\\w-]+(\\.[\\w-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$ &lt;br /&gt;
*Comprobar un nombre propio&lt;br /&gt;
**sol: /^([A-Z]{1}[a-zñáéíóú]+[\s]*)+$/ &lt;br /&gt;
*Targeta de crèdit&lt;br /&gt;
**sol:  ^((67\d{2})|(4\d{3})|(5[1-5]\d{2})|(6011))(-?\s?\d{4}){3}|(3[4,7])\ d{2}-?\s?\d{6}-?\s?\d{5}$&lt;br /&gt;
&lt;br /&gt;
= Formularis =&lt;br /&gt;
JavaScript disposa de nombroses propietats i funcions que faciliten la programació d'aplicacions que manegen formularis. En primer lloc, quan es carrega una pàgina web, el navegador crea automàticament una matriu anomenat forms i que conté la referència a tots els formularis de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Per accedir al array forms , s'utilitza l'objecte document , de manera que document.forms és la matriu que conté tots els formularis de la pàgina. Com es tracta d'un array, l'accés a cada formulari es realitza amb la mateixa sintaxi dels arrays. La següent instrucció accedeix al primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més de l'array de formularis, el navegador crea automàticament una matriu anomenat ''elements'' per cadascun dels formularis de la pàgina. Cada array elements conté la referència a tots els elements (quadres de text, botons, llistes desplegables, etc.) d'aquest formulari. Utilitzant la sintaxi dels arrays, la següent instrucció obté el primer element del primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]. elements [0]; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La sintaxi dels arrays no sempre és tan concisa. El següent exemple mostra com obtenir directament l'últim element del primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]. elements [document. forms [0]. elements. length - 1];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Encara que aquesta forma d'accedir als formularis és ràpida i senzilla, té un inconvenient molt greu. Què passa si canvia el disseny de la pàgina i en el codi HTML es canvia l'ordre dels formularis originals o s'afegeixen nous formularis? El problema és que &amp;quot;el primer formulari de la pàgina&amp;quot; ara podria ser un altre formulari diferent al que espera l'aplicació.&lt;br /&gt;
&lt;br /&gt;
En un entorn tan canviant com el disseny web, és molt difícil confiar que l'ordre dels formularis es mantingui estable en una pàgina web. Per aquest motiu, sempre s'hauria d'evitar l'accés als formularis d'una pàgina mitjançant l'array ''document.forms''.&lt;br /&gt;
&lt;br /&gt;
Una forma d'evitar els problemes del mètode anterior consisteix a accedir als formularis d'una pàgina a través del seu nom (atribut '''name''') o a través del seu atribut '''id''' . L'objecte document permet accedir directament a qualsevol formulari mitjançant la seva atribut '''name''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var formularioPrincipal = document. formulari;&lt;br /&gt;
 var formularioSecundario = document. otro_formulario;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/ Form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;otro_formulario&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Accedint d'aquesta forma als formularis de la pàgina, l'script funciona correctament encara que es reordenin els formularis o s'afegeixin nous formularis a la pàgina. Els elements dels formularis també es poden accedir directament mitjançant el seu atribut '''name''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  var formularioPrincipal = document. formulari;&lt;br /&gt;
 var primerElemento = document. formulari. element;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;Input type = &amp;quot;text&amp;quot; name = &amp;quot;element&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Òbviament, també es pot accedir als formularis i als seus elements utilitzant les funcions DOM d'accés directe als nodes. El següent exemple utilitza l'habitual funció '''document.getElementById()''' per accedir de forma directa a un formulari i un dels seus elements:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var formularioPrincipal = document. getElementById (&amp;quot;formulari&amp;quot;);&lt;br /&gt;
 var primerElemento = document. getElementById (&amp;quot;element&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot; id = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;Input type = &amp;quot;text&amp;quot; name = &amp;quot;element&amp;quot; id = &amp;quot;element&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Independentment del mètode utilitzat per obtenir la referència a un element de formulari, cada element disposa de les següents propietats útils per al desenvolupament de les aplicacions:&lt;br /&gt;
*''type'' : indica el tipus d'element que es tracta. Per als elements de tipus &amp;lt;input&amp;gt; ( text , button , checkbox , etc.) coincideix amb el valor del seu atribut '''type''' . Per a les llistes desplegables normals (element &amp;lt;select&amp;gt; ) el seu valor és '''select-one''' , el que permet diferenciar-les de les llistes que permeten seleccionar diversos elements alhora i el tipus és '''select-multiple'''. Finalment, en els elements de tipus &amp;lt;textarea&amp;gt; , el valor de type és '''textarea''' .&lt;br /&gt;
*''form'' : és una referència directa al formulari al qual pertany l'element. Així, per accedir al formulari d'un element, es pot utilitzar document.getElementById(&amp;quot;id_del_elemento&amp;quot;).form&lt;br /&gt;
*''name'' : obté el valor de l'atribut name de XHTML. Només es pot llegir el seu valor, per la qual cosa no es pot modificar.&lt;br /&gt;
*''value'' : permet llegir i modificar el valor de l'atribut value de XHTML. Per als camps de text ( &amp;lt;input type=&amp;quot;text&amp;quot;&amp;gt; i &amp;lt;textarea&amp;gt; ) obté el text que ha escrit l'usuari. Per als botons obté el text que es mostra al botó. Per als elements checkbox i radiobutton no és molt útil, com es veurà més endavant&lt;br /&gt;
&lt;br /&gt;
== Validació ==&lt;br /&gt;
&lt;br /&gt;
La principal utilitat de JavaScript en el maneig dels formularis és la validació de les dades introduïdes pels usuaris. Abans d'enviar un formulari al servidor, es recomana validar mitjançant JavaScript les dades inserides per l'usuari. D'aquesta manera, si l'usuari ha comès algun error en omplir el formulari, se li pot notificar de forma instantània, sense necessitat d'esperar la resposta del servidor.&lt;br /&gt;
&lt;br /&gt;
Notificar els errors de forma immediata mitjançant JavaScript millora la satisfacció de l'usuari amb l'aplicació (el que tècnicament es coneix com &amp;quot;millorar l'experiència d'usuari&amp;quot;) i ajuda a reduir la càrrega de processament al servidor.&lt;br /&gt;
&lt;br /&gt;
Normalment, la validació d'un formulari consisteix en cridar a una funció de validació quan l'usuari prem sobre el botó d'enviament del formulari. En aquesta funció, es comproven si els valors que ha introduït l'usuari compleixen les restriccions imposades per l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Encara que hi ha tantes possibles comprovacions com a elements de formulari diferents, algunes comprovacions són molt habituals: que ompli un camp obligatori, que se seleccioni el valor d'una llista desplegable, que l'adreça d'email indicada sigui correcta, que la data introduïda sigui lògica, que s'hagi introduït un nombre on així es requereix, etc.&lt;br /&gt;
&lt;br /&gt;
A continuació es mostra el codi JavaScript bàsic necessari per incorporar la validació a un formulari:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form name=&amp;quot;formulario&amp;quot;  onSubmit=&amp;quot;return ValidaCampos()&amp;quot;&amp;gt;&lt;br /&gt;
 Teléfono: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;telefono&amp;quot; size=&amp;quot;15&amp;quot; maxlength=&amp;quot;15&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
           &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enviar&amp;quot; name=&amp;quot;enviar&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
I l'esquema de la funció validacio() és el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ValidaCampos() {&lt;br /&gt;
   var expresion_regular_telefono = /^[89](\d-\d.)\d{3}\.\d{3}$/;  &lt;br /&gt;
// 9 cifras numéricas.&lt;br /&gt;
// Usaremos el método &amp;quot;test&amp;quot; de las expresiones regulares:&lt;br /&gt;
      if (expresion_regular_telefono.test(formulario.telefono.value) == false) {&lt;br /&gt;
                alert('Campo TELEFONO no válido.');&lt;br /&gt;
                return false; // sale de la función y NO envía el formulario&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                alert('Gracias por rellenar nuestro formulario correctamente.');&lt;br /&gt;
                return true; // sale de la función y SÍ envía el formulario&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El funcionament d'aquesta tècnica de validació es basa en el comportament de l'esdeveniment '''onsubmit''' de JavaScript. Igual que altres esdeveniments com '''onclick''' i '''onkeypress''' , l'esdeveniment '''onsubmit''' varia el seu comportament en funció del valor que retorna.&lt;br /&gt;
&lt;br /&gt;
Així, si l'esdeveniment '''onsubmit''' torna el valor '''true''' , el formulari s'envia com ho faria normalment. No obstant això, si l'esdeveniment onsubmit torna el valor '''false''' , el formulari no s'envia. La clau d'aquesta tècnica consisteix a comprovar tots i cadascun dels elements del formulari. En tant es troba un element incorrecte, es torna el valor '''false''' . Si no es troba cap error, es torna el valor '''true'''.&lt;br /&gt;
&lt;br /&gt;
Per tant, en primer lloc es defineix l'esdeveniment '''onsubmit''' del formulari com:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  onsubmit = &amp;quot;return validacio()&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Com el codi JavaScript retorna el valor resultant de la funció '''validacio()''' , el formulari només s'enviarà al servidor si aquesta funció retorna '''true''' . En el cas que la funció '''validacio()''' retorni '''false''' , el formulari romandrà sense enviar.&lt;br /&gt;
&lt;br /&gt;
Dins de la funció '''validacio()''' es comproven totes les condicions imposades per l'aplicació. Quan no es compleix una condició, es retorna '''false''' i per tant el formulari no s'envia. Si s'arriba al final de la funció, totes les condicions s'han complert correctament, de manera que es retorna '''true''' i el formulari s'envia.&lt;br /&gt;
&lt;br /&gt;
La notificació dels errors comesos depèn del disseny de cada aplicació. En el codi de l'exemple anterior simplement es mostren missatges mitjançant la funció '''alert()''' indicant l'error produït. Les aplicacions web ben dissenyades mostren cada missatge d'error al costat de l'element de formulari corresponent i també solen mostrar un missatge principal indicant que el formulari conté errors.&lt;br /&gt;
&lt;br /&gt;
Un cop definit l'esquema de la funció '''validacio()''' , s'ha d'afegir a aquesta funció el codi corresponent a totes les comprovacions que es realitzen sobre els elements del formulari.&lt;br /&gt;
&lt;br /&gt;
== Validació formularis HTML5==&lt;br /&gt;
&lt;br /&gt;
[http://cybmeta.com/validacion-de-formularios-con-html5/ Validació formularis HTML5 I]&lt;br /&gt;
&lt;br /&gt;
[http://mytutorials85.blogspot.com.es/2012/04/formularios-en-html5.html?email=fdfds%40fds Validació formularis HTML5 II]&lt;br /&gt;
&lt;br /&gt;
[https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation Client-side form validation]&lt;br /&gt;
&lt;br /&gt;
== Exercicis de Validació ==&lt;br /&gt;
&lt;br /&gt;
=== Formulari de validació 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea un formulari que demani 4 camps en un textbox: nom, cognoms, email i telèfon. El formulari tindrà un botó &amp;quot;Enviar&amp;quot; que validarà el contingut dels textbox i en cas de passar les validacions s'obrirà una nova pàgina (que no cal que existeixi) amb els valors introduïts passats amb el mètode GET:&lt;br /&gt;
*tots els camps seran obligatoris&lt;br /&gt;
*el format serà el típic de cada camp&lt;br /&gt;
*mostra els missatges d'error d'un en un, per ordre i posant el focus al camp que produeix cada error&lt;br /&gt;
*usa els elements que coneixes de HTML, CSS, etc per a marcar l'error. Sigues creatiu&lt;br /&gt;
&lt;br /&gt;
=== Formulari de validació 2 ===&lt;br /&gt;
&lt;br /&gt;
Al formulari anterior afegeix els camps data de naixement, adreça, codi postal i municipi (per aquest ordre) tenint en compte:&lt;br /&gt;
*la data de naixement ha de ser vàlida, en format dd/mm/aaaa i anterior a la data actual.&lt;br /&gt;
*l'adreça estarà formada per caràcters alfanumèrics i també admetrà espais,comes i guions.&lt;br /&gt;
*el codi postal i municipi tindran el format típic d'aquests camps.&lt;br /&gt;
&lt;br /&gt;
=== solució ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.input_ok {background-color: lightcyan}&lt;br /&gt;
.input_error {background-color: rgb(255, 255, 119)}&lt;br /&gt;
.label_error {color: darkred}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body &amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Exercici 1 de Validacions&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;form name=&amp;quot;formulari&amp;quot; onSubmit=&amp;quot;return valida()&amp;quot; action=&amp;quot;ex_validacions.html&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label for=&amp;quot;nom&amp;quot;&amp;gt;Nom:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;nom&amp;quot; name=&amp;quot;nom&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_nom&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;cognoms&amp;quot;&amp;gt;Cognoms:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;cognoms&amp;quot; name=&amp;quot;cognoms&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_cognoms&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;email&amp;quot;&amp;gt;Email:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;email&amp;quot; name=&amp;quot;email&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_email&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;telefon&amp;quot;&amp;gt;Telefon:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;telefon&amp;quot; name=&amp;quot;telefon&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_telefon&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;data&amp;quot;&amp;gt;Data de naixement:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;data&amp;quot; name=&amp;quot;data&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_data&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;adreca&amp;quot;&amp;gt;Adreça:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;adreca&amp;quot; name=&amp;quot;adreca&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_adreca&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;cp&amp;quot;&amp;gt;Codi postal:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;cp&amp;quot; name=&amp;quot;cp&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_cp&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;municipi&amp;quot;&amp;gt;Municipi:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;municipi&amp;quot; name=&amp;quot;municipi&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_municipi&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body &amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function valida(){&lt;br /&gt;
&lt;br /&gt;
var nom=document.getElementById(&amp;quot;nom&amp;quot;).value;&lt;br /&gt;
var cognoms=document.getElementById(&amp;quot;cognoms&amp;quot;).value;&lt;br /&gt;
var email=document.getElementById(&amp;quot;email&amp;quot;).value;&lt;br /&gt;
var telefon=document.getElementById(&amp;quot;telefon&amp;quot;).value;&lt;br /&gt;
var data=document.getElementById(&amp;quot;data&amp;quot;).value;&lt;br /&gt;
var adreca=document.getElementById(&amp;quot;adreca&amp;quot;).value;&lt;br /&gt;
var cp=document.getElementById(&amp;quot;cp&amp;quot;).value;&lt;br /&gt;
var municipi=document.getElementById(&amp;quot;municipi&amp;quot;).value;&lt;br /&gt;
var patt_alfanumeric = /^[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ]+(\s[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ]+)*$/;&lt;br /&gt;
var patt_email = /^\w+@\w+\.\w+$/;&lt;br /&gt;
var patt_telefon =/^\d{9}$/;&lt;br /&gt;
var patt_data = /^\d{2}\/\d{2}\/\d{4}$/;&lt;br /&gt;
var patt_adreca = /^[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ\,\.\-]+(\s[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ\,\.\-]+)*$/;&lt;br /&gt;
var patt_cp=/^\d{5}$/;&lt;br /&gt;
&lt;br /&gt;
// reset format dels textbox i missatges d'error&lt;br /&gt;
document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//validació del nom&lt;br /&gt;
if(nom==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_alfanumeric.test(nom)) {&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació dels cognoms&lt;br /&gt;
if(cognoms==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_alfanumeric.test(cognoms)) {&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del email&lt;br /&gt;
if(email==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_email.test(email)) {&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (ex. usuari@servidor.xx)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del telefon&lt;br /&gt;
if(telefon==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_telefon.test(telefon)) {&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (6 digits)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació de la data&lt;br /&gt;
if(data==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_data.test(data)) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (dd/mm/aaaa)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var components_data = data.split(&amp;quot;/&amp;quot;);&lt;br /&gt;
var val_data=Date.parse(components_data[2]+&amp;quot;/&amp;quot;+components_data[1]+&amp;quot;/&amp;quot;+components_data[0]);&lt;br /&gt;
&lt;br /&gt;
if(isNaN(val_data)) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;data no vàlida&amp;quot;;&lt;br /&gt;
	return false;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var today=new Date();&lt;br /&gt;
if(val_data&amp;gt;=today) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;la data ha de ser anterior a la data acutal&amp;quot;;&lt;br /&gt;
	return false;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//validació de l'adreça&lt;br /&gt;
if(adreca==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_adreca.test(adreca)) {&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del codi postal&lt;br /&gt;
if(cp==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_cp.test(cp)) {&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (5 digits)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del municipi&lt;br /&gt;
if(municipi==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_adreca.test(municipi)) {&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return true;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
	&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
POSIBLE EJERCICIO&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tags = document.querySelectorAll('h1,h2,h3,h4,h5,h6,div,p');&lt;br /&gt;
for (var i = tags.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
  tags[i].style.outline = &amp;quot;1px solid green&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validar un camp de text Obligatori ===&lt;br /&gt;
Es tracta de forçar l'usuari a introduir un valor en un quadre de text o textarea en què sigui obligatori.Perquè es doni per completat un camp de text obligatori, es comprova que el valor introduït sigui vàlid, que el nombre de caràcters introduït sigui més gran que zero i que no s'hagin introduït només espais en blanc.  El text introduït tingui una longitud superior a zero caràcters, és a dir, que no sigui un text buit i per últim, el valor introduït per l'usuari no només estigui format per espais en blanc.&lt;br /&gt;
&lt;br /&gt;
:[[solució_valor_quadre_text]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un camp de text amb valors numèrics ===&lt;br /&gt;
Es tracta d'obligar l'usuari a introduir un valor numèric en un quadre de text.&lt;br /&gt;
:[[solucio_camp_text]]&lt;br /&gt;
&lt;br /&gt;
===  Validar que s'ha seleccionat una opció d'una llista ===&lt;br /&gt;
Es tracta d'obligar l'usuari a seleccionar un element d'una llista desplegable.&lt;br /&gt;
:[[solucio_llista]]&lt;br /&gt;
&lt;br /&gt;
=== Validar una adreça de correu electrònic ===&lt;br /&gt;
Es tracta d'obligar l'usuari a introduir una adreça de correu amb un format vàlid. Per tant, el que es comprova és que la direcció sembli vàlida, ja que no es comprova si es tracta d'un compte de correu electrònic real i operativa. La comprovació es realitza novament mitjançant les expressions regulars, ja que les adreces de correu electrònic vàlides poden ser molt diferents.&lt;br /&gt;
:[[solucio_correu_electronic]]&lt;br /&gt;
&lt;br /&gt;
=== Validar una data ===&lt;br /&gt;
Les dates solen ser els camps de formulari més complicats de validar per la multitud de formes diferents en què es poden introduir.&lt;br /&gt;
:[[solucio_dates]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un número de DNI ===&lt;br /&gt;
Es tracta de comprovar que el nombre proporcionat per l'usuari es correspon amb un nombre vàlid de document nacional d'identitat o DNI. Encara que per cada país o regió els requisits del document d'identitat de les persones poden variar, a continuació es mostra un exemple genèric fàcilment adaptable. La validació no només ha de comprovar que el nombre estigui format per vuit xifres i una lletra, sinó que també cal comprovar que la lletra indicada és correcta per al número introduït.&lt;br /&gt;
:[[solució_dni]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un número de telèfon ===&lt;br /&gt;
Els números de telèfon poden ser indicats de formes molt diferents: amb prefix nacional, amb prefix internacional, agrupat per parells, separant els números amb guions, etc.&lt;br /&gt;
:[[solucio_telefon]]&lt;br /&gt;
&lt;br /&gt;
=== Validar que un checkbox ha estat seleccionat ===&lt;br /&gt;
*a)Es tracta de validar si un element de tipus checkbox s'ha de seleccionar de forma obligatòria. &lt;br /&gt;
*b)Es tracta de validar si tots els checkbox del formulari han estat seleccionats.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_checkbox]]&lt;br /&gt;
&lt;br /&gt;
=== Validar que un radiobutton ha estat seleccionat ===&lt;br /&gt;
Encara que es tracta d'un cas similar al dels checkbox, la validació dels radiobutton presenta una diferència important: en general, la comprovació que es realitza és que l'usuari hagi seleccionat algun radiobutton dels que formen un determinat grup.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_radiobutton]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;JavaScript RegExp Reference: https://www.w3schools.com/jsref/jsref_obj_regexp.asp&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Experiments amb Expresions Regulars: http://www.regexplanet.com/advanced/javascript/index.html &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;John Resig, Bear Bibeault, &amp;quot;Secrets of the Javascript Ninja&amp;quot;, Manning Publications, 2012. ISBN 193398869X&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[http://librosweb.es/javascript/capitulo_7.html Introducció a Javascript] &amp;lt;/p&amp;gt; &amp;lt;p&amp;gt; [https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions Expressions Regulars a Mozilla]&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_Esdeveniments_i_Validacio_de_formularis&amp;diff=17001</id>
		<title>NF1 - Esdeveniments i Validacio de formularis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_Esdeveniments_i_Validacio_de_formularis&amp;diff=17001"/>
				<updated>2023-01-13T16:51:26Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Event document.onload */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Esdeveniments =&lt;br /&gt;
Fins ara, totes les aplicacions i scripts que s'han creat tenen alguna cosa en comú: s'executen des de la primera instrucció fins a l'última de forma seqüencial. Gràcies a les estructures de control de flux (if, for, while) és possible modificar lleugerament aquest comportament i repetir alguns trossos del script i saltar-se altres trossos en funció d'algunes condicions.&lt;br /&gt;
&lt;br /&gt;
Aquest tipus d'aplicacions són poc útils, ja que no interactuen amb els usuaris i no poden respondre als diferents esdeveniments que es produeixen durant l'execució d'una aplicació. Afortunadament, les aplicacions web creades amb el llenguatge Javascript poden utilitzar el model de programació basada en esdeveniments.&lt;br /&gt;
&lt;br /&gt;
En aquest tipus de programació, els scripts es dediquen a esperar al fet que l'usuari &amp;quot;faci alguna cosa&amp;quot; (que premi una tecla, que mogui el ratolí, que tanqui la finestra del navegador). A continuació, el script respon a l'acció de l'usuari normalment processant aquesta informació i generant un resultat.&lt;br /&gt;
&lt;br /&gt;
Els esdeveniments fan possible que els usuaris transmetin informació als programes. Javascript defineix nombrosos esdeveniments que permeten una interacció completa entre l'usuari i les pàgines/aplicacions web. La pulsació d'una tecla constitueix un esdeveniment, així com punxar o moure el ratolí, seleccionar un element d'un formulari, redimensionar la finestra del navegador, etc.&lt;br /&gt;
&lt;br /&gt;
Javascript permet assignar una funció a cadascun dels esdeveniments. D'aquesta forma, quan es produeix qualsevol esdeveniment, Javascript executa la seva funció associada. Aquest tipus de funcions es denominen &amp;quot;event handlers&amp;quot; en anglès i solen traduir-se per &amp;quot;manegadors d'esdeveniments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Model bàsic d'esdeveniments ==&lt;br /&gt;
=== Tipus d'esdeveniments ===&lt;br /&gt;
En aquest model, cada element o etiqueta XHTML defineix la seva pròpia llista de possibles esdeveniments que se li poden assignar. Un mateix tipus d'esdeveniment (per exemple, clicar el botó esquerre del ratolí) pot estar definit per a diversos elements XHTML diferents i un mateix element XHTML pot tenir associats varis esdeveniments diferents.&lt;br /&gt;
&lt;br /&gt;
El nom de cada esdeveniment es construeix mitjançant el prefix ''on'', seguit del nom en anglès de l'acció associada a l'esdeveniment. Així, l'esdeveniment de punxar un element amb el ratolí es denomina ''onclick'' i l'esdeveniment associat a l'acció de moure el ratolí es denomina ''onmousemove''.&lt;br /&gt;
&lt;br /&gt;
La següent taula resumeix els esdeveniments més importants definits per Javascript:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Event&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Descripció&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Elements per els que está definit&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onblur&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deseleccionar l'element (el contrari de onfocus)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;button&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;label&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onchange&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Succeeix quan el valor del element ha canviat&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onclick&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;clicar i deixar anar el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;ondblclick&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;clicar dos vegades seguides amb el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onfocus&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Seleccionar un element&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;button&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;label&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeydown&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer una tecla (sense deixar-la anar)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeypress&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer una tecla&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeyup&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deixar anar una tecla premuda&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onload&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;La pàgina s'ha carregat completament&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmousedown&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer (sense deixar anar) un botn del ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmousemove&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Moure el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseout&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;El ratolí &amp;lt;em&amp;gt;&amp;quot;surt&amp;quot;&amp;lt;/em&amp;gt; de l'element (passa sobre un altre element)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseover&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;El ratoli &amp;lt;em&amp;gt;&amp;quot;entra&amp;quot;&amp;lt;/em&amp;gt; dintre de l'elemento (passa per sobre de l'element)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseup&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deixar anar el botó que estava premut en el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onreset&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Inicialitzar el formulari (esborrar totes les dades)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;form&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onresize&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;S'ha modificat la mida de la finestra del navegador&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onselect&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Seleccionar un text&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onsubmit&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Enviar el formulari&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;form&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onunload&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;S'abandona la pàgina (per exemple al tancar el navegador)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu veure tots el esdeveniments [[http://www.w3schools.com/jsref/dom_obj_event.asp aquí]]&lt;br /&gt;
&lt;br /&gt;
===Gestor  d'esdeveniments===&lt;br /&gt;
&lt;br /&gt;
Un esdeveniment de Javascript per si mateix manca d'utilitat. Perquè els esdeveniments resultin útils, s'han d'associar funcions o codi Javascript a cada esdeveniment. D'aquesta forma, quan es produeix un esdeveniment s'executa el codi indicat, per la qual cosa l'aplicació pot respondre davant qualsevol esdeveniment que es produeixi durant la seva execució.&lt;br /&gt;
&lt;br /&gt;
Les funcions o codi Javascript que es defineixen per a cada esdeveniment es denominen &amp;quot;manegador d'esdeveniments&amp;quot; i com Javascript és un llenguatge molt flexible, existeixen diverses formes diferents d'indicar els manegadors:&lt;br /&gt;
&lt;br /&gt;
*Manejadores com a atributs dels elements XHTML.&lt;br /&gt;
*Manejadores com a funcions Javascript externes.&lt;br /&gt;
*Manejadores &amp;quot;semàntics&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments com a atributs XHTML ====&lt;br /&gt;
&lt;br /&gt;
Es tracta del mètode més senzill i alhora menys professional d'indicar el codi Javascript que s'ha d'executar quan es produeixi un esdeveniment. En aquest cas, el codi s'inclou en un atribut del propi element XHTML. En el següent exemple, es vol mostrar un missatge quan l'usuari cliqui amb el ratolí sobre un botó:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquest mètode, es defineixen atributs XHTML amb el mateix nom que els esdeveniments que es volen manejar. L'exemple anterior només vol controlar l'esdeveniment de clicar amb el ratolí, el nom del qual és onclick. Així, l'element XHTML pel qual es vol definir aquest esdeveniment, ha d'incloure un atribut anomenat onclick.&lt;br /&gt;
&lt;br /&gt;
El contingut de l'atribut és una cadena de text que conté totes les instruccions Javascript que s'executen quan es produeix l'esdeveniment. En aquest cas, el codi Javascript és molt senzill (alert('Gràcies per clicar');), ja que solament es tracta de mostrar un missatge.&lt;br /&gt;
&lt;br /&gt;
En aquest altre exemple, quan l'usuari punxa sobre l'element &amp;lt;div&amp;gt; es mostra un missatge i quan l'usuari passa el ratolí per sobre de l'element, es mostra un altre missatge:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div onclick=&amp;quot;alert('Has clicat amb el ratolí');&amp;quot; onmouseover=&amp;quot;alert('Acabes de passar el ratolí per damunt');&amp;quot;&amp;gt;Ratolí&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pots clicar sobre aquest element o simplement passar el ratolí per damunt.&lt;br /&gt;
Aquest altre exemple inclou una de les instruccions més utilitzades en les aplicacions Javascript més antigues:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body onload=&amp;quot;alert(&amp;quot;La pàgina s'ha carregat completament &amp;quot;);&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior es mostra després que la pàgina s'hagi carregat completament, és a dir, després que s'hagi descarregat el seu codi HTML, les seves imatges i qualsevol altre objecte inclòs a la pàgina.&lt;br /&gt;
&lt;br /&gt;
L'esdeveniment onload és un dels més utilitzats ja que, com veurem en el capítol de DOM, les funcions que permeten accedir i manipular els nodes de l'arbre DOM solament estan disponibles quan la pàgina s'ha carregat completament.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments i variable this ====&lt;br /&gt;
&lt;br /&gt;
En els esdeveniments, es pot utilitzar la variable '''this''' per referir-se a l'element XHTML que ha provocat l'esdeveniment. Aquesta variable és molt útil per a exemples com el següent:&lt;br /&gt;
&lt;br /&gt;
Quan l'usuari passa el ratolí per sobre de el &amp;lt;div&amp;gt;, el color de la vora es mostra de color negre. Quan el ratolí surt de el &amp;lt;div&amp;gt;, es torna a mostrar la vora amb el color gris clar original.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Element &amp;lt;div&amp;gt; original:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si no s'utilitza la variable this, el codi necessari per modificar el color de les vores, seria el següent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;document.getElementById('continguts').style.borderColor='black';&amp;quot; onmouseout=&amp;quot;document.getElementById('continguts').style.borderColor='silver';&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codi anterior és massa llarg i massa propens a cometre errors. Dins del codi d'un esdeveniment, Javascript crea automàticament la variable this, que fa referència a l'element XHTML que ha provocat l'esdeveniment. Així, l'exemple anterior es pot reescriure de la següent manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;this.style.borderColor='black';&amp;quot; onmouseout=&amp;quot;this.style.borderColor='silver';&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codi anterior és molt més compacte, més fàcil de llegir i d'escriure i segueix funcionant correctament encara que es modifiqui el valor de l'atribut ''id'' de el &amp;lt; div &amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments com a funcions externes ====&lt;br /&gt;
&lt;br /&gt;
La definició dels manegadores d'esdeveniments en els atributs XHTML és el mètode més senzill però menys aconsellable de tractar amb els esdeveniments en Javascript. El principal inconvenient és que es complica a l'excés quan s'afegeixen algunes poques instruccions, per la qual cosa solament és recomanable per als casos més senzills.&lt;br /&gt;
&lt;br /&gt;
Si es realitzen aplicacions complexes, com per exemple la validació d'un formulari, és aconsellable agrupar tot el codi Javascript en una funció externa i cridar a aquesta funció des de l'element XHTML.&lt;br /&gt;
&lt;br /&gt;
Seguint amb l'exemple anterior que mostra un missatge en clicar sobre un botó:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilitzant funcions externes es pot transformar en:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function mostraMissatge() {&lt;br /&gt;
  alert('Gràcies per clicar');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;mostraMissatge()&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquesta tècnica consisteix a extreure totes les instruccions de Javascript i agrupar-les en una funció externa. Una vegada definida la funció, en l'atribut de l'element XHTML s'inclou el nom de la funció, per indicar que és la funció que s'executa quan es produeix l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
La crida a la funció es realitza de la forma habitual, indicant el seu nom seguit dels parèntesis i de forma opcional, incloent tots els arguments i paràmetres que es necessitin.&lt;br /&gt;
&lt;br /&gt;
El principal inconvenient d'aquest mètode és que en les funcions externes no es pot seguir utilitzant la variable '''this''' i per tant, és necessari passar aquesta variable com a paràmetre a la funció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ressalta(element) {&lt;br /&gt;
	switch(element.style.borderColor) {&lt;br /&gt;
		case 'silver':&lt;br /&gt;
		case 'silver silver silver silver':&lt;br /&gt;
		case '#c0c0c0':&lt;br /&gt;
			element.style.borderColor = 'black';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'black':&lt;br /&gt;
		case 'black black black black':&lt;br /&gt;
		case '#000000':&lt;br /&gt;
			element.style.borderColor = 'silver';&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;ressalta(this)&amp;quot; onmouseout=&amp;quot;ressalta(this)&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En l'exemple anterior, la funció externa és cridada amb el paràmetre ''this'', que dins de la funció es denomina element. La complexitat de l'exemple es produeix sobretot per la forma en la qual els diferents navegadors emmagatzemen el valor de la propietat *&lt;br /&gt;
''borderColor''.&lt;br /&gt;
&lt;br /&gt;
Mentre que Firefox emmagatzema (en cas que les quatre vores coincideixin en color) el valor ''black'', Internet Explorer ho emmagatzema com ''black black black black'' i Opera emmagatzema la seva representació hexadecimal ''#000000''.&lt;br /&gt;
&lt;br /&gt;
====Gestor d'esdeveniments semàntics====&lt;br /&gt;
Els mètodes que s'han vist per afegir manejadores d'esdeveniments (com a atributs XHTML i com a funcions externes) tenen un greu inconvenient: &amp;quot;embruten&amp;quot; el codi XHTML de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Com és conegut, una de les bones pràctiques bàsiques en el disseny de pàgines i aplicacions web és la separació dels continguts (XHTML) i el seu aspecte o presentació (CSS). Sempre que sigui possible, també es recomana separar els continguts (XHTML) i el seu comportament o programació (Javascript).&lt;br /&gt;
&lt;br /&gt;
Barrejar el codi Javascript amb els elements XHTML solament contribueix a complicar el codi font de la pàgina, a dificultar la modificació i manteniment de la pàgina i a reduir la semàntica del document final produït.&lt;br /&gt;
&lt;br /&gt;
Afortunadament, existeix un mètode alternatiu per definir els manegadores d'esdeveniments de Javascript. Aquesta tècnica és una evolució del mètode de les funcions externes, ja que es basa a utilitzar les propietats DOM dels elements XHTML per assignar totes les funcions externes que actuen de manejadores d'esdeveniments. Així, el següent exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;clica&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Es pot transformar en:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Funció externa&lt;br /&gt;
function mostraMissatge() {&lt;br /&gt;
alert('Gràcies per clicar');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Assignar la funció externa a l'element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&lt;br /&gt;
// Element XHTML&lt;br /&gt;
&amp;lt;input id=&amp;quot;clica&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tècnica dels manegadores semàntics consisteix en:&lt;br /&gt;
&lt;br /&gt;
*Assignar un identificador únic a l'element XHTML mitjançant l'atribut ''id''.&lt;br /&gt;
*Crear una funció de Javascript encarregada de manejar l'esdeveniment.&lt;br /&gt;
*Assignar la funció externa a l'esdeveniment corresponent en l'element desitjat.&lt;br /&gt;
*L'últim pas és la clau d'aquesta tècnica. En primer lloc, s'obté l'element al que es desitja associar la funció externa:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A continuació, s'utilitza una propietat de l'element amb el mateix nom que l'esdeveniment que es vol manejar. En aquest cas, la propietat és ''onclick'':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'assigna la funció externa mitjançant el seu nom sense parèntesi. El més important (i la causa més comuna d'errors) és indicar solament el nom de la funció, és a dir, prescindir dels parèntesis en assignar la funció:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'afegeixen els parèntesis després del nom de la funció, en realitat s'està executant la funció i guardant el valor retornat per la funció en la propietat onclick d'element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Assignar una funció externa a un esdeveniment d'un element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&lt;br /&gt;
// Executar una funció i guardar el seu resultat en una propietat d'un element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El gran avantatge d'aquest mètode és que el codi XHTML resultant és molt &amp;quot;net&amp;quot;, ja que no es barreja amb el codi Javascript. A més, dins de les funcions externes assignades sí que es pot utilitzar la variable '''this''' per referir-se a l'element que provoca l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
L'únic inconvenient d'aquest mètode és que la pàgina s'ha de carregar completament abans que es puguin utilitzar les funcions DOM que assignen els manegadors als elements XHTML. Una de les formes més senzilles d'assegurar que cert codi es va a executar després que la pàgina es carregui per complet és utilitzar l'esdeveniment '''onload''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = muestraMensaje;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gestor d'esdeveniments amb DOM====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El mètode addEventListener ens permet incloure un gestor d'esdeveniment. La sintaxi de addEventListener és la següent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
element_que_escolta.addEventListener('event',funció_a_llançar, booleà);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''element_que_escolta'' - és qualsevol element present en un document al qual es vol associar l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
''esdeveniment'' - és el succés ocorregut sobre l'element (clic, load, ...).&lt;br /&gt;
&lt;br /&gt;
''funció_a_llançar'' - és qualsevol funció definida que vulguem que s'executi quan passi l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
''booleà'' - és un valor que defineix l'ordre del flux d'esdeveniments.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si es vol escoltar un esdeveniment només una vegada i després eliminar-ho s'ha d'utilitzar el mètode removeEventListener:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
element_que_escolta.removeEventListener ('esdeveniment',funció_a_llançar, booleà);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTA 1:'' Explicació del paràmetre booleà del mètode addEventListener amb un exemple.&lt;br /&gt;
Suposem que tenim això:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Exemple de fluix events&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;Clica aqui&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quan fem clic al div no només ho estem fent sobre ell, sinó sobre els elements que el contenen en l'arbre del DOM, és a dir, hem fet clic a més sobre l'element html i sobre l'element body. Sí només hi ha una funció assignada a una escolta per al div no hi ha major problema, però si a més hi ha una per al html i una altra per al body, quin és l'ordre en què s'han de llançar les tres funcions?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per contestar a aquesta pregunta hi ha un model de comportament, el flux d'esdeveniments (anglès). Segons aquest, quan es fa clic sobre un element, l'esdeveniment es propaga en dues fases, una que és la captura -el esdeveniment comença en el nivell superior del document i recorre els elements de pares a fills- i l'altra la bombolla -el ordre invers, ascendint de fills a pares-.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un cop vist això, podem comprendre el tercer paràmetre de addEventListener, que el que fa és permetre'ns escollir l'ordre de propagació:&lt;br /&gt;
&lt;br /&gt;
'''true''': El flux d'esdeveniments és com el representat, i la fase de captura passa en llançar l'esdeveniment. L'ordre de propagació per l'exemple seria, per tant, l'indicat, ''html-body-div.''&lt;br /&gt;
&lt;br /&gt;
'''false''': Permet saltar la fase de captura, i la propagació seguiria només la bombolla. Així, l'ordre seria ''div-body-html.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTA 2:'' A internet explorer no funciona en les versions anteriors a la 7 (inclosa).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        function alerta(){&lt;br /&gt;
            alert(this);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        window.onload = function (){&lt;br /&gt;
            var elBody = document.getElementsByTagName('body')[0];&lt;br /&gt;
            var elDiv = document.getElementById('elDiv');&lt;br /&gt;
            var elButton = document.getElementById('elButton');&lt;br /&gt;
         &lt;br /&gt;
            elBody.addEventListener('click',alerta,false);&lt;br /&gt;
            elDiv.addEventListener('click',alerta,false);&lt;br /&gt;
            elButton.addEventListener('click',alerta,false);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//event.stopPropagation();   //evita propagarse el evento en forma de burbuja&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body id=&amp;quot;body&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;elDiv&amp;quot;&amp;gt;Clica aqui&lt;br /&gt;
          &amp;lt;button id=&amp;quot;elButton&amp;quot;&amp;gt;boton&amp;lt;/button&amp;gt;&lt;br /&gt;
     &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemple d'utilització manejadores d'esdeveniments amb DOM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function muestraMensaje() {&lt;br /&gt;
  				console.log(&amp;quot;Has pulsado el ratón&amp;quot;);&lt;br /&gt;
  				elDiv.removeEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);  // borra el evento asociado de tipo click a ese elemento.&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			var elDiv = document.getElementById(&amp;quot;div_principal&amp;quot;);&lt;br /&gt;
			elDiv.addEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
En el caso que no queramos que se aplique el evento de tipo de Submit o Hipervínculo &amp;quot;&amp;lt;a&amp;gt;&amp;lt;/a&amp;gt;&amp;quot; al ser botón usaremos &amp;quot;e.preventDefault()&amp;quot; y realizará las acciones que tengamos establecidas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
window.addEventListener(&amp;quot;load&amp;quot;,ejemplo); // window.onload= ejemplo;&lt;br /&gt;
&lt;br /&gt;
	function ejemplo(){&lt;br /&gt;
			function muestraMensaje(e) {&lt;br /&gt;
  				console.log(&amp;quot;Has pulsado el ratón&amp;quot;);&lt;br /&gt;
                                e.preventDefault();  //evita que se ejecute el submit y recargue la página&lt;br /&gt;
			}&lt;br /&gt;
         document.getElementById(&amp;quot;boton&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);&lt;br /&gt;
	}      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;./index.html&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;input type=&amp;quot;submit&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;boton&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En el següent exemple, s'afegeixen esdeveniments als elements de tipus ''input=text'' d'un formulari complex:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form id=&amp;quot;formulario&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;holaa&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    function resalta() {&lt;br /&gt;
        console.log(&amp;quot;holaa&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    window.onload = function() {&lt;br /&gt;
        var formulario = document.getElementById(&amp;quot;formulario&amp;quot;);&lt;br /&gt;
        var camposInput = formulario.getElementsByTagName(&amp;quot;input&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        for(var i=0; i&amp;lt;camposInput.length; i++) {&lt;br /&gt;
            if(camposInput[i].type == &amp;quot;text&amp;quot;) {&lt;br /&gt;
                camposInput[i].onclick = resalta;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Alert ===&lt;br /&gt;
Volem provar els events de la pàgina, per fer-ho posa un alert amb un missatge en els següents casos:&lt;br /&gt;
* Al carregar-se completament la pàgina.&lt;br /&gt;
* Al clicar en un botó&lt;br /&gt;
* Al passar damunt d'un paràgraf&lt;br /&gt;
* Al passar damunt d'una imatge&lt;br /&gt;
* Al sortir del damunt d'una imatge&lt;br /&gt;
* Al clicar en un enllaç&lt;br /&gt;
&lt;br /&gt;
:[[Exercici1 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Desplegable ===&lt;br /&gt;
Es vol disposar de un menu desplegable on cada element del desplegable sigui el nom de la pàgina a la cual fa referència. Quan es seleccioni una entrada del desplegable, el navegador canvia la seva url per la del desplegable.&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 2 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Rollover ===&lt;br /&gt;
Un intercanvi d'imatge és una cosa grandiosa. L'usuari aproxima el punter del ratolí a una imatge i aquesta canvia a una altre imatge. Quan l'usuari abandona la imatge, torna a canviar a la imatge anterior. &lt;br /&gt;
Fes un programa amb javascript que reprodueixi el comportament anterior.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 3 Events]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Mostrar / Ocultar text ===&lt;br /&gt;
Donada la següent pàgina&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	function muestraOculta() {&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_1&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_1&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_2&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_2&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_3&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_3&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Realitza els següents apartats:&lt;br /&gt;
*Quan es cliqui sobre el primer enllaç, s'oculti la seva secció relacionada&lt;br /&gt;
*Quan es torni a clicar sobre el mateix enllaç, es mostri una altra vegada aquesta secció de continguts&lt;br /&gt;
*Completar la resta d'enllaços de la pàgina perquè el seu comportament sigui idèntic al del primer enllaç&lt;br /&gt;
*Quan una secció s'oculti, ha de canviar el missatge de l'enllaç associat (pista: propietat innerHTML)&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 4 Events]]&lt;br /&gt;
&lt;br /&gt;
== Obtenint informació de l'esdeveniment (objecte event)==&lt;br /&gt;
Normalment, els manegadors d'esdeveniments requereixen informació addicional per processar les seves tasques. Si una funció per exemple s'encarrega de processar l'esdeveniment onclick, potser necessiti saber que posició estava el ratolí en el moment de punxar el botó.&lt;br /&gt;
&lt;br /&gt;
No obstant això, el cas més habitual en el qual és necessari conèixer informació addicional sobre l'esdeveniment és el dels esdeveniments associats al teclat. Normalment, és molt important conèixer la tecla que s'ha premut, per exemple per diferenciar les tecles normals de les tecles especials (ENTER, tabulador, Alt, Ctrl., etc.).&lt;br /&gt;
&lt;br /&gt;
Javascript permet obtenir informació sobre el ratolí i el teclat mitjançant un objecte especial anomenat ''event''. Desafortunadament, els diferents navegadors presenten diferències molt notables en el tractament de la informació sobre els esdeveniments.&lt;br /&gt;
&lt;br /&gt;
La principal diferència resideix en la forma en la qual s'obté l'objecte event. Internet Explorer considera que aquest objecte forma part de l'objecte window i la resta de navegadors ho consideren com l'únic argument que tenen les funcions manejadoras d'esdeveniments.&lt;br /&gt;
&lt;br /&gt;
Encara que és un comportament que resulta molt estrany al principi, tots els navegadors moderns excepte Internet Explorer creen màgicament i de forma automàtica un argument que es passa a la funció manegadora, per la qual cosa no és necessari incloure-ho en la trucada a la funció manegadora. D'aquesta forma, per utilitzar aquest &amp;quot;argument màgic&amp;quot;, només és necessari assignar-li un nom, ja que els navegadors ho creen automàticament.&lt;br /&gt;
&lt;br /&gt;
En resum, en els navegadors tipus Internet Explorer, l'objecte event s'obté directament mitjançant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var esdeveniment = window.event;&lt;br /&gt;
D'altra banda, en la resta de navegadors, l'objecte event s'obté màgicament a partir de l'argument que el navegador crea automàticament:&lt;br /&gt;
&lt;br /&gt;
function manejadorEventos(elEvento) {&lt;br /&gt;
var esdeveniment = elEvento;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si es vol programar una aplicació que funcioni correctament en tots els navegadors, és necessari obtenir l'objecte event de forma correcta segons cada navegador. El següent codi mostra la forma correcta d'obtenir l'objecte event en qualsevol navegador:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function manejadorEventos(elEvento) {&lt;br /&gt;
var esdeveniment = elEvento || window.event;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una vegada obtingut l'objecte event, ja es pot accedir a tota la informació relacionada amb l'esdeveniment, que depèn del tipus d'esdeveniment produït.&lt;br /&gt;
&lt;br /&gt;
=== Informació sobre l'esdeveniment ===&lt;br /&gt;
La propietat '''type''' indica el tipus d'esdeveniment produït, la qual cosa és útil quan una mateixa funció s'utilitza per manejar diversos esdeveniments:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var tipus = esdeveniment.type;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La propietat type retorna el tipus d'esdeveniment produït, que és igual al nom de l'esdeveniment però sense el prefix '''on'''.&lt;br /&gt;
&lt;br /&gt;
Mitjançant aquesta propietat, es pot refer de forma més senzilla l'exemple anterior en el qual es ressaltava una secció de continguts en passar el ratolí per damunt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ressalta(elEvento) {&lt;br /&gt;
    var esdeveniment = elEvento || window.event;&lt;br /&gt;
    switch(esdeveniment.type) {&lt;br /&gt;
         case 'mouseover':&lt;br /&gt;
               this.style.borderColor = 'black';&lt;br /&gt;
               break;&lt;br /&gt;
         case 'mouseout':&lt;br /&gt;
               this.style.borderColor = 'silver';&lt;br /&gt;
               break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
       document.getElementById(&amp;quot;seccion&amp;quot;).onmouseover = ressalta;&lt;br /&gt;
       document.getElementById(&amp;quot;seccion&amp;quot;).onmouseout = ressalta;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;div id=&amp;quot;seccion&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot;&amp;gt;&lt;br /&gt;
  Secció de continguts...&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Informació sobre els esdeveniments de teclat ===&lt;br /&gt;
De tots els esdeveniments disponibles en Javascript, els esdeveniments relacionats amb el teclat són els més incompatibles entre diferents navegadors i per tant, els més difícils de manegar. En primer lloc, existeixen moltes diferències entre els navegadors, els teclats i els sistemes operatius dels usuaris, principalment a causa de les diferències entre idiomes.&lt;br /&gt;
&lt;br /&gt;
A més, existeixen tres esdeveniments diferents per a les pulsacions de les tecles ('''onkeyup''', '''onkeypress''' i '''onkeydown'''). Finalment, existeixen dos tipus de tecles: les tecles normals (com a lletres, nombres i símbols normals) i les tecles especials (com ENTER, Alt, Shift, etc.)&lt;br /&gt;
&lt;br /&gt;
Quan un usuari prem una tecla normal, es produeixen tres esdeveniments seguits i en aquest ordre: &lt;br /&gt;
*'''onkeydown''', &lt;br /&gt;
*'''onkeypress''' i &lt;br /&gt;
*'''onkeyup'''. &lt;br /&gt;
L'esdeveniment '''onkeydown''' es correspon amb el fet de prémer una tecla i no deixar-la anar; l'esdeveniment '''onkeypress''' és la pròpia pulsació de la tecla i l'esdeveniment '''onkeyup''' fa referència al fet de deixar anar una tecla que estava premuda.&lt;br /&gt;
&lt;br /&gt;
La forma més senzilla d'obtenir la informació sobre la tecla que s'ha premut és mitjançant l'esdeveniment '''onkeypress'''. La informació que proporcionen els esdeveniments '''onkeydown''' i '''onkeyup''' es pot considerar com més tècnica, ja que retornen el ''codi intern'' de cada tecla i no el caràcter que s'ha premut.&lt;br /&gt;
&lt;br /&gt;
A continuació s'inclou una llista amb totes les propietats diferents de tots els esdeveniments de teclat tant en Internet Explorer com en la resta de navegadors:&lt;br /&gt;
&lt;br /&gt;
*Esdeveniment keydown:&lt;br /&gt;
**Mateix comportament en tots els navegadors:&lt;br /&gt;
***Propietat keyCode: codi intern de la tecla&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
*Esdeveniment keypress:&lt;br /&gt;
**Internet Explorer:&lt;br /&gt;
***Propietat keyCode: el codi del caràcter de la tecla que s'ha premut&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
**Resta de navegadors:&lt;br /&gt;
**Propietat keyCode: per a les tecles normals, no definit. Per a les tecles especials, el codi intern de la tecla.&lt;br /&gt;
**Propietat charCode: per a les tecles normals, el codi del caràcter de la tecla que s'ha premut. Per a les tecles especials, 0.&lt;br /&gt;
*Esdeveniment keyup:&lt;br /&gt;
**Mateix comportament en tots els navegadors:&lt;br /&gt;
***Propietat keyCode: codi intern de la tecla&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
Per convertir el codi d'un caràcter (no confondre amb el codi intern) al caràcter que representa la tecla que s'ha premut, s'utilitza la funció ''String.fromCharCode().''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    window.onkeydown = teclado;&lt;br /&gt;
    window.onkeypress = teclado;&lt;br /&gt;
    window.onkeyup = teclado;&lt;br /&gt;
&lt;br /&gt;
    function teclado(magica) {&lt;br /&gt;
        var e = magica || window.event; // para salvar las deficiencias de IE=window.event&lt;br /&gt;
        mostrar(e.type, e.keyCode, e.which, e.charCode, e.key);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function mostrar(evento, keyCode, which, charCode, key) {&lt;br /&gt;
      &lt;br /&gt;
        let cadena =  &amp;quot;&amp;lt;b&amp;gt; Evento: &amp;lt;/b&amp;gt;&amp;quot; + evento &lt;br /&gt;
                     + &amp;quot; ==&amp;gt; &amp;lt;b&amp;gt; keyCode: &amp;lt;/b&amp;gt;&amp;quot; + keyCode &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; which: &amp;lt;/b&amp;gt;&amp;quot; + which &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; charCode: &amp;lt;/b&amp;gt;&amp;quot;+ charCode &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; key: &amp;lt;/b&amp;gt;&amp;quot;+ key &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; FromCharCode: &amp;lt;/b&amp;gt;&amp;quot;+String.fromCharCode(charCode)+&amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         let info = document.getElementById(&amp;quot;info&amp;quot;); //display&lt;br /&gt;
         info.innerHTML += cadena&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;info&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://sospedia.net/pinchar-el-teclado-en-javascript/&lt;br /&gt;
&lt;br /&gt;
https://www.w3.org/2002/09/tests/keys-cancel2.html&lt;br /&gt;
&lt;br /&gt;
==== Exercici Teclat ====&lt;br /&gt;
Crea un script que mostri per pantalla la següent informació cada vedada que es premi una tecla:&lt;br /&gt;
* Caràcter permut  (amb key i StringCharCode)&lt;br /&gt;
* Tipus event (keydown, keypress, keyup)&lt;br /&gt;
* Propietat keycode&lt;br /&gt;
* Propietat charcode&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 5 events]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== informació sobre els esdeveniments de ratolí ===&lt;br /&gt;
La informació més rellevant sobre els esdeveniments relacionats amb el ratolí és la de les coordenades de la posició del punter del ratolí. Encara que l'origen de les coordenades sempre es troba en la cantonada superior esquerra, el punt que es pren com a referència de les coordenades pot variar.&lt;br /&gt;
&lt;br /&gt;
D'aquesta forma, és possible obtenir la posició del ratolí respecte de la pantalla de l'ordinador, respecte de la finestra del navegador i respecte de la pròpia pàgina HTML (que s'utilitza quan l'usuari ha fet scroll sobre la pàgina). Les coordenades més senzilles són les que es refereixen a la posició del punter respecte de la finestra del navegador, que s'obtenen mitjançant les propietats clientX i clientY:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function muestraInformacion(elEvento) {&lt;br /&gt;
   var esdeveniment = elEvento || window.event;&lt;br /&gt;
   var coordenadaX = esdeveniment.clientX;&lt;br /&gt;
   var coordenadaY = esdeveniment.clientY;&lt;br /&gt;
   alert(&amp;quot;Has premut el ratolí en la posició: &amp;quot; + coordenadaX + &amp;quot;, &amp;quot; + coordenadaY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.onclick = muestraInformacion;&lt;br /&gt;
//document.addeventlistener(click,&amp;quot;muestraInformacion&amp;quot;,false);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les coordenades de la posició del punter del ratolí respecte de la pantalla completa de l'ordinador de l'usuari s'obtenen de la mateixa forma, mitjançant les propietats '''screenX''' i '''screenY''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var coordenadaX = esdeveniment.screenX;&lt;br /&gt;
var coordenadaY = esdeveniment.screenY;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En moltes ocasions, és necessari obtenir un altre parell de coordenades diferents: les que corresponen a la posició del ratolí respecte de l'origen de la pàgina. Aquestes coordenades no sempre coincideixen amb les coordenades respecte de l'origen de la finestra del navegador, ja que l'usuari pot fer scroll sobre la pàgina web. Internet Explorer no proporciona aquestes coordenades de forma directa, mentre que la resta de navegadors sí que ho fan. D'aquesta forma, és necessari detectar si el navegador és de tipus Internet Explorer i en cas afirmatiu realitzar un càlcul senzill:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Detectar si el navegador és Internet Explorer&lt;br /&gt;
var ie = navigator.userAgent.toLowerCase().indexOf('msie')!=-1;&lt;br /&gt;
&lt;br /&gt;
if(ie) {&lt;br /&gt;
     coordenadaX = esdeveniment.clientX + document.body.scrollLeft;&lt;br /&gt;
     coordenadaY = esdeveniment.clientY + document.body.scrollTop;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
     coordenadaX = esdeveniment.pageX;&lt;br /&gt;
     coordenadaY = esdeveniment.pageY;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;Has premut el ratolí en la posició: &amp;quot; + coordenadaX + &amp;quot;, &amp;quot; + coordenadaY + &amp;quot; respecte de la pàgina web&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La variable '''ie''' val '''true''' si el navegador en el qual s'executa el script és de tipus Internet Explorer (qualsevol versió) i val '''false''' en un altre cas. Per a la resta de navegadors, les coordenades respecte de l'origen de la pàgina s'obtenen mitjançant les propietats '''pageX''' i '''pageY'''. En el cas d'Internet Explorer, s'obtenen sumant la posició respecte de la finestra del navegador (clientX, clientY) i el desplaçament que ha sofert la pàgina (document.bodi.scrollLeft, document.bodi.scrollTop).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Client_page_screen.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gràfics senzills amb canvas ===&lt;br /&gt;
Amb els esdeveniments de teclat i ratolí podrem programar jocs senzills. Només ens caldrà saber com situar i moure gràfics per la pantalla. Amb aquesta finalitat ens serà d'ajuda l'ús de l'element '''canvas''' de HTML.&lt;br /&gt;
&lt;br /&gt;
Al següent exemple definim un canvas (llenç) de 800x600 píxels i hi situem la imatge d'un cotxe a la coordenada (400,300). &lt;br /&gt;
&amp;lt;source lang=&amp;quot;HTML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;canvas id=&amp;quot;myCanvas&amp;quot; width=&amp;quot;800&amp;quot; height=&amp;quot;600&amp;quot; style=&amp;quot;background-color: lightskyblue;&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img id=&amp;quot;cotxe&amp;quot; src=&amp;quot;cotxe.jpg&amp;quot; style=&amp;quot;display: none;&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var canvas;&lt;br /&gt;
var ctx;&lt;br /&gt;
var imatge;&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
         canvas= document.getElementById(&amp;quot;myCanvas&amp;quot;);&lt;br /&gt;
         ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
         imatge=document.getElementById(&amp;quot;cotxe&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ctx.drawImage(imatge,400,300);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si volem simular el moviment de la imatge haurem l'haurem d'esborrar de la posició antiga i tornar-la a dibuixar a la nova posició. Per borrar la imatge podem dibuixar un rectangle del color de fons del canvas sobre la imatge amb les instruccions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
ctx.fillStyle = &amp;quot;lightskyblue&amp;quot;&lt;br /&gt;
ctx.fillRect(0,300,100,66);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'exemple dibuixem al canvas un triangle de color lightskyblue a la coordenada (0,300) i de dimensions 100x66.&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Coordenades del punter ===&lt;br /&gt;
Crea una pàgina on es mostri constantment les coordenades del punter dins de la pàgina (propietats clientX, clientY).&lt;br /&gt;
&lt;br /&gt;
=== event MOUSEOVER ===&lt;br /&gt;
Crea una pàgina de contingut lliure que tingui els següents elements:&lt;br /&gt;
*Títol (capçalera H1)&lt;br /&gt;
*Tres paràgrafs que continguin una imatge alineada a la dreta o a l'esquerra del text. La longitud del text de cada paràgraf serà prou extensa per a superar l'alçada de la imatge respectiva.&lt;br /&gt;
*Tres títols (capçalera H2) que precediran cadascun dels paràgrafs.&lt;br /&gt;
Programa les respostes als events MOUSEOVER de cada element de forma que:&lt;br /&gt;
*tots els elements de text (quatre capçaleres i tres paràgrafs) canviin de format quan tenen el punter del ratolí al damunt. Cada element de text tornarà al seu format original quan el punter ja no sigui al damunt&lt;br /&gt;
*les imatges giraran en sentit horari quan tinguin el punter al damunt i deixaran de fer-ho quan el punter ja no sigui al damunt.&lt;br /&gt;
&lt;br /&gt;
=== Ordre dels events ===&lt;br /&gt;
Crea una pàgina amb quatre seccions DIV aniuades i etiquetades amb els noms div1, ... , div4:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;div1&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div2&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div3&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div4&amp;quot;&amp;gt;contingut random...&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Crea funcions de resposta a l'event CLICK per a cada element DIV que escrigui un missatge de l'estil &amp;quot;Has clickat sobre l'element div1&amp;quot;.&lt;br /&gt;
Com aconseguiries que l'ordre en què es disparen els elements siguin els següents?:&lt;br /&gt;
*div1,div2,div3,div4&lt;br /&gt;
*div4,div3,div2,div1&lt;br /&gt;
*div1,div3,div4,div2&lt;br /&gt;
&lt;br /&gt;
=== Event document.onload ===&lt;br /&gt;
Crea una pàgina on sigui imprescindible assignar les funcions de resposta a events quan es dispara l'event document.onload.&lt;br /&gt;
&lt;br /&gt;
=== Estrella Michelin ===&lt;br /&gt;
&lt;br /&gt;
Un restaurant té 4 tapes principals on cadascuna té un preu  1 €, 2 €, 3 € i 4 € (esquerra a dreta). &lt;br /&gt;
&lt;br /&gt;
Com el local és petit, es disposa de dos cambrers, cadascun d'ells té un botó que l'executarà en el cas de servir una tapa. Quan un cambrer serveixi una tapa haurà:&lt;br /&gt;
*1. Primer seleccionar-se amb el botó&lt;br /&gt;
*2. Clicar a la tapa o tapes servides.&lt;br /&gt;
&lt;br /&gt;
Cada vegada que el cambrer faci click a una tapa el seu preu s'incrementarà en la recaudació del cambrer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Michelin.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
:[[solucio michelin]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Fitxer:Gamepad.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
Dibuixa un rectangle i que es mova en funció del joystick, i mostre per pantalla els diferents botons.&lt;br /&gt;
 &lt;br /&gt;
http://html5gamepad.com&lt;br /&gt;
&lt;br /&gt;
:[[ejm_gamepad]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ratolí i Teclat ===&lt;br /&gt;
a) Es vol que el ratolí, en qualsevol punt de la finestra del navegador, es mostri la posició del punter respecte del navegador i respecte de la pàgina.&lt;br /&gt;
[[Fitxer:ex_ratoli.gif|100px]]&lt;br /&gt;
&lt;br /&gt;
b) Es vol que, a més a més, en prémer qualsevol tecla, el missatge mostrat ha de canviar per indicar el nou esdeveniment i la seva informació associada.&lt;br /&gt;
[[Fitxer:ex_teclat.gif|100px]]&lt;br /&gt;
&lt;br /&gt;
c)Afegir la següent característica al script: quan es prem un botó del ratolí, el color de fons del quadre de missatge ha de ser groc (#FFFFCC) i quan es prem una tecla, el color de fons ha de ser blau (#CCE6FF). En tornar a moure el ratolí, el color de fons torna a ser blanc.&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fitxer:ex_tec_rat_color.gif|200px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 6 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Posició ratolí ===&lt;br /&gt;
Crear un script que informi a l'usuari en què zona de la pantalla ha premut el ratolí. Les zones definides són les següents: esquerra a dalt, esquerra a baix, dreta a dalt i dreta a baix.&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 7 Events]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Cuadrat===&lt;br /&gt;
&lt;br /&gt;
Es desitja que un cuadrat es mova al llarg de la pantalla&lt;br /&gt;
&lt;br /&gt;
:[[sol_cuadrat]]&lt;br /&gt;
&lt;br /&gt;
=== Joc Tenis ===&lt;br /&gt;
Es tracta de implementar en Javascript un dels 1ers jocs que es va inventar per a PC. El joc del Tenis. &lt;br /&gt;
[[Fitxer:tenis.png|400px|center]]&lt;br /&gt;
Per començar el joc s'ha de pulsar la tecla 'S', per parar 'P' i per reinicializar la 'R'.&lt;br /&gt;
&lt;br /&gt;
Jugador 1:&lt;br /&gt;
*Utilitza el ratolí per el desplaçament de la raqueta&lt;br /&gt;
Jugador 2:&lt;br /&gt;
*tecla '↑' per desplaçar la raqueta cap a dalt&lt;br /&gt;
*tecla '↓' per desplaçar la raqueta cap a baix&lt;br /&gt;
Altres aspectes del joc&lt;br /&gt;
*A més a més, hi ha un marcador que indiqui qui va guanyant.&lt;br /&gt;
*També hi ha un botó, per exemple F2, per augmentar el número de pilotes&lt;br /&gt;
*També hi ha un botó per canviar els colors del joc. Pot existir diversos temes (F5-F8)&lt;br /&gt;
&lt;br /&gt;
https://www.w3schools.com/html/html5_draganddrop.asp&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Expressions Regulars =&lt;br /&gt;
Les expressions regulars son una necessitat a l'hora de validar formularis. Alguns problemes de validació no es podrien solucionar de una manera elegant sense elles.&lt;br /&gt;
Les expressions regulars son senzillament una manera d'expresar un patró per a cadenes coincidents de text. La expressions contenen termes i operadors que ens pemeten definir els patrons.&lt;br /&gt;
&lt;br /&gt;
== Creació d'expresions regulars ==&lt;br /&gt;
A Javascript, com succeeix amb la majoria d'objectes, existeixen dos formes de crear expresions regulars: &lt;br /&gt;
*mitjançant un literal&lt;br /&gt;
*creant una instància d'un objecte de tipus '''RegExp'''&lt;br /&gt;
&lt;br /&gt;
La creació d'una expressió regular amb un literal és molt sezill. Veïem un exemple. Volem crear una expressió regular que coincideixi exactament amb el string &amp;quot;test&amp;quot;:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = /test/;&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
Les expresions regulars van envoltades del caràctes /. Igual que els String van envoltades del caràcter &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
També podíem haver creat una instància del objecte RegExp de la següent manera:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = new RegExp(&amp;quot;test&amp;quot;);&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificadors ha utilitzar a l'hora de crear expressions regulars ==&lt;br /&gt;
A més a més de la propia expressió regular, podem introduïr els següents modificadors:&lt;br /&gt;
*''i'': Fa que no distingeixi de majúscules i minúscules. ex: /test/i&lt;br /&gt;
*''g'': Realitza una comparació global, en comptes de parar-se després de la primera coincidència.&lt;br /&gt;
*''m'': Realitza una comparació multilínia (més detalls a https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/multiline )&lt;br /&gt;
Exemple d'ús:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = /test/ig&lt;br /&gt;
var pattern2 = new RegExp(&amp;quot;test&amp;quot;,&amp;quot;ig&amp;quot;);&lt;br /&gt;
//exemple d'us de la expressió regular&lt;br /&gt;
alert(pattern.test(&amp;quot;test&amp;quot;));&lt;br /&gt;
alert(pattern2.test(&amp;quot;test&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termes i Operadors ==&lt;br /&gt;
&lt;br /&gt;
*''Coincidència exacta'': Tot lo que no sigui un caràcter especial o un operador haurà d'apareixer de forma literal en la expressió. Ex: /test/ la paraula '''test'' ha d'aparèixer exactament.&lt;br /&gt;
*''Combinacions de caràcters'': Moltes vegades no volem combinar un caràcter literal específic, sino un grup finit de caràcters. Podem especificar-ho col·locant el grup de caràcters que volem combinar entre claudàtors. Ex: [abc]&lt;br /&gt;
*''Combinacions de caràcters excloents'': Altres vegades volem combinar tots els caràcters trets d'uns quants. Per fer-ho podem utilitzar el símbol ''^'' seguit dels caràcters que no volem en la expresió. Ex: [^abc]. &lt;br /&gt;
*''Rang de valors'': També tenim la habilitat d'especificar un rang de valors. Ex: volem qualsevol caràcter entre '''a''' i '''m''' minmúscula --&amp;gt; [a-m] (ambdós incloses).&lt;br /&gt;
&lt;br /&gt;
=== Caràcters especials ===&lt;br /&gt;
Existeixen caràcters especials en les expresions regulars, de fet, ja hem vist uns quants: '''[''', ''']''', '''-''' i '''^'''.&lt;br /&gt;
Però encara hi ha uns quants més com serien el '''$''', '''{''', '''}''', '''?''', ''',''', '''+''' i el '''.'''&lt;br /&gt;
Com podem fer per utilitzar-los de forma literal en comptes d'utilitzar-los com a operadors de les expressions regulars? Escapant-los.&lt;br /&gt;
Però com? Utilitzant un caràcter especial: ''\''. Ex: La expressió regular '''/\[/''' significa el caràcter '''[''' i no l'inici d'un grup de caràcters.  &lt;br /&gt;
Així mateix, per poder utilitzar el caràcter '''\''' dintre de la expressió regular l'haurem d'escapar. Ex: '''\\''' correspon al literal '''\'''.&lt;br /&gt;
&lt;br /&gt;
=== Principis i finals ===&lt;br /&gt;
A vegades volem que un patró coincideixi amb el principi d'una cadena o amb el final. &lt;br /&gt;
*Principi: Utilitzarem el caràcter ''^''. Ex: /^test/ : només coincideix si la cadena '''test''' coincideix amb el principi.&lt;br /&gt;
*Final: Utilitzarem el caràcter ''$''. Ex: /test$/ : només coincideix si la cadena '''test''' coincideix amb el final.&lt;br /&gt;
*Principi i final: Ex: /^test$/ : Indica que el patró especificat ha d'incluir tota la cadena candidata.&lt;br /&gt;
&lt;br /&gt;
=== Repetició de caràcters ===&lt;br /&gt;
&lt;br /&gt;
Si volem combinar una serie de quatre caràcters 'a' podem expressar-ho amb ''/aaa/'' però que succeeix si volem utilitzar un número qualsevol de repeticions del mateix caràcter?&lt;br /&gt;
Tenim diferents opcions:&lt;br /&gt;
*Podem especificar que un caràcter és opcional, es a dir, &amp;lt;b&amp;gt;pot aparèixer alguna vegada o cap (0 ó 1)&amp;lt;/b&amp;gt;, Es fa afegint el caràcter '''''?''''' al final. Exemple: /t?est/. Aquest patró combina dues opcions: '''test i est'''.&lt;br /&gt;
*Si volem que un caràcter '''apareixi moltes vegades (1 o més)''' utilitzarem '''''+'''''. Ex: /t+est/. Aquest patró combina '''test''', '''ttest''' i '''tttest''' però no '''est'''.&lt;br /&gt;
*Si volem que un '''caràcter apareixi zero o més vegades (0 o més)''' utilitzem el caràcter '''*'''. Ex: /t*est/. Aquest patró combina '''test''', '''ttest''', '''tttest''' i també '''est'''.&lt;br /&gt;
*Podem especificar una quantitat concreta amb el número de repeticions permeses entre claudàtors '''''{}'''''Text en negreta. Per exemple, /a{4}/ indica una coincidència de quatre caràcters 'a' consecutius.&lt;br /&gt;
*També podem especificar un intérval per al compte de repeticions. Per exemple, /a{4,10}/ indica una combinació de 4 a 10 caracters 'a' consecutius.&lt;br /&gt;
*Si en aquest interval no s'indica el segon valor de l'intèrval indiquem que el número final és infinit. Ex: /a{4,}/. Aquest patró combina qualsevol cadena de cuatre o més caràcters 'a' consecutius. Fixat que és important posar la '''coma''' després del 4.&lt;br /&gt;
&lt;br /&gt;
=== Caràcters predefinits ===&lt;br /&gt;
La sintaxis de les expressions regulars ens proporcionen un nombre de termes predefinits que representen caràcters o clases de caràcters que s'utilitzen amb freqüència. &lt;br /&gt;
Taula:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Terme Predefinit&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Equivalència&lt;br /&gt;
|-&lt;br /&gt;
| \t ||Tabulació horitzontal&lt;br /&gt;
|-&lt;br /&gt;
| \b ||Retrocés&lt;br /&gt;
|-&lt;br /&gt;
| \v ||Tabulació Vertical&lt;br /&gt;
|-&lt;br /&gt;
| \f||Salt de página&lt;br /&gt;
|-&lt;br /&gt;
| \r||Retorn de carro.&lt;br /&gt;
|-&lt;br /&gt;
| \n||Nova linia&lt;br /&gt;
|-&lt;br /&gt;
| \cA : \cZ||Caràcters de control&lt;br /&gt;
|-&lt;br /&gt;
| \x0000 : \xFFFF||Unicode Hexadecimal&lt;br /&gt;
|-&lt;br /&gt;
|  \x00 : \xFF||ASCII Hexadecimal&lt;br /&gt;
|-&lt;br /&gt;
| .||Qualsevol caràcter, excepte nova linia&lt;br /&gt;
|-&lt;br /&gt;
|  \d||Qualsevol dígit decimal. Equivalent a [0-9]&lt;br /&gt;
|-&lt;br /&gt;
| \D||Qualsevol caràcter menys un dígit decimal. Equivalent a [^0-9]&lt;br /&gt;
|-&lt;br /&gt;
| \w||Qualsevol caràcter alfanuméric incloent el subratllat. [A-Za-z0-9_]&lt;br /&gt;
|-&lt;br /&gt;
| \W||Qualsevol caràcter menys els alfanumèric i el subratllat. [^A-Za-z0-9_]&lt;br /&gt;
|-&lt;br /&gt;
| \s||Qualsevol espai en blanc (espai, tabulador, salt de pàgina,etc.)&lt;br /&gt;
|-&lt;br /&gt;
| \S||Qualsevol caràcter menys un espai en blanc.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Per veure el llistat complert fes click [http://www.visibone.com/regular-expressions/ aquí].&lt;br /&gt;
&lt;br /&gt;
=== Agrupació de caràcters ===&lt;br /&gt;
De moment, hem observat que els operadors + i * només afecten al terme que els '''precedeix'''. Si volem aplicar-los a un grup de termes, podem utilitzar ''parèntesis'', igual que si es tractés d'una formula matemàtica. Per exemple: /(ab)+/. Aquest patró combina una o més aparicions de la cadena '''ab'''.&lt;br /&gt;
&lt;br /&gt;
=== Alternància de caràcters ===&lt;br /&gt;
La alternància pot expressar-se utilitzant el caràcter '''|'''. Per exemple: /a|b/ combina el caràcter '''a''' o '''b''', i /(ab)+|(cd)+/ combina només una o més repeticions de '''ab''' o '''cd'''.&lt;br /&gt;
&lt;br /&gt;
== Mètodes de les Expressions Regulars ==&lt;br /&gt;
*''pattern.test(cadena)'' : Executa la expressió regular e indica si la cadena passada per paràmetre coincideix o no. (retorna True o False)&lt;br /&gt;
*''pattern.exec(cadena)'' : Executa la expressió regular i retorna la primera coincidència.&lt;br /&gt;
== Resum Expressions Regulars ==&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Expresiones.jpg]]&lt;br /&gt;
[http://rua.ua.es/dspace/bitstream/10045/13363/6/07c-JavaScriptExpReg.pdf Resum Expressions Regulars]&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.regexr.com/ Comprovar expressions regulars]&lt;br /&gt;
&lt;br /&gt;
[https://regex101.com/ Comprovar expressions regulars II]&lt;br /&gt;
&lt;br /&gt;
Crea un patró per a cadascuna de les diferents cadenes que es mostren a continuació:&lt;br /&gt;
&lt;br /&gt;
*Codi postal. Ex: 46700&lt;br /&gt;
*Numero de telèfon amb prefix i guións, el primer nombre pot ser un 8 ó 9. Ex: 93-123-11-33&lt;br /&gt;
*Numero de telèfon amb prefix i punts. Ex: 93-1.231.1339&lt;br /&gt;
*Numero de telèfon internacional. Ex: (+34)952356817 &lt;br /&gt;
*Nom d'usuari amb un mínim de 4 i un màxim de 15. Ex: julio_30&lt;br /&gt;
*Nombre Real. Ex:  -122.33 ó 7,3 ó 8 &lt;br /&gt;
*Numero ISBN de 13 dígits: 978-3-16-148410-0&lt;br /&gt;
*Numero de la seguretat social: 01-123456789&lt;br /&gt;
*Adreça Postal amb les següent condicions: Carrer (C\), Plaza(Pz.), Avinguda(Av.). Direcció. Numero - Porta.&lt;br /&gt;
Ex: C\ Mare de Deu de montserrat. 233 - 2&lt;br /&gt;
*Numero IP d'un ordinador de la versió 4.&lt;br /&gt;
*Numero Mac d'un ordinador separats per ':'&lt;br /&gt;
*URL (amb http, https, www, etc)&lt;br /&gt;
*Data: Ex: DD/MM/AAAA&lt;br /&gt;
*Hora: 23:55:55&lt;br /&gt;
*Email&lt;br /&gt;
*Comprobar un nombre propio&lt;br /&gt;
*Targeta de crèdit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Codi postal. Ex: 46700&lt;br /&gt;
**sol: ^\d{5}$ &lt;br /&gt;
*Numero de telèfon amb prefix i guións, el primer nombre pot ser un 8 ó 9. Ex: 93-123-11-33&lt;br /&gt;
**sol: ^[89](\d-\d{3})-\d{2}-\d{2}$&lt;br /&gt;
*Numero de telèfon amb prefix i punts. Ex: 93-1.231.1339&lt;br /&gt;
**sol: ^[89](\d-\d.)\d{3}\.\d{3}$&lt;br /&gt;
*Numero de telèfon internacional. Ex: (+34)952356817 &lt;br /&gt;
**sol: ^\(\+\d{2,3}\)\d{9}$&lt;br /&gt;
*Nom d'usuari amb un mínim de 4 i un màxim de 15. Ex: julio_30&lt;br /&gt;
**sol: ^[a-z\d_]{4,15}$&lt;br /&gt;
*Nombre Real. Ex:  -122.33 ó 7,3 ó 8 &lt;br /&gt;
**sol: ^[+-]?\d+([,.]\d+)?$    &lt;br /&gt;
*Numero ISBN de 13 dígits: 978-3-16-148410-0&lt;br /&gt;
*Numero de la seguretat social: 01-123456789&lt;br /&gt;
**sol: ^\d{2}-\d{9}$&lt;br /&gt;
**sol: ^[0-1]{2}-\d{9}$&lt;br /&gt;
*Adreça Postal amb les següent condicions: Carrer (C\), Plaza(Pz.), Avinguda(Av.). Direcció. Numero - Porta.&lt;br /&gt;
Ex: C\ Mare de Deu de montserrat. 233 - 2&lt;br /&gt;
**sol: ^((C\\)|(Pz\.)|(Av\.))\s.+\.\s\d{1,5}\s-\s\d$&lt;br /&gt;
((C\\)|(Pz\.)|(Av\.))[a-zA-Z ]+\.[0-9 ]+\-[0-9 ]+&lt;br /&gt;
*Numero IP d'un ordinador de la versió 4.&lt;br /&gt;
** sol: ^((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]?)\.)((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]|[0-9])\.){2}((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]|[0-9]))$&lt;br /&gt;
 ^(?:\d{1,3}\.){3}\d{1,3}$&lt;br /&gt;
*Numero Mac d'un ordinador separats per ':'&lt;br /&gt;
*URL (amb http, https, www, etc)&lt;br /&gt;
**sol:(www\.|http:\/\/|https:\/\/)\S*\.(com|es|org))&lt;br /&gt;
*Data: Ex: DD/MM/AAAA&lt;br /&gt;
**sol: ^\d{1,2}\/\d{1,2}\/\d{2,4}$ &lt;br /&gt;
         ^([3][0-1]|[0-2][0-9])\/[0-1]?[0-2]\/[1-2]\d{3}$  coge hasta el día 31 y el mes 12 &lt;br /&gt;
*Hora: 23:55:55&lt;br /&gt;
**sol: ^(0[1-9]|1\d|2[0-3]):([0-5]\d):([0-5]\d)$ &lt;br /&gt;
*Email&lt;br /&gt;
**sol: /^[\w]+@{1}[\w]+\.[a-z]{2,3}$/&lt;br /&gt;
**sol: ^[\\w-]+(\\.[\\w-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$ &lt;br /&gt;
*Comprobar un nombre propio&lt;br /&gt;
**sol: /^([A-Z]{1}[a-zñáéíóú]+[\s]*)+$/ &lt;br /&gt;
*Targeta de crèdit&lt;br /&gt;
**sol:  ^((67\d{2})|(4\d{3})|(5[1-5]\d{2})|(6011))(-?\s?\d{4}){3}|(3[4,7])\ d{2}-?\s?\d{6}-?\s?\d{5}$&lt;br /&gt;
&lt;br /&gt;
= Formularis =&lt;br /&gt;
JavaScript disposa de nombroses propietats i funcions que faciliten la programació d'aplicacions que manegen formularis. En primer lloc, quan es carrega una pàgina web, el navegador crea automàticament una matriu anomenat forms i que conté la referència a tots els formularis de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Per accedir al array forms , s'utilitza l'objecte document , de manera que document.forms és la matriu que conté tots els formularis de la pàgina. Com es tracta d'un array, l'accés a cada formulari es realitza amb la mateixa sintaxi dels arrays. La següent instrucció accedeix al primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més de l'array de formularis, el navegador crea automàticament una matriu anomenat ''elements'' per cadascun dels formularis de la pàgina. Cada array elements conté la referència a tots els elements (quadres de text, botons, llistes desplegables, etc.) d'aquest formulari. Utilitzant la sintaxi dels arrays, la següent instrucció obté el primer element del primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]. elements [0]; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La sintaxi dels arrays no sempre és tan concisa. El següent exemple mostra com obtenir directament l'últim element del primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]. elements [document. forms [0]. elements. length - 1];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Encara que aquesta forma d'accedir als formularis és ràpida i senzilla, té un inconvenient molt greu. Què passa si canvia el disseny de la pàgina i en el codi HTML es canvia l'ordre dels formularis originals o s'afegeixen nous formularis? El problema és que &amp;quot;el primer formulari de la pàgina&amp;quot; ara podria ser un altre formulari diferent al que espera l'aplicació.&lt;br /&gt;
&lt;br /&gt;
En un entorn tan canviant com el disseny web, és molt difícil confiar que l'ordre dels formularis es mantingui estable en una pàgina web. Per aquest motiu, sempre s'hauria d'evitar l'accés als formularis d'una pàgina mitjançant l'array ''document.forms''.&lt;br /&gt;
&lt;br /&gt;
Una forma d'evitar els problemes del mètode anterior consisteix a accedir als formularis d'una pàgina a través del seu nom (atribut '''name''') o a través del seu atribut '''id''' . L'objecte document permet accedir directament a qualsevol formulari mitjançant la seva atribut '''name''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var formularioPrincipal = document. formulari;&lt;br /&gt;
 var formularioSecundario = document. otro_formulario;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/ Form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;otro_formulario&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Accedint d'aquesta forma als formularis de la pàgina, l'script funciona correctament encara que es reordenin els formularis o s'afegeixin nous formularis a la pàgina. Els elements dels formularis també es poden accedir directament mitjançant el seu atribut '''name''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  var formularioPrincipal = document. formulari;&lt;br /&gt;
 var primerElemento = document. formulari. element;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;Input type = &amp;quot;text&amp;quot; name = &amp;quot;element&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Òbviament, també es pot accedir als formularis i als seus elements utilitzant les funcions DOM d'accés directe als nodes. El següent exemple utilitza l'habitual funció '''document.getElementById()''' per accedir de forma directa a un formulari i un dels seus elements:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var formularioPrincipal = document. getElementById (&amp;quot;formulari&amp;quot;);&lt;br /&gt;
 var primerElemento = document. getElementById (&amp;quot;element&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot; id = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;Input type = &amp;quot;text&amp;quot; name = &amp;quot;element&amp;quot; id = &amp;quot;element&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Independentment del mètode utilitzat per obtenir la referència a un element de formulari, cada element disposa de les següents propietats útils per al desenvolupament de les aplicacions:&lt;br /&gt;
*''type'' : indica el tipus d'element que es tracta. Per als elements de tipus &amp;lt;input&amp;gt; ( text , button , checkbox , etc.) coincideix amb el valor del seu atribut '''type''' . Per a les llistes desplegables normals (element &amp;lt;select&amp;gt; ) el seu valor és '''select-one''' , el que permet diferenciar-les de les llistes que permeten seleccionar diversos elements alhora i el tipus és '''select-multiple'''. Finalment, en els elements de tipus &amp;lt;textarea&amp;gt; , el valor de type és '''textarea''' .&lt;br /&gt;
*''form'' : és una referència directa al formulari al qual pertany l'element. Així, per accedir al formulari d'un element, es pot utilitzar document.getElementById(&amp;quot;id_del_elemento&amp;quot;).form&lt;br /&gt;
*''name'' : obté el valor de l'atribut name de XHTML. Només es pot llegir el seu valor, per la qual cosa no es pot modificar.&lt;br /&gt;
*''value'' : permet llegir i modificar el valor de l'atribut value de XHTML. Per als camps de text ( &amp;lt;input type=&amp;quot;text&amp;quot;&amp;gt; i &amp;lt;textarea&amp;gt; ) obté el text que ha escrit l'usuari. Per als botons obté el text que es mostra al botó. Per als elements checkbox i radiobutton no és molt útil, com es veurà més endavant&lt;br /&gt;
&lt;br /&gt;
== Validació ==&lt;br /&gt;
&lt;br /&gt;
La principal utilitat de JavaScript en el maneig dels formularis és la validació de les dades introduïdes pels usuaris. Abans d'enviar un formulari al servidor, es recomana validar mitjançant JavaScript les dades inserides per l'usuari. D'aquesta manera, si l'usuari ha comès algun error en omplir el formulari, se li pot notificar de forma instantània, sense necessitat d'esperar la resposta del servidor.&lt;br /&gt;
&lt;br /&gt;
Notificar els errors de forma immediata mitjançant JavaScript millora la satisfacció de l'usuari amb l'aplicació (el que tècnicament es coneix com &amp;quot;millorar l'experiència d'usuari&amp;quot;) i ajuda a reduir la càrrega de processament al servidor.&lt;br /&gt;
&lt;br /&gt;
Normalment, la validació d'un formulari consisteix en cridar a una funció de validació quan l'usuari prem sobre el botó d'enviament del formulari. En aquesta funció, es comproven si els valors que ha introduït l'usuari compleixen les restriccions imposades per l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Encara que hi ha tantes possibles comprovacions com a elements de formulari diferents, algunes comprovacions són molt habituals: que ompli un camp obligatori, que se seleccioni el valor d'una llista desplegable, que l'adreça d'email indicada sigui correcta, que la data introduïda sigui lògica, que s'hagi introduït un nombre on així es requereix, etc.&lt;br /&gt;
&lt;br /&gt;
A continuació es mostra el codi JavaScript bàsic necessari per incorporar la validació a un formulari:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form name=&amp;quot;formulario&amp;quot;  onSubmit=&amp;quot;return ValidaCampos()&amp;quot;&amp;gt;&lt;br /&gt;
 Teléfono: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;telefono&amp;quot; size=&amp;quot;15&amp;quot; maxlength=&amp;quot;15&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
           &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enviar&amp;quot; name=&amp;quot;enviar&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
I l'esquema de la funció validacio() és el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ValidaCampos() {&lt;br /&gt;
   var expresion_regular_telefono = /^[89](\d-\d.)\d{3}\.\d{3}$/;  &lt;br /&gt;
// 9 cifras numéricas.&lt;br /&gt;
// Usaremos el método &amp;quot;test&amp;quot; de las expresiones regulares:&lt;br /&gt;
      if (expresion_regular_telefono.test(formulario.telefono.value) == false) {&lt;br /&gt;
                alert('Campo TELEFONO no válido.');&lt;br /&gt;
                return false; // sale de la función y NO envía el formulario&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                alert('Gracias por rellenar nuestro formulario correctamente.');&lt;br /&gt;
                return true; // sale de la función y SÍ envía el formulario&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El funcionament d'aquesta tècnica de validació es basa en el comportament de l'esdeveniment '''onsubmit''' de JavaScript. Igual que altres esdeveniments com '''onclick''' i '''onkeypress''' , l'esdeveniment '''onsubmit''' varia el seu comportament en funció del valor que retorna.&lt;br /&gt;
&lt;br /&gt;
Així, si l'esdeveniment '''onsubmit''' torna el valor '''true''' , el formulari s'envia com ho faria normalment. No obstant això, si l'esdeveniment onsubmit torna el valor '''false''' , el formulari no s'envia. La clau d'aquesta tècnica consisteix a comprovar tots i cadascun dels elements del formulari. En tant es troba un element incorrecte, es torna el valor '''false''' . Si no es troba cap error, es torna el valor '''true'''.&lt;br /&gt;
&lt;br /&gt;
Per tant, en primer lloc es defineix l'esdeveniment '''onsubmit''' del formulari com:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  onsubmit = &amp;quot;return validacio()&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Com el codi JavaScript retorna el valor resultant de la funció '''validacio()''' , el formulari només s'enviarà al servidor si aquesta funció retorna '''true''' . En el cas que la funció '''validacio()''' retorni '''false''' , el formulari romandrà sense enviar.&lt;br /&gt;
&lt;br /&gt;
Dins de la funció '''validacio()''' es comproven totes les condicions imposades per l'aplicació. Quan no es compleix una condició, es retorna '''false''' i per tant el formulari no s'envia. Si s'arriba al final de la funció, totes les condicions s'han complert correctament, de manera que es retorna '''true''' i el formulari s'envia.&lt;br /&gt;
&lt;br /&gt;
La notificació dels errors comesos depèn del disseny de cada aplicació. En el codi de l'exemple anterior simplement es mostren missatges mitjançant la funció '''alert()''' indicant l'error produït. Les aplicacions web ben dissenyades mostren cada missatge d'error al costat de l'element de formulari corresponent i també solen mostrar un missatge principal indicant que el formulari conté errors.&lt;br /&gt;
&lt;br /&gt;
Un cop definit l'esquema de la funció '''validacio()''' , s'ha d'afegir a aquesta funció el codi corresponent a totes les comprovacions que es realitzen sobre els elements del formulari.&lt;br /&gt;
&lt;br /&gt;
== Validació formularis HTML5==&lt;br /&gt;
&lt;br /&gt;
[http://cybmeta.com/validacion-de-formularios-con-html5/ Validació formularis HTML5 I]&lt;br /&gt;
&lt;br /&gt;
[http://mytutorials85.blogspot.com.es/2012/04/formularios-en-html5.html?email=fdfds%40fds Validació formularis HTML5 II]&lt;br /&gt;
&lt;br /&gt;
[https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation Client-side form validation]&lt;br /&gt;
&lt;br /&gt;
== Exercicis de Validació ==&lt;br /&gt;
&lt;br /&gt;
=== Formulari de validació 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea un formulari que demani 4 camps en un textbox: nom, cognoms, email i telèfon. El formulari tindrà un botó &amp;quot;Enviar&amp;quot; que validarà el contingut dels textbox i en cas de passar les validacions s'obrirà una nova pàgina (que no cal que existeixi) amb els valors introduïts passats amb el mètode GET:&lt;br /&gt;
*tots els camps seran obligatoris&lt;br /&gt;
*el format serà el típic de cada camp&lt;br /&gt;
*mostra els missatges d'error d'un en un, per ordre i posant el focus al camp que produeix cada error&lt;br /&gt;
*usa els elements que coneixes de HTML, CSS, etc per a marcar l'error. Sigues creatiu&lt;br /&gt;
&lt;br /&gt;
=== Formulari de validació 2 ===&lt;br /&gt;
&lt;br /&gt;
Al formulari anterior afegeix els camps data de naixement, adreça, codi postal i municipi (per aquest ordre) tenint en compte:&lt;br /&gt;
*la data de naixement ha de ser vàlida, en format dd/mm/aaaa i anterior a la data actual.&lt;br /&gt;
*l'adreça estarà formada per caràcters alfanumèrics i també admetrà espais,comes i guions.&lt;br /&gt;
*el codi postal i municipi tindran el format típic d'aquests camps.&lt;br /&gt;
&lt;br /&gt;
=== solució ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.input_ok {background-color: lightcyan}&lt;br /&gt;
.input_error {background-color: rgb(255, 255, 119)}&lt;br /&gt;
.label_error {color: darkred}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body &amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Exercici 1 de Validacions&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;form name=&amp;quot;formulari&amp;quot; onSubmit=&amp;quot;return valida()&amp;quot; action=&amp;quot;ex_validacions.html&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label for=&amp;quot;nom&amp;quot;&amp;gt;Nom:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;nom&amp;quot; name=&amp;quot;nom&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_nom&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;cognoms&amp;quot;&amp;gt;Cognoms:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;cognoms&amp;quot; name=&amp;quot;cognoms&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_cognoms&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;email&amp;quot;&amp;gt;Email:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;email&amp;quot; name=&amp;quot;email&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_email&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;telefon&amp;quot;&amp;gt;Telefon:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;telefon&amp;quot; name=&amp;quot;telefon&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_telefon&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;data&amp;quot;&amp;gt;Data de naixement:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;data&amp;quot; name=&amp;quot;data&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_data&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;adreca&amp;quot;&amp;gt;Adreça:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;adreca&amp;quot; name=&amp;quot;adreca&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_adreca&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;cp&amp;quot;&amp;gt;Codi postal:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;cp&amp;quot; name=&amp;quot;cp&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_cp&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;municipi&amp;quot;&amp;gt;Municipi:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;municipi&amp;quot; name=&amp;quot;municipi&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_municipi&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body &amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function valida(){&lt;br /&gt;
&lt;br /&gt;
var nom=document.getElementById(&amp;quot;nom&amp;quot;).value;&lt;br /&gt;
var cognoms=document.getElementById(&amp;quot;cognoms&amp;quot;).value;&lt;br /&gt;
var email=document.getElementById(&amp;quot;email&amp;quot;).value;&lt;br /&gt;
var telefon=document.getElementById(&amp;quot;telefon&amp;quot;).value;&lt;br /&gt;
var data=document.getElementById(&amp;quot;data&amp;quot;).value;&lt;br /&gt;
var adreca=document.getElementById(&amp;quot;adreca&amp;quot;).value;&lt;br /&gt;
var cp=document.getElementById(&amp;quot;cp&amp;quot;).value;&lt;br /&gt;
var municipi=document.getElementById(&amp;quot;municipi&amp;quot;).value;&lt;br /&gt;
var patt_alfanumeric = /^[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ]+(\s[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ]+)*$/;&lt;br /&gt;
var patt_email = /^\w+@\w+\.\w+$/;&lt;br /&gt;
var patt_telefon =/^\d{9}$/;&lt;br /&gt;
var patt_data = /^\d{2}\/\d{2}\/\d{4}$/;&lt;br /&gt;
var patt_adreca = /^[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ\,\.\-]+(\s[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ\,\.\-]+)*$/;&lt;br /&gt;
var patt_cp=/^\d{5}$/;&lt;br /&gt;
&lt;br /&gt;
// reset format dels textbox i missatges d'error&lt;br /&gt;
document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//validació del nom&lt;br /&gt;
if(nom==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_alfanumeric.test(nom)) {&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació dels cognoms&lt;br /&gt;
if(cognoms==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_alfanumeric.test(cognoms)) {&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del email&lt;br /&gt;
if(email==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_email.test(email)) {&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (ex. usuari@servidor.xx)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del telefon&lt;br /&gt;
if(telefon==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_telefon.test(telefon)) {&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (6 digits)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació de la data&lt;br /&gt;
if(data==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_data.test(data)) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (dd/mm/aaaa)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var components_data = data.split(&amp;quot;/&amp;quot;);&lt;br /&gt;
var val_data=Date.parse(components_data[2]+&amp;quot;/&amp;quot;+components_data[1]+&amp;quot;/&amp;quot;+components_data[0]);&lt;br /&gt;
&lt;br /&gt;
if(isNaN(val_data)) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;data no vàlida&amp;quot;;&lt;br /&gt;
	return false;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var today=new Date();&lt;br /&gt;
if(val_data&amp;gt;=today) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;la data ha de ser anterior a la data acutal&amp;quot;;&lt;br /&gt;
	return false;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//validació de l'adreça&lt;br /&gt;
if(adreca==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_adreca.test(adreca)) {&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del codi postal&lt;br /&gt;
if(cp==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_cp.test(cp)) {&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (5 digits)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del municipi&lt;br /&gt;
if(municipi==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_adreca.test(municipi)) {&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return true;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
	&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
POSIBLE EJERCICIO&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tags = document.querySelectorAll('h1,h2,h3,h4,h5,h6,div,p');&lt;br /&gt;
for (var i = tags.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
  tags[i].style.outline = &amp;quot;1px solid green&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validar un camp de text Obligatori ===&lt;br /&gt;
Es tracta de forçar l'usuari a introduir un valor en un quadre de text o textarea en què sigui obligatori.Perquè es doni per completat un camp de text obligatori, es comprova que el valor introduït sigui vàlid, que el nombre de caràcters introduït sigui més gran que zero i que no s'hagin introduït només espais en blanc.  El text introduït tingui una longitud superior a zero caràcters, és a dir, que no sigui un text buit i per últim, el valor introduït per l'usuari no només estigui format per espais en blanc.&lt;br /&gt;
&lt;br /&gt;
:[[solució_valor_quadre_text]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un camp de text amb valors numèrics ===&lt;br /&gt;
Es tracta d'obligar l'usuari a introduir un valor numèric en un quadre de text.&lt;br /&gt;
:[[solucio_camp_text]]&lt;br /&gt;
&lt;br /&gt;
===  Validar que s'ha seleccionat una opció d'una llista ===&lt;br /&gt;
Es tracta d'obligar l'usuari a seleccionar un element d'una llista desplegable.&lt;br /&gt;
:[[solucio_llista]]&lt;br /&gt;
&lt;br /&gt;
=== Validar una adreça de correu electrònic ===&lt;br /&gt;
Es tracta d'obligar l'usuari a introduir una adreça de correu amb un format vàlid. Per tant, el que es comprova és que la direcció sembli vàlida, ja que no es comprova si es tracta d'un compte de correu electrònic real i operativa. La comprovació es realitza novament mitjançant les expressions regulars, ja que les adreces de correu electrònic vàlides poden ser molt diferents.&lt;br /&gt;
:[[solucio_correu_electronic]]&lt;br /&gt;
&lt;br /&gt;
=== Validar una data ===&lt;br /&gt;
Les dates solen ser els camps de formulari més complicats de validar per la multitud de formes diferents en què es poden introduir.&lt;br /&gt;
:[[solucio_dates]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un número de DNI ===&lt;br /&gt;
Es tracta de comprovar que el nombre proporcionat per l'usuari es correspon amb un nombre vàlid de document nacional d'identitat o DNI. Encara que per cada país o regió els requisits del document d'identitat de les persones poden variar, a continuació es mostra un exemple genèric fàcilment adaptable. La validació no només ha de comprovar que el nombre estigui format per vuit xifres i una lletra, sinó que també cal comprovar que la lletra indicada és correcta per al número introduït.&lt;br /&gt;
:[[solució_dni]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un número de telèfon ===&lt;br /&gt;
Els números de telèfon poden ser indicats de formes molt diferents: amb prefix nacional, amb prefix internacional, agrupat per parells, separant els números amb guions, etc.&lt;br /&gt;
:[[solucio_telefon]]&lt;br /&gt;
&lt;br /&gt;
=== Validar que un checkbox ha estat seleccionat ===&lt;br /&gt;
*a)Es tracta de validar si un element de tipus checkbox s'ha de seleccionar de forma obligatòria. &lt;br /&gt;
*b)Es tracta de validar si tots els checkbox del formulari han estat seleccionats.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_checkbox]]&lt;br /&gt;
&lt;br /&gt;
=== Validar que un radiobutton ha estat seleccionat ===&lt;br /&gt;
Encara que es tracta d'un cas similar al dels checkbox, la validació dels radiobutton presenta una diferència important: en general, la comprovació que es realitza és que l'usuari hagi seleccionat algun radiobutton dels que formen un determinat grup.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_radiobutton]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;JavaScript RegExp Reference: https://www.w3schools.com/jsref/jsref_obj_regexp.asp&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Experiments amb Expresions Regulars: http://www.regexplanet.com/advanced/javascript/index.html &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;John Resig, Bear Bibeault, &amp;quot;Secrets of the Javascript Ninja&amp;quot;, Manning Publications, 2012. ISBN 193398869X&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[http://librosweb.es/javascript/capitulo_7.html Introducció a Javascript] &amp;lt;/p&amp;gt; &amp;lt;p&amp;gt; [https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions Expressions Regulars a Mozilla]&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_Esdeveniments_i_Validacio_de_formularis&amp;diff=17000</id>
		<title>NF1 - Esdeveniments i Validacio de formularis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_Esdeveniments_i_Validacio_de_formularis&amp;diff=17000"/>
				<updated>2023-01-13T16:51:09Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Esdeveniments =&lt;br /&gt;
Fins ara, totes les aplicacions i scripts que s'han creat tenen alguna cosa en comú: s'executen des de la primera instrucció fins a l'última de forma seqüencial. Gràcies a les estructures de control de flux (if, for, while) és possible modificar lleugerament aquest comportament i repetir alguns trossos del script i saltar-se altres trossos en funció d'algunes condicions.&lt;br /&gt;
&lt;br /&gt;
Aquest tipus d'aplicacions són poc útils, ja que no interactuen amb els usuaris i no poden respondre als diferents esdeveniments que es produeixen durant l'execució d'una aplicació. Afortunadament, les aplicacions web creades amb el llenguatge Javascript poden utilitzar el model de programació basada en esdeveniments.&lt;br /&gt;
&lt;br /&gt;
En aquest tipus de programació, els scripts es dediquen a esperar al fet que l'usuari &amp;quot;faci alguna cosa&amp;quot; (que premi una tecla, que mogui el ratolí, que tanqui la finestra del navegador). A continuació, el script respon a l'acció de l'usuari normalment processant aquesta informació i generant un resultat.&lt;br /&gt;
&lt;br /&gt;
Els esdeveniments fan possible que els usuaris transmetin informació als programes. Javascript defineix nombrosos esdeveniments que permeten una interacció completa entre l'usuari i les pàgines/aplicacions web. La pulsació d'una tecla constitueix un esdeveniment, així com punxar o moure el ratolí, seleccionar un element d'un formulari, redimensionar la finestra del navegador, etc.&lt;br /&gt;
&lt;br /&gt;
Javascript permet assignar una funció a cadascun dels esdeveniments. D'aquesta forma, quan es produeix qualsevol esdeveniment, Javascript executa la seva funció associada. Aquest tipus de funcions es denominen &amp;quot;event handlers&amp;quot; en anglès i solen traduir-se per &amp;quot;manegadors d'esdeveniments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Model bàsic d'esdeveniments ==&lt;br /&gt;
=== Tipus d'esdeveniments ===&lt;br /&gt;
En aquest model, cada element o etiqueta XHTML defineix la seva pròpia llista de possibles esdeveniments que se li poden assignar. Un mateix tipus d'esdeveniment (per exemple, clicar el botó esquerre del ratolí) pot estar definit per a diversos elements XHTML diferents i un mateix element XHTML pot tenir associats varis esdeveniments diferents.&lt;br /&gt;
&lt;br /&gt;
El nom de cada esdeveniment es construeix mitjançant el prefix ''on'', seguit del nom en anglès de l'acció associada a l'esdeveniment. Així, l'esdeveniment de punxar un element amb el ratolí es denomina ''onclick'' i l'esdeveniment associat a l'acció de moure el ratolí es denomina ''onmousemove''.&lt;br /&gt;
&lt;br /&gt;
La següent taula resumeix els esdeveniments més importants definits per Javascript:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Event&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Descripció&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Elements per els que está definit&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onblur&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deseleccionar l'element (el contrari de onfocus)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;button&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;label&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onchange&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Succeeix quan el valor del element ha canviat&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onclick&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;clicar i deixar anar el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;ondblclick&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;clicar dos vegades seguides amb el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onfocus&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Seleccionar un element&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;button&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;label&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeydown&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer una tecla (sense deixar-la anar)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeypress&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer una tecla&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeyup&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deixar anar una tecla premuda&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onload&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;La pàgina s'ha carregat completament&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmousedown&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer (sense deixar anar) un botn del ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmousemove&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Moure el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseout&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;El ratolí &amp;lt;em&amp;gt;&amp;quot;surt&amp;quot;&amp;lt;/em&amp;gt; de l'element (passa sobre un altre element)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseover&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;El ratoli &amp;lt;em&amp;gt;&amp;quot;entra&amp;quot;&amp;lt;/em&amp;gt; dintre de l'elemento (passa per sobre de l'element)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseup&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deixar anar el botó que estava premut en el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onreset&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Inicialitzar el formulari (esborrar totes les dades)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;form&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onresize&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;S'ha modificat la mida de la finestra del navegador&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onselect&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Seleccionar un text&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onsubmit&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Enviar el formulari&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;form&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onunload&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;S'abandona la pàgina (per exemple al tancar el navegador)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu veure tots el esdeveniments [[http://www.w3schools.com/jsref/dom_obj_event.asp aquí]]&lt;br /&gt;
&lt;br /&gt;
===Gestor  d'esdeveniments===&lt;br /&gt;
&lt;br /&gt;
Un esdeveniment de Javascript per si mateix manca d'utilitat. Perquè els esdeveniments resultin útils, s'han d'associar funcions o codi Javascript a cada esdeveniment. D'aquesta forma, quan es produeix un esdeveniment s'executa el codi indicat, per la qual cosa l'aplicació pot respondre davant qualsevol esdeveniment que es produeixi durant la seva execució.&lt;br /&gt;
&lt;br /&gt;
Les funcions o codi Javascript que es defineixen per a cada esdeveniment es denominen &amp;quot;manegador d'esdeveniments&amp;quot; i com Javascript és un llenguatge molt flexible, existeixen diverses formes diferents d'indicar els manegadors:&lt;br /&gt;
&lt;br /&gt;
*Manejadores com a atributs dels elements XHTML.&lt;br /&gt;
*Manejadores com a funcions Javascript externes.&lt;br /&gt;
*Manejadores &amp;quot;semàntics&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments com a atributs XHTML ====&lt;br /&gt;
&lt;br /&gt;
Es tracta del mètode més senzill i alhora menys professional d'indicar el codi Javascript que s'ha d'executar quan es produeixi un esdeveniment. En aquest cas, el codi s'inclou en un atribut del propi element XHTML. En el següent exemple, es vol mostrar un missatge quan l'usuari cliqui amb el ratolí sobre un botó:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquest mètode, es defineixen atributs XHTML amb el mateix nom que els esdeveniments que es volen manejar. L'exemple anterior només vol controlar l'esdeveniment de clicar amb el ratolí, el nom del qual és onclick. Així, l'element XHTML pel qual es vol definir aquest esdeveniment, ha d'incloure un atribut anomenat onclick.&lt;br /&gt;
&lt;br /&gt;
El contingut de l'atribut és una cadena de text que conté totes les instruccions Javascript que s'executen quan es produeix l'esdeveniment. En aquest cas, el codi Javascript és molt senzill (alert('Gràcies per clicar');), ja que solament es tracta de mostrar un missatge.&lt;br /&gt;
&lt;br /&gt;
En aquest altre exemple, quan l'usuari punxa sobre l'element &amp;lt;div&amp;gt; es mostra un missatge i quan l'usuari passa el ratolí per sobre de l'element, es mostra un altre missatge:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div onclick=&amp;quot;alert('Has clicat amb el ratolí');&amp;quot; onmouseover=&amp;quot;alert('Acabes de passar el ratolí per damunt');&amp;quot;&amp;gt;Ratolí&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pots clicar sobre aquest element o simplement passar el ratolí per damunt.&lt;br /&gt;
Aquest altre exemple inclou una de les instruccions més utilitzades en les aplicacions Javascript més antigues:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body onload=&amp;quot;alert(&amp;quot;La pàgina s'ha carregat completament &amp;quot;);&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior es mostra després que la pàgina s'hagi carregat completament, és a dir, després que s'hagi descarregat el seu codi HTML, les seves imatges i qualsevol altre objecte inclòs a la pàgina.&lt;br /&gt;
&lt;br /&gt;
L'esdeveniment onload és un dels més utilitzats ja que, com veurem en el capítol de DOM, les funcions que permeten accedir i manipular els nodes de l'arbre DOM solament estan disponibles quan la pàgina s'ha carregat completament.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments i variable this ====&lt;br /&gt;
&lt;br /&gt;
En els esdeveniments, es pot utilitzar la variable '''this''' per referir-se a l'element XHTML que ha provocat l'esdeveniment. Aquesta variable és molt útil per a exemples com el següent:&lt;br /&gt;
&lt;br /&gt;
Quan l'usuari passa el ratolí per sobre de el &amp;lt;div&amp;gt;, el color de la vora es mostra de color negre. Quan el ratolí surt de el &amp;lt;div&amp;gt;, es torna a mostrar la vora amb el color gris clar original.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Element &amp;lt;div&amp;gt; original:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si no s'utilitza la variable this, el codi necessari per modificar el color de les vores, seria el següent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;document.getElementById('continguts').style.borderColor='black';&amp;quot; onmouseout=&amp;quot;document.getElementById('continguts').style.borderColor='silver';&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codi anterior és massa llarg i massa propens a cometre errors. Dins del codi d'un esdeveniment, Javascript crea automàticament la variable this, que fa referència a l'element XHTML que ha provocat l'esdeveniment. Així, l'exemple anterior es pot reescriure de la següent manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;this.style.borderColor='black';&amp;quot; onmouseout=&amp;quot;this.style.borderColor='silver';&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codi anterior és molt més compacte, més fàcil de llegir i d'escriure i segueix funcionant correctament encara que es modifiqui el valor de l'atribut ''id'' de el &amp;lt; div &amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments com a funcions externes ====&lt;br /&gt;
&lt;br /&gt;
La definició dels manegadores d'esdeveniments en els atributs XHTML és el mètode més senzill però menys aconsellable de tractar amb els esdeveniments en Javascript. El principal inconvenient és que es complica a l'excés quan s'afegeixen algunes poques instruccions, per la qual cosa solament és recomanable per als casos més senzills.&lt;br /&gt;
&lt;br /&gt;
Si es realitzen aplicacions complexes, com per exemple la validació d'un formulari, és aconsellable agrupar tot el codi Javascript en una funció externa i cridar a aquesta funció des de l'element XHTML.&lt;br /&gt;
&lt;br /&gt;
Seguint amb l'exemple anterior que mostra un missatge en clicar sobre un botó:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilitzant funcions externes es pot transformar en:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function mostraMissatge() {&lt;br /&gt;
  alert('Gràcies per clicar');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;mostraMissatge()&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquesta tècnica consisteix a extreure totes les instruccions de Javascript i agrupar-les en una funció externa. Una vegada definida la funció, en l'atribut de l'element XHTML s'inclou el nom de la funció, per indicar que és la funció que s'executa quan es produeix l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
La crida a la funció es realitza de la forma habitual, indicant el seu nom seguit dels parèntesis i de forma opcional, incloent tots els arguments i paràmetres que es necessitin.&lt;br /&gt;
&lt;br /&gt;
El principal inconvenient d'aquest mètode és que en les funcions externes no es pot seguir utilitzant la variable '''this''' i per tant, és necessari passar aquesta variable com a paràmetre a la funció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ressalta(element) {&lt;br /&gt;
	switch(element.style.borderColor) {&lt;br /&gt;
		case 'silver':&lt;br /&gt;
		case 'silver silver silver silver':&lt;br /&gt;
		case '#c0c0c0':&lt;br /&gt;
			element.style.borderColor = 'black';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'black':&lt;br /&gt;
		case 'black black black black':&lt;br /&gt;
		case '#000000':&lt;br /&gt;
			element.style.borderColor = 'silver';&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;ressalta(this)&amp;quot; onmouseout=&amp;quot;ressalta(this)&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En l'exemple anterior, la funció externa és cridada amb el paràmetre ''this'', que dins de la funció es denomina element. La complexitat de l'exemple es produeix sobretot per la forma en la qual els diferents navegadors emmagatzemen el valor de la propietat *&lt;br /&gt;
''borderColor''.&lt;br /&gt;
&lt;br /&gt;
Mentre que Firefox emmagatzema (en cas que les quatre vores coincideixin en color) el valor ''black'', Internet Explorer ho emmagatzema com ''black black black black'' i Opera emmagatzema la seva representació hexadecimal ''#000000''.&lt;br /&gt;
&lt;br /&gt;
====Gestor d'esdeveniments semàntics====&lt;br /&gt;
Els mètodes que s'han vist per afegir manejadores d'esdeveniments (com a atributs XHTML i com a funcions externes) tenen un greu inconvenient: &amp;quot;embruten&amp;quot; el codi XHTML de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Com és conegut, una de les bones pràctiques bàsiques en el disseny de pàgines i aplicacions web és la separació dels continguts (XHTML) i el seu aspecte o presentació (CSS). Sempre que sigui possible, també es recomana separar els continguts (XHTML) i el seu comportament o programació (Javascript).&lt;br /&gt;
&lt;br /&gt;
Barrejar el codi Javascript amb els elements XHTML solament contribueix a complicar el codi font de la pàgina, a dificultar la modificació i manteniment de la pàgina i a reduir la semàntica del document final produït.&lt;br /&gt;
&lt;br /&gt;
Afortunadament, existeix un mètode alternatiu per definir els manegadores d'esdeveniments de Javascript. Aquesta tècnica és una evolució del mètode de les funcions externes, ja que es basa a utilitzar les propietats DOM dels elements XHTML per assignar totes les funcions externes que actuen de manejadores d'esdeveniments. Així, el següent exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;clica&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Es pot transformar en:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Funció externa&lt;br /&gt;
function mostraMissatge() {&lt;br /&gt;
alert('Gràcies per clicar');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Assignar la funció externa a l'element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&lt;br /&gt;
// Element XHTML&lt;br /&gt;
&amp;lt;input id=&amp;quot;clica&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tècnica dels manegadores semàntics consisteix en:&lt;br /&gt;
&lt;br /&gt;
*Assignar un identificador únic a l'element XHTML mitjançant l'atribut ''id''.&lt;br /&gt;
*Crear una funció de Javascript encarregada de manejar l'esdeveniment.&lt;br /&gt;
*Assignar la funció externa a l'esdeveniment corresponent en l'element desitjat.&lt;br /&gt;
*L'últim pas és la clau d'aquesta tècnica. En primer lloc, s'obté l'element al que es desitja associar la funció externa:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A continuació, s'utilitza una propietat de l'element amb el mateix nom que l'esdeveniment que es vol manejar. En aquest cas, la propietat és ''onclick'':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'assigna la funció externa mitjançant el seu nom sense parèntesi. El més important (i la causa més comuna d'errors) és indicar solament el nom de la funció, és a dir, prescindir dels parèntesis en assignar la funció:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'afegeixen els parèntesis després del nom de la funció, en realitat s'està executant la funció i guardant el valor retornat per la funció en la propietat onclick d'element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Assignar una funció externa a un esdeveniment d'un element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&lt;br /&gt;
// Executar una funció i guardar el seu resultat en una propietat d'un element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El gran avantatge d'aquest mètode és que el codi XHTML resultant és molt &amp;quot;net&amp;quot;, ja que no es barreja amb el codi Javascript. A més, dins de les funcions externes assignades sí que es pot utilitzar la variable '''this''' per referir-se a l'element que provoca l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
L'únic inconvenient d'aquest mètode és que la pàgina s'ha de carregar completament abans que es puguin utilitzar les funcions DOM que assignen els manegadors als elements XHTML. Una de les formes més senzilles d'assegurar que cert codi es va a executar després que la pàgina es carregui per complet és utilitzar l'esdeveniment '''onload''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = muestraMensaje;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gestor d'esdeveniments amb DOM====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El mètode addEventListener ens permet incloure un gestor d'esdeveniment. La sintaxi de addEventListener és la següent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
element_que_escolta.addEventListener('event',funció_a_llançar, booleà);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''element_que_escolta'' - és qualsevol element present en un document al qual es vol associar l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
''esdeveniment'' - és el succés ocorregut sobre l'element (clic, load, ...).&lt;br /&gt;
&lt;br /&gt;
''funció_a_llançar'' - és qualsevol funció definida que vulguem que s'executi quan passi l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
''booleà'' - és un valor que defineix l'ordre del flux d'esdeveniments.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si es vol escoltar un esdeveniment només una vegada i després eliminar-ho s'ha d'utilitzar el mètode removeEventListener:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
element_que_escolta.removeEventListener ('esdeveniment',funció_a_llançar, booleà);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTA 1:'' Explicació del paràmetre booleà del mètode addEventListener amb un exemple.&lt;br /&gt;
Suposem que tenim això:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Exemple de fluix events&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;Clica aqui&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quan fem clic al div no només ho estem fent sobre ell, sinó sobre els elements que el contenen en l'arbre del DOM, és a dir, hem fet clic a més sobre l'element html i sobre l'element body. Sí només hi ha una funció assignada a una escolta per al div no hi ha major problema, però si a més hi ha una per al html i una altra per al body, quin és l'ordre en què s'han de llançar les tres funcions?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per contestar a aquesta pregunta hi ha un model de comportament, el flux d'esdeveniments (anglès). Segons aquest, quan es fa clic sobre un element, l'esdeveniment es propaga en dues fases, una que és la captura -el esdeveniment comença en el nivell superior del document i recorre els elements de pares a fills- i l'altra la bombolla -el ordre invers, ascendint de fills a pares-.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un cop vist això, podem comprendre el tercer paràmetre de addEventListener, que el que fa és permetre'ns escollir l'ordre de propagació:&lt;br /&gt;
&lt;br /&gt;
'''true''': El flux d'esdeveniments és com el representat, i la fase de captura passa en llançar l'esdeveniment. L'ordre de propagació per l'exemple seria, per tant, l'indicat, ''html-body-div.''&lt;br /&gt;
&lt;br /&gt;
'''false''': Permet saltar la fase de captura, i la propagació seguiria només la bombolla. Així, l'ordre seria ''div-body-html.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTA 2:'' A internet explorer no funciona en les versions anteriors a la 7 (inclosa).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        function alerta(){&lt;br /&gt;
            alert(this);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        window.onload = function (){&lt;br /&gt;
            var elBody = document.getElementsByTagName('body')[0];&lt;br /&gt;
            var elDiv = document.getElementById('elDiv');&lt;br /&gt;
            var elButton = document.getElementById('elButton');&lt;br /&gt;
         &lt;br /&gt;
            elBody.addEventListener('click',alerta,false);&lt;br /&gt;
            elDiv.addEventListener('click',alerta,false);&lt;br /&gt;
            elButton.addEventListener('click',alerta,false);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//event.stopPropagation();   //evita propagarse el evento en forma de burbuja&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body id=&amp;quot;body&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;elDiv&amp;quot;&amp;gt;Clica aqui&lt;br /&gt;
          &amp;lt;button id=&amp;quot;elButton&amp;quot;&amp;gt;boton&amp;lt;/button&amp;gt;&lt;br /&gt;
     &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemple d'utilització manejadores d'esdeveniments amb DOM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function muestraMensaje() {&lt;br /&gt;
  				console.log(&amp;quot;Has pulsado el ratón&amp;quot;);&lt;br /&gt;
  				elDiv.removeEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);  // borra el evento asociado de tipo click a ese elemento.&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			var elDiv = document.getElementById(&amp;quot;div_principal&amp;quot;);&lt;br /&gt;
			elDiv.addEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
En el caso que no queramos que se aplique el evento de tipo de Submit o Hipervínculo &amp;quot;&amp;lt;a&amp;gt;&amp;lt;/a&amp;gt;&amp;quot; al ser botón usaremos &amp;quot;e.preventDefault()&amp;quot; y realizará las acciones que tengamos establecidas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
window.addEventListener(&amp;quot;load&amp;quot;,ejemplo); // window.onload= ejemplo;&lt;br /&gt;
&lt;br /&gt;
	function ejemplo(){&lt;br /&gt;
			function muestraMensaje(e) {&lt;br /&gt;
  				console.log(&amp;quot;Has pulsado el ratón&amp;quot;);&lt;br /&gt;
                                e.preventDefault();  //evita que se ejecute el submit y recargue la página&lt;br /&gt;
			}&lt;br /&gt;
         document.getElementById(&amp;quot;boton&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);&lt;br /&gt;
	}      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;./index.html&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;input type=&amp;quot;submit&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;boton&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En el següent exemple, s'afegeixen esdeveniments als elements de tipus ''input=text'' d'un formulari complex:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form id=&amp;quot;formulario&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;holaa&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    function resalta() {&lt;br /&gt;
        console.log(&amp;quot;holaa&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    window.onload = function() {&lt;br /&gt;
        var formulario = document.getElementById(&amp;quot;formulario&amp;quot;);&lt;br /&gt;
        var camposInput = formulario.getElementsByTagName(&amp;quot;input&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        for(var i=0; i&amp;lt;camposInput.length; i++) {&lt;br /&gt;
            if(camposInput[i].type == &amp;quot;text&amp;quot;) {&lt;br /&gt;
                camposInput[i].onclick = resalta;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Alert ===&lt;br /&gt;
Volem provar els events de la pàgina, per fer-ho posa un alert amb un missatge en els següents casos:&lt;br /&gt;
* Al carregar-se completament la pàgina.&lt;br /&gt;
* Al clicar en un botó&lt;br /&gt;
* Al passar damunt d'un paràgraf&lt;br /&gt;
* Al passar damunt d'una imatge&lt;br /&gt;
* Al sortir del damunt d'una imatge&lt;br /&gt;
* Al clicar en un enllaç&lt;br /&gt;
&lt;br /&gt;
:[[Exercici1 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Desplegable ===&lt;br /&gt;
Es vol disposar de un menu desplegable on cada element del desplegable sigui el nom de la pàgina a la cual fa referència. Quan es seleccioni una entrada del desplegable, el navegador canvia la seva url per la del desplegable.&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 2 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Rollover ===&lt;br /&gt;
Un intercanvi d'imatge és una cosa grandiosa. L'usuari aproxima el punter del ratolí a una imatge i aquesta canvia a una altre imatge. Quan l'usuari abandona la imatge, torna a canviar a la imatge anterior. &lt;br /&gt;
Fes un programa amb javascript que reprodueixi el comportament anterior.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 3 Events]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Mostrar / Ocultar text ===&lt;br /&gt;
Donada la següent pàgina&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	function muestraOculta() {&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_1&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_1&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_2&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_2&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_3&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_3&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Realitza els següents apartats:&lt;br /&gt;
*Quan es cliqui sobre el primer enllaç, s'oculti la seva secció relacionada&lt;br /&gt;
*Quan es torni a clicar sobre el mateix enllaç, es mostri una altra vegada aquesta secció de continguts&lt;br /&gt;
*Completar la resta d'enllaços de la pàgina perquè el seu comportament sigui idèntic al del primer enllaç&lt;br /&gt;
*Quan una secció s'oculti, ha de canviar el missatge de l'enllaç associat (pista: propietat innerHTML)&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 4 Events]]&lt;br /&gt;
&lt;br /&gt;
== Obtenint informació de l'esdeveniment (objecte event)==&lt;br /&gt;
Normalment, els manegadors d'esdeveniments requereixen informació addicional per processar les seves tasques. Si una funció per exemple s'encarrega de processar l'esdeveniment onclick, potser necessiti saber que posició estava el ratolí en el moment de punxar el botó.&lt;br /&gt;
&lt;br /&gt;
No obstant això, el cas més habitual en el qual és necessari conèixer informació addicional sobre l'esdeveniment és el dels esdeveniments associats al teclat. Normalment, és molt important conèixer la tecla que s'ha premut, per exemple per diferenciar les tecles normals de les tecles especials (ENTER, tabulador, Alt, Ctrl., etc.).&lt;br /&gt;
&lt;br /&gt;
Javascript permet obtenir informació sobre el ratolí i el teclat mitjançant un objecte especial anomenat ''event''. Desafortunadament, els diferents navegadors presenten diferències molt notables en el tractament de la informació sobre els esdeveniments.&lt;br /&gt;
&lt;br /&gt;
La principal diferència resideix en la forma en la qual s'obté l'objecte event. Internet Explorer considera que aquest objecte forma part de l'objecte window i la resta de navegadors ho consideren com l'únic argument que tenen les funcions manejadoras d'esdeveniments.&lt;br /&gt;
&lt;br /&gt;
Encara que és un comportament que resulta molt estrany al principi, tots els navegadors moderns excepte Internet Explorer creen màgicament i de forma automàtica un argument que es passa a la funció manegadora, per la qual cosa no és necessari incloure-ho en la trucada a la funció manegadora. D'aquesta forma, per utilitzar aquest &amp;quot;argument màgic&amp;quot;, només és necessari assignar-li un nom, ja que els navegadors ho creen automàticament.&lt;br /&gt;
&lt;br /&gt;
En resum, en els navegadors tipus Internet Explorer, l'objecte event s'obté directament mitjançant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var esdeveniment = window.event;&lt;br /&gt;
D'altra banda, en la resta de navegadors, l'objecte event s'obté màgicament a partir de l'argument que el navegador crea automàticament:&lt;br /&gt;
&lt;br /&gt;
function manejadorEventos(elEvento) {&lt;br /&gt;
var esdeveniment = elEvento;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si es vol programar una aplicació que funcioni correctament en tots els navegadors, és necessari obtenir l'objecte event de forma correcta segons cada navegador. El següent codi mostra la forma correcta d'obtenir l'objecte event en qualsevol navegador:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function manejadorEventos(elEvento) {&lt;br /&gt;
var esdeveniment = elEvento || window.event;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una vegada obtingut l'objecte event, ja es pot accedir a tota la informació relacionada amb l'esdeveniment, que depèn del tipus d'esdeveniment produït.&lt;br /&gt;
&lt;br /&gt;
=== Informació sobre l'esdeveniment ===&lt;br /&gt;
La propietat '''type''' indica el tipus d'esdeveniment produït, la qual cosa és útil quan una mateixa funció s'utilitza per manejar diversos esdeveniments:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var tipus = esdeveniment.type;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La propietat type retorna el tipus d'esdeveniment produït, que és igual al nom de l'esdeveniment però sense el prefix '''on'''.&lt;br /&gt;
&lt;br /&gt;
Mitjançant aquesta propietat, es pot refer de forma més senzilla l'exemple anterior en el qual es ressaltava una secció de continguts en passar el ratolí per damunt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ressalta(elEvento) {&lt;br /&gt;
    var esdeveniment = elEvento || window.event;&lt;br /&gt;
    switch(esdeveniment.type) {&lt;br /&gt;
         case 'mouseover':&lt;br /&gt;
               this.style.borderColor = 'black';&lt;br /&gt;
               break;&lt;br /&gt;
         case 'mouseout':&lt;br /&gt;
               this.style.borderColor = 'silver';&lt;br /&gt;
               break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
       document.getElementById(&amp;quot;seccion&amp;quot;).onmouseover = ressalta;&lt;br /&gt;
       document.getElementById(&amp;quot;seccion&amp;quot;).onmouseout = ressalta;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;div id=&amp;quot;seccion&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot;&amp;gt;&lt;br /&gt;
  Secció de continguts...&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Informació sobre els esdeveniments de teclat ===&lt;br /&gt;
De tots els esdeveniments disponibles en Javascript, els esdeveniments relacionats amb el teclat són els més incompatibles entre diferents navegadors i per tant, els més difícils de manegar. En primer lloc, existeixen moltes diferències entre els navegadors, els teclats i els sistemes operatius dels usuaris, principalment a causa de les diferències entre idiomes.&lt;br /&gt;
&lt;br /&gt;
A més, existeixen tres esdeveniments diferents per a les pulsacions de les tecles ('''onkeyup''', '''onkeypress''' i '''onkeydown'''). Finalment, existeixen dos tipus de tecles: les tecles normals (com a lletres, nombres i símbols normals) i les tecles especials (com ENTER, Alt, Shift, etc.)&lt;br /&gt;
&lt;br /&gt;
Quan un usuari prem una tecla normal, es produeixen tres esdeveniments seguits i en aquest ordre: &lt;br /&gt;
*'''onkeydown''', &lt;br /&gt;
*'''onkeypress''' i &lt;br /&gt;
*'''onkeyup'''. &lt;br /&gt;
L'esdeveniment '''onkeydown''' es correspon amb el fet de prémer una tecla i no deixar-la anar; l'esdeveniment '''onkeypress''' és la pròpia pulsació de la tecla i l'esdeveniment '''onkeyup''' fa referència al fet de deixar anar una tecla que estava premuda.&lt;br /&gt;
&lt;br /&gt;
La forma més senzilla d'obtenir la informació sobre la tecla que s'ha premut és mitjançant l'esdeveniment '''onkeypress'''. La informació que proporcionen els esdeveniments '''onkeydown''' i '''onkeyup''' es pot considerar com més tècnica, ja que retornen el ''codi intern'' de cada tecla i no el caràcter que s'ha premut.&lt;br /&gt;
&lt;br /&gt;
A continuació s'inclou una llista amb totes les propietats diferents de tots els esdeveniments de teclat tant en Internet Explorer com en la resta de navegadors:&lt;br /&gt;
&lt;br /&gt;
*Esdeveniment keydown:&lt;br /&gt;
**Mateix comportament en tots els navegadors:&lt;br /&gt;
***Propietat keyCode: codi intern de la tecla&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
*Esdeveniment keypress:&lt;br /&gt;
**Internet Explorer:&lt;br /&gt;
***Propietat keyCode: el codi del caràcter de la tecla que s'ha premut&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
**Resta de navegadors:&lt;br /&gt;
**Propietat keyCode: per a les tecles normals, no definit. Per a les tecles especials, el codi intern de la tecla.&lt;br /&gt;
**Propietat charCode: per a les tecles normals, el codi del caràcter de la tecla que s'ha premut. Per a les tecles especials, 0.&lt;br /&gt;
*Esdeveniment keyup:&lt;br /&gt;
**Mateix comportament en tots els navegadors:&lt;br /&gt;
***Propietat keyCode: codi intern de la tecla&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
Per convertir el codi d'un caràcter (no confondre amb el codi intern) al caràcter que representa la tecla que s'ha premut, s'utilitza la funció ''String.fromCharCode().''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    window.onkeydown = teclado;&lt;br /&gt;
    window.onkeypress = teclado;&lt;br /&gt;
    window.onkeyup = teclado;&lt;br /&gt;
&lt;br /&gt;
    function teclado(magica) {&lt;br /&gt;
        var e = magica || window.event; // para salvar las deficiencias de IE=window.event&lt;br /&gt;
        mostrar(e.type, e.keyCode, e.which, e.charCode, e.key);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function mostrar(evento, keyCode, which, charCode, key) {&lt;br /&gt;
      &lt;br /&gt;
        let cadena =  &amp;quot;&amp;lt;b&amp;gt; Evento: &amp;lt;/b&amp;gt;&amp;quot; + evento &lt;br /&gt;
                     + &amp;quot; ==&amp;gt; &amp;lt;b&amp;gt; keyCode: &amp;lt;/b&amp;gt;&amp;quot; + keyCode &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; which: &amp;lt;/b&amp;gt;&amp;quot; + which &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; charCode: &amp;lt;/b&amp;gt;&amp;quot;+ charCode &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; key: &amp;lt;/b&amp;gt;&amp;quot;+ key &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; FromCharCode: &amp;lt;/b&amp;gt;&amp;quot;+String.fromCharCode(charCode)+&amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         let info = document.getElementById(&amp;quot;info&amp;quot;); //display&lt;br /&gt;
         info.innerHTML += cadena&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;info&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://sospedia.net/pinchar-el-teclado-en-javascript/&lt;br /&gt;
&lt;br /&gt;
https://www.w3.org/2002/09/tests/keys-cancel2.html&lt;br /&gt;
&lt;br /&gt;
==== Exercici Teclat ====&lt;br /&gt;
Crea un script que mostri per pantalla la següent informació cada vedada que es premi una tecla:&lt;br /&gt;
* Caràcter permut  (amb key i StringCharCode)&lt;br /&gt;
* Tipus event (keydown, keypress, keyup)&lt;br /&gt;
* Propietat keycode&lt;br /&gt;
* Propietat charcode&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 5 events]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== informació sobre els esdeveniments de ratolí ===&lt;br /&gt;
La informació més rellevant sobre els esdeveniments relacionats amb el ratolí és la de les coordenades de la posició del punter del ratolí. Encara que l'origen de les coordenades sempre es troba en la cantonada superior esquerra, el punt que es pren com a referència de les coordenades pot variar.&lt;br /&gt;
&lt;br /&gt;
D'aquesta forma, és possible obtenir la posició del ratolí respecte de la pantalla de l'ordinador, respecte de la finestra del navegador i respecte de la pròpia pàgina HTML (que s'utilitza quan l'usuari ha fet scroll sobre la pàgina). Les coordenades més senzilles són les que es refereixen a la posició del punter respecte de la finestra del navegador, que s'obtenen mitjançant les propietats clientX i clientY:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function muestraInformacion(elEvento) {&lt;br /&gt;
   var esdeveniment = elEvento || window.event;&lt;br /&gt;
   var coordenadaX = esdeveniment.clientX;&lt;br /&gt;
   var coordenadaY = esdeveniment.clientY;&lt;br /&gt;
   alert(&amp;quot;Has premut el ratolí en la posició: &amp;quot; + coordenadaX + &amp;quot;, &amp;quot; + coordenadaY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.onclick = muestraInformacion;&lt;br /&gt;
//document.addeventlistener(click,&amp;quot;muestraInformacion&amp;quot;,false);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les coordenades de la posició del punter del ratolí respecte de la pantalla completa de l'ordinador de l'usuari s'obtenen de la mateixa forma, mitjançant les propietats '''screenX''' i '''screenY''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var coordenadaX = esdeveniment.screenX;&lt;br /&gt;
var coordenadaY = esdeveniment.screenY;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En moltes ocasions, és necessari obtenir un altre parell de coordenades diferents: les que corresponen a la posició del ratolí respecte de l'origen de la pàgina. Aquestes coordenades no sempre coincideixen amb les coordenades respecte de l'origen de la finestra del navegador, ja que l'usuari pot fer scroll sobre la pàgina web. Internet Explorer no proporciona aquestes coordenades de forma directa, mentre que la resta de navegadors sí que ho fan. D'aquesta forma, és necessari detectar si el navegador és de tipus Internet Explorer i en cas afirmatiu realitzar un càlcul senzill:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Detectar si el navegador és Internet Explorer&lt;br /&gt;
var ie = navigator.userAgent.toLowerCase().indexOf('msie')!=-1;&lt;br /&gt;
&lt;br /&gt;
if(ie) {&lt;br /&gt;
     coordenadaX = esdeveniment.clientX + document.body.scrollLeft;&lt;br /&gt;
     coordenadaY = esdeveniment.clientY + document.body.scrollTop;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
     coordenadaX = esdeveniment.pageX;&lt;br /&gt;
     coordenadaY = esdeveniment.pageY;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;Has premut el ratolí en la posició: &amp;quot; + coordenadaX + &amp;quot;, &amp;quot; + coordenadaY + &amp;quot; respecte de la pàgina web&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La variable '''ie''' val '''true''' si el navegador en el qual s'executa el script és de tipus Internet Explorer (qualsevol versió) i val '''false''' en un altre cas. Per a la resta de navegadors, les coordenades respecte de l'origen de la pàgina s'obtenen mitjançant les propietats '''pageX''' i '''pageY'''. En el cas d'Internet Explorer, s'obtenen sumant la posició respecte de la finestra del navegador (clientX, clientY) i el desplaçament que ha sofert la pàgina (document.bodi.scrollLeft, document.bodi.scrollTop).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Client_page_screen.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gràfics senzills amb canvas ===&lt;br /&gt;
Amb els esdeveniments de teclat i ratolí podrem programar jocs senzills. Només ens caldrà saber com situar i moure gràfics per la pantalla. Amb aquesta finalitat ens serà d'ajuda l'ús de l'element '''canvas''' de HTML.&lt;br /&gt;
&lt;br /&gt;
Al següent exemple definim un canvas (llenç) de 800x600 píxels i hi situem la imatge d'un cotxe a la coordenada (400,300). &lt;br /&gt;
&amp;lt;source lang=&amp;quot;HTML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;canvas id=&amp;quot;myCanvas&amp;quot; width=&amp;quot;800&amp;quot; height=&amp;quot;600&amp;quot; style=&amp;quot;background-color: lightskyblue;&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img id=&amp;quot;cotxe&amp;quot; src=&amp;quot;cotxe.jpg&amp;quot; style=&amp;quot;display: none;&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var canvas;&lt;br /&gt;
var ctx;&lt;br /&gt;
var imatge;&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
         canvas= document.getElementById(&amp;quot;myCanvas&amp;quot;);&lt;br /&gt;
         ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
         imatge=document.getElementById(&amp;quot;cotxe&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ctx.drawImage(imatge,400,300);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si volem simular el moviment de la imatge haurem l'haurem d'esborrar de la posició antiga i tornar-la a dibuixar a la nova posició. Per borrar la imatge podem dibuixar un rectangle del color de fons del canvas sobre la imatge amb les instruccions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
ctx.fillStyle = &amp;quot;lightskyblue&amp;quot;&lt;br /&gt;
ctx.fillRect(0,300,100,66);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'exemple dibuixem al canvas un triangle de color lightskyblue a la coordenada (0,300) i de dimensions 100x66.&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Coordenades del punter ===&lt;br /&gt;
Crea una pàgina on es mostri constantment les coordenades del punter dins de la pàgina (propietats clientX, clientY).&lt;br /&gt;
&lt;br /&gt;
=== event MOUSEOVER ===&lt;br /&gt;
Crea una pàgina de contingut lliure que tingui els següents elements:&lt;br /&gt;
*Títol (capçalera H1)&lt;br /&gt;
*Tres paràgrafs que continguin una imatge alineada a la dreta o a l'esquerra del text. La longitud del text de cada paràgraf serà prou extensa per a superar l'alçada de la imatge respectiva.&lt;br /&gt;
*Tres títols (capçalera H2) que precediran cadascun dels paràgrafs.&lt;br /&gt;
Programa les respostes als events MOUSEOVER de cada element de forma que:&lt;br /&gt;
*tots els elements de text (quatre capçaleres i tres paràgrafs) canviin de format quan tenen el punter del ratolí al damunt. Cada element de text tornarà al seu format original quan el punter ja no sigui al damunt&lt;br /&gt;
*les imatges giraran en sentit horari quan tinguin el punter al damunt i deixaran de fer-ho quan el punter ja no sigui al damunt.&lt;br /&gt;
&lt;br /&gt;
=== Ordre dels events ===&lt;br /&gt;
Crea una pàgina amb quatre seccions DIV aniuades i etiquetades amb els noms div1, ... , div4:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;div1&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div2&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div3&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div4&amp;quot;&amp;gt;contingut random...&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Crea funcions de resposta a l'event CLICK per a cada element DIV que escrigui un missatge de l'estil &amp;quot;Has clickat sobre l'element div1&amp;quot;.&lt;br /&gt;
Com aconseguiries que l'ordre en què es disparen els elements siguin els següents?:&lt;br /&gt;
*div1,div2,div3,div4&lt;br /&gt;
*div4,div3,div2,div1&lt;br /&gt;
*div1,div3,div4,div2&lt;br /&gt;
&lt;br /&gt;
=== Event document.onload ===&lt;br /&gt;
Crea una pàgina on sigui imprescindible assignar les funcions de resposta a events quan es dispara l'event document.onload.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Estrella Michelin ===&lt;br /&gt;
&lt;br /&gt;
Un restaurant té 4 tapes principals on cadascuna té un preu  1 €, 2 €, 3 € i 4 € (esquerra a dreta). &lt;br /&gt;
&lt;br /&gt;
Com el local és petit, es disposa de dos cambrers, cadascun d'ells té un botó que l'executarà en el cas de servir una tapa. Quan un cambrer serveixi una tapa haurà:&lt;br /&gt;
*1. Primer seleccionar-se amb el botó&lt;br /&gt;
*2. Clicar a la tapa o tapes servides.&lt;br /&gt;
&lt;br /&gt;
Cada vegada que el cambrer faci click a una tapa el seu preu s'incrementarà en la recaudació del cambrer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Michelin.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
:[[solucio michelin]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Fitxer:Gamepad.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
Dibuixa un rectangle i que es mova en funció del joystick, i mostre per pantalla els diferents botons.&lt;br /&gt;
 &lt;br /&gt;
http://html5gamepad.com&lt;br /&gt;
&lt;br /&gt;
:[[ejm_gamepad]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ratolí i Teclat ===&lt;br /&gt;
a) Es vol que el ratolí, en qualsevol punt de la finestra del navegador, es mostri la posició del punter respecte del navegador i respecte de la pàgina.&lt;br /&gt;
[[Fitxer:ex_ratoli.gif|100px]]&lt;br /&gt;
&lt;br /&gt;
b) Es vol que, a més a més, en prémer qualsevol tecla, el missatge mostrat ha de canviar per indicar el nou esdeveniment i la seva informació associada.&lt;br /&gt;
[[Fitxer:ex_teclat.gif|100px]]&lt;br /&gt;
&lt;br /&gt;
c)Afegir la següent característica al script: quan es prem un botó del ratolí, el color de fons del quadre de missatge ha de ser groc (#FFFFCC) i quan es prem una tecla, el color de fons ha de ser blau (#CCE6FF). En tornar a moure el ratolí, el color de fons torna a ser blanc.&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fitxer:ex_tec_rat_color.gif|200px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 6 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Posició ratolí ===&lt;br /&gt;
Crear un script que informi a l'usuari en què zona de la pantalla ha premut el ratolí. Les zones definides són les següents: esquerra a dalt, esquerra a baix, dreta a dalt i dreta a baix.&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 7 Events]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Cuadrat===&lt;br /&gt;
&lt;br /&gt;
Es desitja que un cuadrat es mova al llarg de la pantalla&lt;br /&gt;
&lt;br /&gt;
:[[sol_cuadrat]]&lt;br /&gt;
&lt;br /&gt;
=== Joc Tenis ===&lt;br /&gt;
Es tracta de implementar en Javascript un dels 1ers jocs que es va inventar per a PC. El joc del Tenis. &lt;br /&gt;
[[Fitxer:tenis.png|400px|center]]&lt;br /&gt;
Per començar el joc s'ha de pulsar la tecla 'S', per parar 'P' i per reinicializar la 'R'.&lt;br /&gt;
&lt;br /&gt;
Jugador 1:&lt;br /&gt;
*Utilitza el ratolí per el desplaçament de la raqueta&lt;br /&gt;
Jugador 2:&lt;br /&gt;
*tecla '↑' per desplaçar la raqueta cap a dalt&lt;br /&gt;
*tecla '↓' per desplaçar la raqueta cap a baix&lt;br /&gt;
Altres aspectes del joc&lt;br /&gt;
*A més a més, hi ha un marcador que indiqui qui va guanyant.&lt;br /&gt;
*També hi ha un botó, per exemple F2, per augmentar el número de pilotes&lt;br /&gt;
*També hi ha un botó per canviar els colors del joc. Pot existir diversos temes (F5-F8)&lt;br /&gt;
&lt;br /&gt;
https://www.w3schools.com/html/html5_draganddrop.asp&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Expressions Regulars =&lt;br /&gt;
Les expressions regulars son una necessitat a l'hora de validar formularis. Alguns problemes de validació no es podrien solucionar de una manera elegant sense elles.&lt;br /&gt;
Les expressions regulars son senzillament una manera d'expresar un patró per a cadenes coincidents de text. La expressions contenen termes i operadors que ens pemeten definir els patrons.&lt;br /&gt;
&lt;br /&gt;
== Creació d'expresions regulars ==&lt;br /&gt;
A Javascript, com succeeix amb la majoria d'objectes, existeixen dos formes de crear expresions regulars: &lt;br /&gt;
*mitjançant un literal&lt;br /&gt;
*creant una instància d'un objecte de tipus '''RegExp'''&lt;br /&gt;
&lt;br /&gt;
La creació d'una expressió regular amb un literal és molt sezill. Veïem un exemple. Volem crear una expressió regular que coincideixi exactament amb el string &amp;quot;test&amp;quot;:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = /test/;&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
Les expresions regulars van envoltades del caràctes /. Igual que els String van envoltades del caràcter &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
També podíem haver creat una instància del objecte RegExp de la següent manera:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = new RegExp(&amp;quot;test&amp;quot;);&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificadors ha utilitzar a l'hora de crear expressions regulars ==&lt;br /&gt;
A més a més de la propia expressió regular, podem introduïr els següents modificadors:&lt;br /&gt;
*''i'': Fa que no distingeixi de majúscules i minúscules. ex: /test/i&lt;br /&gt;
*''g'': Realitza una comparació global, en comptes de parar-se després de la primera coincidència.&lt;br /&gt;
*''m'': Realitza una comparació multilínia (més detalls a https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/multiline )&lt;br /&gt;
Exemple d'ús:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = /test/ig&lt;br /&gt;
var pattern2 = new RegExp(&amp;quot;test&amp;quot;,&amp;quot;ig&amp;quot;);&lt;br /&gt;
//exemple d'us de la expressió regular&lt;br /&gt;
alert(pattern.test(&amp;quot;test&amp;quot;));&lt;br /&gt;
alert(pattern2.test(&amp;quot;test&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termes i Operadors ==&lt;br /&gt;
&lt;br /&gt;
*''Coincidència exacta'': Tot lo que no sigui un caràcter especial o un operador haurà d'apareixer de forma literal en la expressió. Ex: /test/ la paraula '''test'' ha d'aparèixer exactament.&lt;br /&gt;
*''Combinacions de caràcters'': Moltes vegades no volem combinar un caràcter literal específic, sino un grup finit de caràcters. Podem especificar-ho col·locant el grup de caràcters que volem combinar entre claudàtors. Ex: [abc]&lt;br /&gt;
*''Combinacions de caràcters excloents'': Altres vegades volem combinar tots els caràcters trets d'uns quants. Per fer-ho podem utilitzar el símbol ''^'' seguit dels caràcters que no volem en la expresió. Ex: [^abc]. &lt;br /&gt;
*''Rang de valors'': També tenim la habilitat d'especificar un rang de valors. Ex: volem qualsevol caràcter entre '''a''' i '''m''' minmúscula --&amp;gt; [a-m] (ambdós incloses).&lt;br /&gt;
&lt;br /&gt;
=== Caràcters especials ===&lt;br /&gt;
Existeixen caràcters especials en les expresions regulars, de fet, ja hem vist uns quants: '''[''', ''']''', '''-''' i '''^'''.&lt;br /&gt;
Però encara hi ha uns quants més com serien el '''$''', '''{''', '''}''', '''?''', ''',''', '''+''' i el '''.'''&lt;br /&gt;
Com podem fer per utilitzar-los de forma literal en comptes d'utilitzar-los com a operadors de les expressions regulars? Escapant-los.&lt;br /&gt;
Però com? Utilitzant un caràcter especial: ''\''. Ex: La expressió regular '''/\[/''' significa el caràcter '''[''' i no l'inici d'un grup de caràcters.  &lt;br /&gt;
Així mateix, per poder utilitzar el caràcter '''\''' dintre de la expressió regular l'haurem d'escapar. Ex: '''\\''' correspon al literal '''\'''.&lt;br /&gt;
&lt;br /&gt;
=== Principis i finals ===&lt;br /&gt;
A vegades volem que un patró coincideixi amb el principi d'una cadena o amb el final. &lt;br /&gt;
*Principi: Utilitzarem el caràcter ''^''. Ex: /^test/ : només coincideix si la cadena '''test''' coincideix amb el principi.&lt;br /&gt;
*Final: Utilitzarem el caràcter ''$''. Ex: /test$/ : només coincideix si la cadena '''test''' coincideix amb el final.&lt;br /&gt;
*Principi i final: Ex: /^test$/ : Indica que el patró especificat ha d'incluir tota la cadena candidata.&lt;br /&gt;
&lt;br /&gt;
=== Repetició de caràcters ===&lt;br /&gt;
&lt;br /&gt;
Si volem combinar una serie de quatre caràcters 'a' podem expressar-ho amb ''/aaa/'' però que succeeix si volem utilitzar un número qualsevol de repeticions del mateix caràcter?&lt;br /&gt;
Tenim diferents opcions:&lt;br /&gt;
*Podem especificar que un caràcter és opcional, es a dir, &amp;lt;b&amp;gt;pot aparèixer alguna vegada o cap (0 ó 1)&amp;lt;/b&amp;gt;, Es fa afegint el caràcter '''''?''''' al final. Exemple: /t?est/. Aquest patró combina dues opcions: '''test i est'''.&lt;br /&gt;
*Si volem que un caràcter '''apareixi moltes vegades (1 o més)''' utilitzarem '''''+'''''. Ex: /t+est/. Aquest patró combina '''test''', '''ttest''' i '''tttest''' però no '''est'''.&lt;br /&gt;
*Si volem que un '''caràcter apareixi zero o més vegades (0 o més)''' utilitzem el caràcter '''*'''. Ex: /t*est/. Aquest patró combina '''test''', '''ttest''', '''tttest''' i també '''est'''.&lt;br /&gt;
*Podem especificar una quantitat concreta amb el número de repeticions permeses entre claudàtors '''''{}'''''Text en negreta. Per exemple, /a{4}/ indica una coincidència de quatre caràcters 'a' consecutius.&lt;br /&gt;
*També podem especificar un intérval per al compte de repeticions. Per exemple, /a{4,10}/ indica una combinació de 4 a 10 caracters 'a' consecutius.&lt;br /&gt;
*Si en aquest interval no s'indica el segon valor de l'intèrval indiquem que el número final és infinit. Ex: /a{4,}/. Aquest patró combina qualsevol cadena de cuatre o més caràcters 'a' consecutius. Fixat que és important posar la '''coma''' després del 4.&lt;br /&gt;
&lt;br /&gt;
=== Caràcters predefinits ===&lt;br /&gt;
La sintaxis de les expressions regulars ens proporcionen un nombre de termes predefinits que representen caràcters o clases de caràcters que s'utilitzen amb freqüència. &lt;br /&gt;
Taula:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Terme Predefinit&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Equivalència&lt;br /&gt;
|-&lt;br /&gt;
| \t ||Tabulació horitzontal&lt;br /&gt;
|-&lt;br /&gt;
| \b ||Retrocés&lt;br /&gt;
|-&lt;br /&gt;
| \v ||Tabulació Vertical&lt;br /&gt;
|-&lt;br /&gt;
| \f||Salt de página&lt;br /&gt;
|-&lt;br /&gt;
| \r||Retorn de carro.&lt;br /&gt;
|-&lt;br /&gt;
| \n||Nova linia&lt;br /&gt;
|-&lt;br /&gt;
| \cA : \cZ||Caràcters de control&lt;br /&gt;
|-&lt;br /&gt;
| \x0000 : \xFFFF||Unicode Hexadecimal&lt;br /&gt;
|-&lt;br /&gt;
|  \x00 : \xFF||ASCII Hexadecimal&lt;br /&gt;
|-&lt;br /&gt;
| .||Qualsevol caràcter, excepte nova linia&lt;br /&gt;
|-&lt;br /&gt;
|  \d||Qualsevol dígit decimal. Equivalent a [0-9]&lt;br /&gt;
|-&lt;br /&gt;
| \D||Qualsevol caràcter menys un dígit decimal. Equivalent a [^0-9]&lt;br /&gt;
|-&lt;br /&gt;
| \w||Qualsevol caràcter alfanuméric incloent el subratllat. [A-Za-z0-9_]&lt;br /&gt;
|-&lt;br /&gt;
| \W||Qualsevol caràcter menys els alfanumèric i el subratllat. [^A-Za-z0-9_]&lt;br /&gt;
|-&lt;br /&gt;
| \s||Qualsevol espai en blanc (espai, tabulador, salt de pàgina,etc.)&lt;br /&gt;
|-&lt;br /&gt;
| \S||Qualsevol caràcter menys un espai en blanc.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Per veure el llistat complert fes click [http://www.visibone.com/regular-expressions/ aquí].&lt;br /&gt;
&lt;br /&gt;
=== Agrupació de caràcters ===&lt;br /&gt;
De moment, hem observat que els operadors + i * només afecten al terme que els '''precedeix'''. Si volem aplicar-los a un grup de termes, podem utilitzar ''parèntesis'', igual que si es tractés d'una formula matemàtica. Per exemple: /(ab)+/. Aquest patró combina una o més aparicions de la cadena '''ab'''.&lt;br /&gt;
&lt;br /&gt;
=== Alternància de caràcters ===&lt;br /&gt;
La alternància pot expressar-se utilitzant el caràcter '''|'''. Per exemple: /a|b/ combina el caràcter '''a''' o '''b''', i /(ab)+|(cd)+/ combina només una o més repeticions de '''ab''' o '''cd'''.&lt;br /&gt;
&lt;br /&gt;
== Mètodes de les Expressions Regulars ==&lt;br /&gt;
*''pattern.test(cadena)'' : Executa la expressió regular e indica si la cadena passada per paràmetre coincideix o no. (retorna True o False)&lt;br /&gt;
*''pattern.exec(cadena)'' : Executa la expressió regular i retorna la primera coincidència.&lt;br /&gt;
== Resum Expressions Regulars ==&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Expresiones.jpg]]&lt;br /&gt;
[http://rua.ua.es/dspace/bitstream/10045/13363/6/07c-JavaScriptExpReg.pdf Resum Expressions Regulars]&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.regexr.com/ Comprovar expressions regulars]&lt;br /&gt;
&lt;br /&gt;
[https://regex101.com/ Comprovar expressions regulars II]&lt;br /&gt;
&lt;br /&gt;
Crea un patró per a cadascuna de les diferents cadenes que es mostren a continuació:&lt;br /&gt;
&lt;br /&gt;
*Codi postal. Ex: 46700&lt;br /&gt;
*Numero de telèfon amb prefix i guións, el primer nombre pot ser un 8 ó 9. Ex: 93-123-11-33&lt;br /&gt;
*Numero de telèfon amb prefix i punts. Ex: 93-1.231.1339&lt;br /&gt;
*Numero de telèfon internacional. Ex: (+34)952356817 &lt;br /&gt;
*Nom d'usuari amb un mínim de 4 i un màxim de 15. Ex: julio_30&lt;br /&gt;
*Nombre Real. Ex:  -122.33 ó 7,3 ó 8 &lt;br /&gt;
*Numero ISBN de 13 dígits: 978-3-16-148410-0&lt;br /&gt;
*Numero de la seguretat social: 01-123456789&lt;br /&gt;
*Adreça Postal amb les següent condicions: Carrer (C\), Plaza(Pz.), Avinguda(Av.). Direcció. Numero - Porta.&lt;br /&gt;
Ex: C\ Mare de Deu de montserrat. 233 - 2&lt;br /&gt;
*Numero IP d'un ordinador de la versió 4.&lt;br /&gt;
*Numero Mac d'un ordinador separats per ':'&lt;br /&gt;
*URL (amb http, https, www, etc)&lt;br /&gt;
*Data: Ex: DD/MM/AAAA&lt;br /&gt;
*Hora: 23:55:55&lt;br /&gt;
*Email&lt;br /&gt;
*Comprobar un nombre propio&lt;br /&gt;
*Targeta de crèdit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Codi postal. Ex: 46700&lt;br /&gt;
**sol: ^\d{5}$ &lt;br /&gt;
*Numero de telèfon amb prefix i guións, el primer nombre pot ser un 8 ó 9. Ex: 93-123-11-33&lt;br /&gt;
**sol: ^[89](\d-\d{3})-\d{2}-\d{2}$&lt;br /&gt;
*Numero de telèfon amb prefix i punts. Ex: 93-1.231.1339&lt;br /&gt;
**sol: ^[89](\d-\d.)\d{3}\.\d{3}$&lt;br /&gt;
*Numero de telèfon internacional. Ex: (+34)952356817 &lt;br /&gt;
**sol: ^\(\+\d{2,3}\)\d{9}$&lt;br /&gt;
*Nom d'usuari amb un mínim de 4 i un màxim de 15. Ex: julio_30&lt;br /&gt;
**sol: ^[a-z\d_]{4,15}$&lt;br /&gt;
*Nombre Real. Ex:  -122.33 ó 7,3 ó 8 &lt;br /&gt;
**sol: ^[+-]?\d+([,.]\d+)?$    &lt;br /&gt;
*Numero ISBN de 13 dígits: 978-3-16-148410-0&lt;br /&gt;
*Numero de la seguretat social: 01-123456789&lt;br /&gt;
**sol: ^\d{2}-\d{9}$&lt;br /&gt;
**sol: ^[0-1]{2}-\d{9}$&lt;br /&gt;
*Adreça Postal amb les següent condicions: Carrer (C\), Plaza(Pz.), Avinguda(Av.). Direcció. Numero - Porta.&lt;br /&gt;
Ex: C\ Mare de Deu de montserrat. 233 - 2&lt;br /&gt;
**sol: ^((C\\)|(Pz\.)|(Av\.))\s.+\.\s\d{1,5}\s-\s\d$&lt;br /&gt;
((C\\)|(Pz\.)|(Av\.))[a-zA-Z ]+\.[0-9 ]+\-[0-9 ]+&lt;br /&gt;
*Numero IP d'un ordinador de la versió 4.&lt;br /&gt;
** sol: ^((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]?)\.)((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]|[0-9])\.){2}((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]|[0-9]))$&lt;br /&gt;
 ^(?:\d{1,3}\.){3}\d{1,3}$&lt;br /&gt;
*Numero Mac d'un ordinador separats per ':'&lt;br /&gt;
*URL (amb http, https, www, etc)&lt;br /&gt;
**sol:(www\.|http:\/\/|https:\/\/)\S*\.(com|es|org))&lt;br /&gt;
*Data: Ex: DD/MM/AAAA&lt;br /&gt;
**sol: ^\d{1,2}\/\d{1,2}\/\d{2,4}$ &lt;br /&gt;
         ^([3][0-1]|[0-2][0-9])\/[0-1]?[0-2]\/[1-2]\d{3}$  coge hasta el día 31 y el mes 12 &lt;br /&gt;
*Hora: 23:55:55&lt;br /&gt;
**sol: ^(0[1-9]|1\d|2[0-3]):([0-5]\d):([0-5]\d)$ &lt;br /&gt;
*Email&lt;br /&gt;
**sol: /^[\w]+@{1}[\w]+\.[a-z]{2,3}$/&lt;br /&gt;
**sol: ^[\\w-]+(\\.[\\w-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$ &lt;br /&gt;
*Comprobar un nombre propio&lt;br /&gt;
**sol: /^([A-Z]{1}[a-zñáéíóú]+[\s]*)+$/ &lt;br /&gt;
*Targeta de crèdit&lt;br /&gt;
**sol:  ^((67\d{2})|(4\d{3})|(5[1-5]\d{2})|(6011))(-?\s?\d{4}){3}|(3[4,7])\ d{2}-?\s?\d{6}-?\s?\d{5}$&lt;br /&gt;
&lt;br /&gt;
= Formularis =&lt;br /&gt;
JavaScript disposa de nombroses propietats i funcions que faciliten la programació d'aplicacions que manegen formularis. En primer lloc, quan es carrega una pàgina web, el navegador crea automàticament una matriu anomenat forms i que conté la referència a tots els formularis de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Per accedir al array forms , s'utilitza l'objecte document , de manera que document.forms és la matriu que conté tots els formularis de la pàgina. Com es tracta d'un array, l'accés a cada formulari es realitza amb la mateixa sintaxi dels arrays. La següent instrucció accedeix al primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més de l'array de formularis, el navegador crea automàticament una matriu anomenat ''elements'' per cadascun dels formularis de la pàgina. Cada array elements conté la referència a tots els elements (quadres de text, botons, llistes desplegables, etc.) d'aquest formulari. Utilitzant la sintaxi dels arrays, la següent instrucció obté el primer element del primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]. elements [0]; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La sintaxi dels arrays no sempre és tan concisa. El següent exemple mostra com obtenir directament l'últim element del primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]. elements [document. forms [0]. elements. length - 1];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Encara que aquesta forma d'accedir als formularis és ràpida i senzilla, té un inconvenient molt greu. Què passa si canvia el disseny de la pàgina i en el codi HTML es canvia l'ordre dels formularis originals o s'afegeixen nous formularis? El problema és que &amp;quot;el primer formulari de la pàgina&amp;quot; ara podria ser un altre formulari diferent al que espera l'aplicació.&lt;br /&gt;
&lt;br /&gt;
En un entorn tan canviant com el disseny web, és molt difícil confiar que l'ordre dels formularis es mantingui estable en una pàgina web. Per aquest motiu, sempre s'hauria d'evitar l'accés als formularis d'una pàgina mitjançant l'array ''document.forms''.&lt;br /&gt;
&lt;br /&gt;
Una forma d'evitar els problemes del mètode anterior consisteix a accedir als formularis d'una pàgina a través del seu nom (atribut '''name''') o a través del seu atribut '''id''' . L'objecte document permet accedir directament a qualsevol formulari mitjançant la seva atribut '''name''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var formularioPrincipal = document. formulari;&lt;br /&gt;
 var formularioSecundario = document. otro_formulario;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/ Form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;otro_formulario&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Accedint d'aquesta forma als formularis de la pàgina, l'script funciona correctament encara que es reordenin els formularis o s'afegeixin nous formularis a la pàgina. Els elements dels formularis també es poden accedir directament mitjançant el seu atribut '''name''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  var formularioPrincipal = document. formulari;&lt;br /&gt;
 var primerElemento = document. formulari. element;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;Input type = &amp;quot;text&amp;quot; name = &amp;quot;element&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Òbviament, també es pot accedir als formularis i als seus elements utilitzant les funcions DOM d'accés directe als nodes. El següent exemple utilitza l'habitual funció '''document.getElementById()''' per accedir de forma directa a un formulari i un dels seus elements:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var formularioPrincipal = document. getElementById (&amp;quot;formulari&amp;quot;);&lt;br /&gt;
 var primerElemento = document. getElementById (&amp;quot;element&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot; id = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;Input type = &amp;quot;text&amp;quot; name = &amp;quot;element&amp;quot; id = &amp;quot;element&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Independentment del mètode utilitzat per obtenir la referència a un element de formulari, cada element disposa de les següents propietats útils per al desenvolupament de les aplicacions:&lt;br /&gt;
*''type'' : indica el tipus d'element que es tracta. Per als elements de tipus &amp;lt;input&amp;gt; ( text , button , checkbox , etc.) coincideix amb el valor del seu atribut '''type''' . Per a les llistes desplegables normals (element &amp;lt;select&amp;gt; ) el seu valor és '''select-one''' , el que permet diferenciar-les de les llistes que permeten seleccionar diversos elements alhora i el tipus és '''select-multiple'''. Finalment, en els elements de tipus &amp;lt;textarea&amp;gt; , el valor de type és '''textarea''' .&lt;br /&gt;
*''form'' : és una referència directa al formulari al qual pertany l'element. Així, per accedir al formulari d'un element, es pot utilitzar document.getElementById(&amp;quot;id_del_elemento&amp;quot;).form&lt;br /&gt;
*''name'' : obté el valor de l'atribut name de XHTML. Només es pot llegir el seu valor, per la qual cosa no es pot modificar.&lt;br /&gt;
*''value'' : permet llegir i modificar el valor de l'atribut value de XHTML. Per als camps de text ( &amp;lt;input type=&amp;quot;text&amp;quot;&amp;gt; i &amp;lt;textarea&amp;gt; ) obté el text que ha escrit l'usuari. Per als botons obté el text que es mostra al botó. Per als elements checkbox i radiobutton no és molt útil, com es veurà més endavant&lt;br /&gt;
&lt;br /&gt;
== Validació ==&lt;br /&gt;
&lt;br /&gt;
La principal utilitat de JavaScript en el maneig dels formularis és la validació de les dades introduïdes pels usuaris. Abans d'enviar un formulari al servidor, es recomana validar mitjançant JavaScript les dades inserides per l'usuari. D'aquesta manera, si l'usuari ha comès algun error en omplir el formulari, se li pot notificar de forma instantània, sense necessitat d'esperar la resposta del servidor.&lt;br /&gt;
&lt;br /&gt;
Notificar els errors de forma immediata mitjançant JavaScript millora la satisfacció de l'usuari amb l'aplicació (el que tècnicament es coneix com &amp;quot;millorar l'experiència d'usuari&amp;quot;) i ajuda a reduir la càrrega de processament al servidor.&lt;br /&gt;
&lt;br /&gt;
Normalment, la validació d'un formulari consisteix en cridar a una funció de validació quan l'usuari prem sobre el botó d'enviament del formulari. En aquesta funció, es comproven si els valors que ha introduït l'usuari compleixen les restriccions imposades per l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Encara que hi ha tantes possibles comprovacions com a elements de formulari diferents, algunes comprovacions són molt habituals: que ompli un camp obligatori, que se seleccioni el valor d'una llista desplegable, que l'adreça d'email indicada sigui correcta, que la data introduïda sigui lògica, que s'hagi introduït un nombre on així es requereix, etc.&lt;br /&gt;
&lt;br /&gt;
A continuació es mostra el codi JavaScript bàsic necessari per incorporar la validació a un formulari:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form name=&amp;quot;formulario&amp;quot;  onSubmit=&amp;quot;return ValidaCampos()&amp;quot;&amp;gt;&lt;br /&gt;
 Teléfono: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;telefono&amp;quot; size=&amp;quot;15&amp;quot; maxlength=&amp;quot;15&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
           &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enviar&amp;quot; name=&amp;quot;enviar&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
I l'esquema de la funció validacio() és el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ValidaCampos() {&lt;br /&gt;
   var expresion_regular_telefono = /^[89](\d-\d.)\d{3}\.\d{3}$/;  &lt;br /&gt;
// 9 cifras numéricas.&lt;br /&gt;
// Usaremos el método &amp;quot;test&amp;quot; de las expresiones regulares:&lt;br /&gt;
      if (expresion_regular_telefono.test(formulario.telefono.value) == false) {&lt;br /&gt;
                alert('Campo TELEFONO no válido.');&lt;br /&gt;
                return false; // sale de la función y NO envía el formulario&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                alert('Gracias por rellenar nuestro formulario correctamente.');&lt;br /&gt;
                return true; // sale de la función y SÍ envía el formulario&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El funcionament d'aquesta tècnica de validació es basa en el comportament de l'esdeveniment '''onsubmit''' de JavaScript. Igual que altres esdeveniments com '''onclick''' i '''onkeypress''' , l'esdeveniment '''onsubmit''' varia el seu comportament en funció del valor que retorna.&lt;br /&gt;
&lt;br /&gt;
Així, si l'esdeveniment '''onsubmit''' torna el valor '''true''' , el formulari s'envia com ho faria normalment. No obstant això, si l'esdeveniment onsubmit torna el valor '''false''' , el formulari no s'envia. La clau d'aquesta tècnica consisteix a comprovar tots i cadascun dels elements del formulari. En tant es troba un element incorrecte, es torna el valor '''false''' . Si no es troba cap error, es torna el valor '''true'''.&lt;br /&gt;
&lt;br /&gt;
Per tant, en primer lloc es defineix l'esdeveniment '''onsubmit''' del formulari com:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  onsubmit = &amp;quot;return validacio()&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Com el codi JavaScript retorna el valor resultant de la funció '''validacio()''' , el formulari només s'enviarà al servidor si aquesta funció retorna '''true''' . En el cas que la funció '''validacio()''' retorni '''false''' , el formulari romandrà sense enviar.&lt;br /&gt;
&lt;br /&gt;
Dins de la funció '''validacio()''' es comproven totes les condicions imposades per l'aplicació. Quan no es compleix una condició, es retorna '''false''' i per tant el formulari no s'envia. Si s'arriba al final de la funció, totes les condicions s'han complert correctament, de manera que es retorna '''true''' i el formulari s'envia.&lt;br /&gt;
&lt;br /&gt;
La notificació dels errors comesos depèn del disseny de cada aplicació. En el codi de l'exemple anterior simplement es mostren missatges mitjançant la funció '''alert()''' indicant l'error produït. Les aplicacions web ben dissenyades mostren cada missatge d'error al costat de l'element de formulari corresponent i també solen mostrar un missatge principal indicant que el formulari conté errors.&lt;br /&gt;
&lt;br /&gt;
Un cop definit l'esquema de la funció '''validacio()''' , s'ha d'afegir a aquesta funció el codi corresponent a totes les comprovacions que es realitzen sobre els elements del formulari.&lt;br /&gt;
&lt;br /&gt;
== Validació formularis HTML5==&lt;br /&gt;
&lt;br /&gt;
[http://cybmeta.com/validacion-de-formularios-con-html5/ Validació formularis HTML5 I]&lt;br /&gt;
&lt;br /&gt;
[http://mytutorials85.blogspot.com.es/2012/04/formularios-en-html5.html?email=fdfds%40fds Validació formularis HTML5 II]&lt;br /&gt;
&lt;br /&gt;
[https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation Client-side form validation]&lt;br /&gt;
&lt;br /&gt;
== Exercicis de Validació ==&lt;br /&gt;
&lt;br /&gt;
=== Formulari de validació 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea un formulari que demani 4 camps en un textbox: nom, cognoms, email i telèfon. El formulari tindrà un botó &amp;quot;Enviar&amp;quot; que validarà el contingut dels textbox i en cas de passar les validacions s'obrirà una nova pàgina (que no cal que existeixi) amb els valors introduïts passats amb el mètode GET:&lt;br /&gt;
*tots els camps seran obligatoris&lt;br /&gt;
*el format serà el típic de cada camp&lt;br /&gt;
*mostra els missatges d'error d'un en un, per ordre i posant el focus al camp que produeix cada error&lt;br /&gt;
*usa els elements que coneixes de HTML, CSS, etc per a marcar l'error. Sigues creatiu&lt;br /&gt;
&lt;br /&gt;
=== Formulari de validació 2 ===&lt;br /&gt;
&lt;br /&gt;
Al formulari anterior afegeix els camps data de naixement, adreça, codi postal i municipi (per aquest ordre) tenint en compte:&lt;br /&gt;
*la data de naixement ha de ser vàlida, en format dd/mm/aaaa i anterior a la data actual.&lt;br /&gt;
*l'adreça estarà formada per caràcters alfanumèrics i també admetrà espais,comes i guions.&lt;br /&gt;
*el codi postal i municipi tindran el format típic d'aquests camps.&lt;br /&gt;
&lt;br /&gt;
=== solució ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.input_ok {background-color: lightcyan}&lt;br /&gt;
.input_error {background-color: rgb(255, 255, 119)}&lt;br /&gt;
.label_error {color: darkred}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body &amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Exercici 1 de Validacions&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;form name=&amp;quot;formulari&amp;quot; onSubmit=&amp;quot;return valida()&amp;quot; action=&amp;quot;ex_validacions.html&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label for=&amp;quot;nom&amp;quot;&amp;gt;Nom:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;nom&amp;quot; name=&amp;quot;nom&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_nom&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;cognoms&amp;quot;&amp;gt;Cognoms:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;cognoms&amp;quot; name=&amp;quot;cognoms&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_cognoms&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;email&amp;quot;&amp;gt;Email:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;email&amp;quot; name=&amp;quot;email&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_email&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;telefon&amp;quot;&amp;gt;Telefon:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;telefon&amp;quot; name=&amp;quot;telefon&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_telefon&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;data&amp;quot;&amp;gt;Data de naixement:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;data&amp;quot; name=&amp;quot;data&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_data&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;adreca&amp;quot;&amp;gt;Adreça:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;adreca&amp;quot; name=&amp;quot;adreca&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_adreca&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;cp&amp;quot;&amp;gt;Codi postal:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;cp&amp;quot; name=&amp;quot;cp&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_cp&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;municipi&amp;quot;&amp;gt;Municipi:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;municipi&amp;quot; name=&amp;quot;municipi&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_municipi&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body &amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function valida(){&lt;br /&gt;
&lt;br /&gt;
var nom=document.getElementById(&amp;quot;nom&amp;quot;).value;&lt;br /&gt;
var cognoms=document.getElementById(&amp;quot;cognoms&amp;quot;).value;&lt;br /&gt;
var email=document.getElementById(&amp;quot;email&amp;quot;).value;&lt;br /&gt;
var telefon=document.getElementById(&amp;quot;telefon&amp;quot;).value;&lt;br /&gt;
var data=document.getElementById(&amp;quot;data&amp;quot;).value;&lt;br /&gt;
var adreca=document.getElementById(&amp;quot;adreca&amp;quot;).value;&lt;br /&gt;
var cp=document.getElementById(&amp;quot;cp&amp;quot;).value;&lt;br /&gt;
var municipi=document.getElementById(&amp;quot;municipi&amp;quot;).value;&lt;br /&gt;
var patt_alfanumeric = /^[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ]+(\s[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ]+)*$/;&lt;br /&gt;
var patt_email = /^\w+@\w+\.\w+$/;&lt;br /&gt;
var patt_telefon =/^\d{9}$/;&lt;br /&gt;
var patt_data = /^\d{2}\/\d{2}\/\d{4}$/;&lt;br /&gt;
var patt_adreca = /^[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ\,\.\-]+(\s[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ\,\.\-]+)*$/;&lt;br /&gt;
var patt_cp=/^\d{5}$/;&lt;br /&gt;
&lt;br /&gt;
// reset format dels textbox i missatges d'error&lt;br /&gt;
document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//validació del nom&lt;br /&gt;
if(nom==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_alfanumeric.test(nom)) {&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació dels cognoms&lt;br /&gt;
if(cognoms==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_alfanumeric.test(cognoms)) {&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del email&lt;br /&gt;
if(email==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_email.test(email)) {&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (ex. usuari@servidor.xx)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del telefon&lt;br /&gt;
if(telefon==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_telefon.test(telefon)) {&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (6 digits)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació de la data&lt;br /&gt;
if(data==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_data.test(data)) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (dd/mm/aaaa)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var components_data = data.split(&amp;quot;/&amp;quot;);&lt;br /&gt;
var val_data=Date.parse(components_data[2]+&amp;quot;/&amp;quot;+components_data[1]+&amp;quot;/&amp;quot;+components_data[0]);&lt;br /&gt;
&lt;br /&gt;
if(isNaN(val_data)) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;data no vàlida&amp;quot;;&lt;br /&gt;
	return false;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var today=new Date();&lt;br /&gt;
if(val_data&amp;gt;=today) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;la data ha de ser anterior a la data acutal&amp;quot;;&lt;br /&gt;
	return false;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//validació de l'adreça&lt;br /&gt;
if(adreca==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_adreca.test(adreca)) {&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del codi postal&lt;br /&gt;
if(cp==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_cp.test(cp)) {&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (5 digits)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del municipi&lt;br /&gt;
if(municipi==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_adreca.test(municipi)) {&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return true;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
	&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
POSIBLE EJERCICIO&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tags = document.querySelectorAll('h1,h2,h3,h4,h5,h6,div,p');&lt;br /&gt;
for (var i = tags.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
  tags[i].style.outline = &amp;quot;1px solid green&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validar un camp de text Obligatori ===&lt;br /&gt;
Es tracta de forçar l'usuari a introduir un valor en un quadre de text o textarea en què sigui obligatori.Perquè es doni per completat un camp de text obligatori, es comprova que el valor introduït sigui vàlid, que el nombre de caràcters introduït sigui més gran que zero i que no s'hagin introduït només espais en blanc.  El text introduït tingui una longitud superior a zero caràcters, és a dir, que no sigui un text buit i per últim, el valor introduït per l'usuari no només estigui format per espais en blanc.&lt;br /&gt;
&lt;br /&gt;
:[[solució_valor_quadre_text]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un camp de text amb valors numèrics ===&lt;br /&gt;
Es tracta d'obligar l'usuari a introduir un valor numèric en un quadre de text.&lt;br /&gt;
:[[solucio_camp_text]]&lt;br /&gt;
&lt;br /&gt;
===  Validar que s'ha seleccionat una opció d'una llista ===&lt;br /&gt;
Es tracta d'obligar l'usuari a seleccionar un element d'una llista desplegable.&lt;br /&gt;
:[[solucio_llista]]&lt;br /&gt;
&lt;br /&gt;
=== Validar una adreça de correu electrònic ===&lt;br /&gt;
Es tracta d'obligar l'usuari a introduir una adreça de correu amb un format vàlid. Per tant, el que es comprova és que la direcció sembli vàlida, ja que no es comprova si es tracta d'un compte de correu electrònic real i operativa. La comprovació es realitza novament mitjançant les expressions regulars, ja que les adreces de correu electrònic vàlides poden ser molt diferents.&lt;br /&gt;
:[[solucio_correu_electronic]]&lt;br /&gt;
&lt;br /&gt;
=== Validar una data ===&lt;br /&gt;
Les dates solen ser els camps de formulari més complicats de validar per la multitud de formes diferents en què es poden introduir.&lt;br /&gt;
:[[solucio_dates]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un número de DNI ===&lt;br /&gt;
Es tracta de comprovar que el nombre proporcionat per l'usuari es correspon amb un nombre vàlid de document nacional d'identitat o DNI. Encara que per cada país o regió els requisits del document d'identitat de les persones poden variar, a continuació es mostra un exemple genèric fàcilment adaptable. La validació no només ha de comprovar que el nombre estigui format per vuit xifres i una lletra, sinó que també cal comprovar que la lletra indicada és correcta per al número introduït.&lt;br /&gt;
:[[solució_dni]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un número de telèfon ===&lt;br /&gt;
Els números de telèfon poden ser indicats de formes molt diferents: amb prefix nacional, amb prefix internacional, agrupat per parells, separant els números amb guions, etc.&lt;br /&gt;
:[[solucio_telefon]]&lt;br /&gt;
&lt;br /&gt;
=== Validar que un checkbox ha estat seleccionat ===&lt;br /&gt;
*a)Es tracta de validar si un element de tipus checkbox s'ha de seleccionar de forma obligatòria. &lt;br /&gt;
*b)Es tracta de validar si tots els checkbox del formulari han estat seleccionats.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_checkbox]]&lt;br /&gt;
&lt;br /&gt;
=== Validar que un radiobutton ha estat seleccionat ===&lt;br /&gt;
Encara que es tracta d'un cas similar al dels checkbox, la validació dels radiobutton presenta una diferència important: en general, la comprovació que es realitza és que l'usuari hagi seleccionat algun radiobutton dels que formen un determinat grup.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_radiobutton]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;JavaScript RegExp Reference: https://www.w3schools.com/jsref/jsref_obj_regexp.asp&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Experiments amb Expresions Regulars: http://www.regexplanet.com/advanced/javascript/index.html &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;John Resig, Bear Bibeault, &amp;quot;Secrets of the Javascript Ninja&amp;quot;, Manning Publications, 2012. ISBN 193398869X&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[http://librosweb.es/javascript/capitulo_7.html Introducció a Javascript] &amp;lt;/p&amp;gt; &amp;lt;p&amp;gt; [https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions Expressions Regulars a Mozilla]&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_Esdeveniments_i_Validacio_de_formularis&amp;diff=16999</id>
		<title>NF1 - Esdeveniments i Validacio de formularis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_Esdeveniments_i_Validacio_de_formularis&amp;diff=16999"/>
				<updated>2023-01-13T16:46:46Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Esdeveniments =&lt;br /&gt;
Fins ara, totes les aplicacions i scripts que s'han creat tenen alguna cosa en comú: s'executen des de la primera instrucció fins a l'última de forma seqüencial. Gràcies a les estructures de control de flux (if, for, while) és possible modificar lleugerament aquest comportament i repetir alguns trossos del script i saltar-se altres trossos en funció d'algunes condicions.&lt;br /&gt;
&lt;br /&gt;
Aquest tipus d'aplicacions són poc útils, ja que no interactuen amb els usuaris i no poden respondre als diferents esdeveniments que es produeixen durant l'execució d'una aplicació. Afortunadament, les aplicacions web creades amb el llenguatge Javascript poden utilitzar el model de programació basada en esdeveniments.&lt;br /&gt;
&lt;br /&gt;
En aquest tipus de programació, els scripts es dediquen a esperar al fet que l'usuari &amp;quot;faci alguna cosa&amp;quot; (que premi una tecla, que mogui el ratolí, que tanqui la finestra del navegador). A continuació, el script respon a l'acció de l'usuari normalment processant aquesta informació i generant un resultat.&lt;br /&gt;
&lt;br /&gt;
Els esdeveniments fan possible que els usuaris transmetin informació als programes. Javascript defineix nombrosos esdeveniments que permeten una interacció completa entre l'usuari i les pàgines/aplicacions web. La pulsació d'una tecla constitueix un esdeveniment, així com punxar o moure el ratolí, seleccionar un element d'un formulari, redimensionar la finestra del navegador, etc.&lt;br /&gt;
&lt;br /&gt;
Javascript permet assignar una funció a cadascun dels esdeveniments. D'aquesta forma, quan es produeix qualsevol esdeveniment, Javascript executa la seva funció associada. Aquest tipus de funcions es denominen &amp;quot;event handlers&amp;quot; en anglès i solen traduir-se per &amp;quot;manegadors d'esdeveniments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Model bàsic d'esdeveniments ==&lt;br /&gt;
=== Tipus d'esdeveniments ===&lt;br /&gt;
En aquest model, cada element o etiqueta XHTML defineix la seva pròpia llista de possibles esdeveniments que se li poden assignar. Un mateix tipus d'esdeveniment (per exemple, clicar el botó esquerre del ratolí) pot estar definit per a diversos elements XHTML diferents i un mateix element XHTML pot tenir associats varis esdeveniments diferents.&lt;br /&gt;
&lt;br /&gt;
El nom de cada esdeveniment es construeix mitjançant el prefix ''on'', seguit del nom en anglès de l'acció associada a l'esdeveniment. Així, l'esdeveniment de punxar un element amb el ratolí es denomina ''onclick'' i l'esdeveniment associat a l'acció de moure el ratolí es denomina ''onmousemove''.&lt;br /&gt;
&lt;br /&gt;
La següent taula resumeix els esdeveniments més importants definits per Javascript:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Event&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Descripció&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Elements per els que está definit&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onblur&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deseleccionar l'element (el contrari de onfocus)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;button&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;label&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onchange&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Succeeix quan el valor del element ha canviat&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onclick&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;clicar i deixar anar el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;ondblclick&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;clicar dos vegades seguides amb el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onfocus&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Seleccionar un element&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;button&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;label&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeydown&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer una tecla (sense deixar-la anar)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeypress&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer una tecla&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeyup&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deixar anar una tecla premuda&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onload&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;La pàgina s'ha carregat completament&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmousedown&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer (sense deixar anar) un botn del ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmousemove&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Moure el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseout&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;El ratolí &amp;lt;em&amp;gt;&amp;quot;surt&amp;quot;&amp;lt;/em&amp;gt; de l'element (passa sobre un altre element)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseover&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;El ratoli &amp;lt;em&amp;gt;&amp;quot;entra&amp;quot;&amp;lt;/em&amp;gt; dintre de l'elemento (passa per sobre de l'element)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseup&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deixar anar el botó que estava premut en el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onreset&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Inicialitzar el formulari (esborrar totes les dades)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;form&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onresize&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;S'ha modificat la mida de la finestra del navegador&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onselect&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Seleccionar un text&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onsubmit&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Enviar el formulari&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;form&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onunload&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;S'abandona la pàgina (per exemple al tancar el navegador)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu veure tots el esdeveniments [[http://www.w3schools.com/jsref/dom_obj_event.asp aquí]]&lt;br /&gt;
&lt;br /&gt;
===Gestor  d'esdeveniments===&lt;br /&gt;
&lt;br /&gt;
Un esdeveniment de Javascript per si mateix manca d'utilitat. Perquè els esdeveniments resultin útils, s'han d'associar funcions o codi Javascript a cada esdeveniment. D'aquesta forma, quan es produeix un esdeveniment s'executa el codi indicat, per la qual cosa l'aplicació pot respondre davant qualsevol esdeveniment que es produeixi durant la seva execució.&lt;br /&gt;
&lt;br /&gt;
Les funcions o codi Javascript que es defineixen per a cada esdeveniment es denominen &amp;quot;manegador d'esdeveniments&amp;quot; i com Javascript és un llenguatge molt flexible, existeixen diverses formes diferents d'indicar els manegadors:&lt;br /&gt;
&lt;br /&gt;
*Manejadores com a atributs dels elements XHTML.&lt;br /&gt;
*Manejadores com a funcions Javascript externes.&lt;br /&gt;
*Manejadores &amp;quot;semàntics&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments com a atributs XHTML ====&lt;br /&gt;
&lt;br /&gt;
Es tracta del mètode més senzill i alhora menys professional d'indicar el codi Javascript que s'ha d'executar quan es produeixi un esdeveniment. En aquest cas, el codi s'inclou en un atribut del propi element XHTML. En el següent exemple, es vol mostrar un missatge quan l'usuari cliqui amb el ratolí sobre un botó:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquest mètode, es defineixen atributs XHTML amb el mateix nom que els esdeveniments que es volen manejar. L'exemple anterior només vol controlar l'esdeveniment de clicar amb el ratolí, el nom del qual és onclick. Així, l'element XHTML pel qual es vol definir aquest esdeveniment, ha d'incloure un atribut anomenat onclick.&lt;br /&gt;
&lt;br /&gt;
El contingut de l'atribut és una cadena de text que conté totes les instruccions Javascript que s'executen quan es produeix l'esdeveniment. En aquest cas, el codi Javascript és molt senzill (alert('Gràcies per clicar');), ja que solament es tracta de mostrar un missatge.&lt;br /&gt;
&lt;br /&gt;
En aquest altre exemple, quan l'usuari punxa sobre l'element &amp;lt;div&amp;gt; es mostra un missatge i quan l'usuari passa el ratolí per sobre de l'element, es mostra un altre missatge:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div onclick=&amp;quot;alert('Has clicat amb el ratolí');&amp;quot; onmouseover=&amp;quot;alert('Acabes de passar el ratolí per damunt');&amp;quot;&amp;gt;Ratolí&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pots clicar sobre aquest element o simplement passar el ratolí per damunt.&lt;br /&gt;
Aquest altre exemple inclou una de les instruccions més utilitzades en les aplicacions Javascript més antigues:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body onload=&amp;quot;alert(&amp;quot;La pàgina s'ha carregat completament &amp;quot;);&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior es mostra després que la pàgina s'hagi carregat completament, és a dir, després que s'hagi descarregat el seu codi HTML, les seves imatges i qualsevol altre objecte inclòs a la pàgina.&lt;br /&gt;
&lt;br /&gt;
L'esdeveniment onload és un dels més utilitzats ja que, com veurem en el capítol de DOM, les funcions que permeten accedir i manipular els nodes de l'arbre DOM solament estan disponibles quan la pàgina s'ha carregat completament.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments i variable this ====&lt;br /&gt;
&lt;br /&gt;
En els esdeveniments, es pot utilitzar la variable '''this''' per referir-se a l'element XHTML que ha provocat l'esdeveniment. Aquesta variable és molt útil per a exemples com el següent:&lt;br /&gt;
&lt;br /&gt;
Quan l'usuari passa el ratolí per sobre de el &amp;lt;div&amp;gt;, el color de la vora es mostra de color negre. Quan el ratolí surt de el &amp;lt;div&amp;gt;, es torna a mostrar la vora amb el color gris clar original.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Element &amp;lt;div&amp;gt; original:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si no s'utilitza la variable this, el codi necessari per modificar el color de les vores, seria el següent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;document.getElementById('continguts').style.borderColor='black';&amp;quot; onmouseout=&amp;quot;document.getElementById('continguts').style.borderColor='silver';&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codi anterior és massa llarg i massa propens a cometre errors. Dins del codi d'un esdeveniment, Javascript crea automàticament la variable this, que fa referència a l'element XHTML que ha provocat l'esdeveniment. Així, l'exemple anterior es pot reescriure de la següent manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;this.style.borderColor='black';&amp;quot; onmouseout=&amp;quot;this.style.borderColor='silver';&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codi anterior és molt més compacte, més fàcil de llegir i d'escriure i segueix funcionant correctament encara que es modifiqui el valor de l'atribut ''id'' de el &amp;lt; div &amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments com a funcions externes ====&lt;br /&gt;
&lt;br /&gt;
La definició dels manegadores d'esdeveniments en els atributs XHTML és el mètode més senzill però menys aconsellable de tractar amb els esdeveniments en Javascript. El principal inconvenient és que es complica a l'excés quan s'afegeixen algunes poques instruccions, per la qual cosa solament és recomanable per als casos més senzills.&lt;br /&gt;
&lt;br /&gt;
Si es realitzen aplicacions complexes, com per exemple la validació d'un formulari, és aconsellable agrupar tot el codi Javascript en una funció externa i cridar a aquesta funció des de l'element XHTML.&lt;br /&gt;
&lt;br /&gt;
Seguint amb l'exemple anterior que mostra un missatge en clicar sobre un botó:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilitzant funcions externes es pot transformar en:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function mostraMissatge() {&lt;br /&gt;
  alert('Gràcies per clicar');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;mostraMissatge()&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquesta tècnica consisteix a extreure totes les instruccions de Javascript i agrupar-les en una funció externa. Una vegada definida la funció, en l'atribut de l'element XHTML s'inclou el nom de la funció, per indicar que és la funció que s'executa quan es produeix l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
La crida a la funció es realitza de la forma habitual, indicant el seu nom seguit dels parèntesis i de forma opcional, incloent tots els arguments i paràmetres que es necessitin.&lt;br /&gt;
&lt;br /&gt;
El principal inconvenient d'aquest mètode és que en les funcions externes no es pot seguir utilitzant la variable '''this''' i per tant, és necessari passar aquesta variable com a paràmetre a la funció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ressalta(element) {&lt;br /&gt;
	switch(element.style.borderColor) {&lt;br /&gt;
		case 'silver':&lt;br /&gt;
		case 'silver silver silver silver':&lt;br /&gt;
		case '#c0c0c0':&lt;br /&gt;
			element.style.borderColor = 'black';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'black':&lt;br /&gt;
		case 'black black black black':&lt;br /&gt;
		case '#000000':&lt;br /&gt;
			element.style.borderColor = 'silver';&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;ressalta(this)&amp;quot; onmouseout=&amp;quot;ressalta(this)&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En l'exemple anterior, la funció externa és cridada amb el paràmetre ''this'', que dins de la funció es denomina element. La complexitat de l'exemple es produeix sobretot per la forma en la qual els diferents navegadors emmagatzemen el valor de la propietat *&lt;br /&gt;
''borderColor''.&lt;br /&gt;
&lt;br /&gt;
Mentre que Firefox emmagatzema (en cas que les quatre vores coincideixin en color) el valor ''black'', Internet Explorer ho emmagatzema com ''black black black black'' i Opera emmagatzema la seva representació hexadecimal ''#000000''.&lt;br /&gt;
&lt;br /&gt;
====Gestor d'esdeveniments semàntics====&lt;br /&gt;
Els mètodes que s'han vist per afegir manejadores d'esdeveniments (com a atributs XHTML i com a funcions externes) tenen un greu inconvenient: &amp;quot;embruten&amp;quot; el codi XHTML de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Com és conegut, una de les bones pràctiques bàsiques en el disseny de pàgines i aplicacions web és la separació dels continguts (XHTML) i el seu aspecte o presentació (CSS). Sempre que sigui possible, també es recomana separar els continguts (XHTML) i el seu comportament o programació (Javascript).&lt;br /&gt;
&lt;br /&gt;
Barrejar el codi Javascript amb els elements XHTML solament contribueix a complicar el codi font de la pàgina, a dificultar la modificació i manteniment de la pàgina i a reduir la semàntica del document final produït.&lt;br /&gt;
&lt;br /&gt;
Afortunadament, existeix un mètode alternatiu per definir els manegadores d'esdeveniments de Javascript. Aquesta tècnica és una evolució del mètode de les funcions externes, ja que es basa a utilitzar les propietats DOM dels elements XHTML per assignar totes les funcions externes que actuen de manejadores d'esdeveniments. Així, el següent exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;clica&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Es pot transformar en:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Funció externa&lt;br /&gt;
function mostraMissatge() {&lt;br /&gt;
alert('Gràcies per clicar');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Assignar la funció externa a l'element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&lt;br /&gt;
// Element XHTML&lt;br /&gt;
&amp;lt;input id=&amp;quot;clica&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tècnica dels manegadores semàntics consisteix en:&lt;br /&gt;
&lt;br /&gt;
*Assignar un identificador únic a l'element XHTML mitjançant l'atribut ''id''.&lt;br /&gt;
*Crear una funció de Javascript encarregada de manejar l'esdeveniment.&lt;br /&gt;
*Assignar la funció externa a l'esdeveniment corresponent en l'element desitjat.&lt;br /&gt;
*L'últim pas és la clau d'aquesta tècnica. En primer lloc, s'obté l'element al que es desitja associar la funció externa:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A continuació, s'utilitza una propietat de l'element amb el mateix nom que l'esdeveniment que es vol manejar. En aquest cas, la propietat és ''onclick'':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'assigna la funció externa mitjançant el seu nom sense parèntesi. El més important (i la causa més comuna d'errors) és indicar solament el nom de la funció, és a dir, prescindir dels parèntesis en assignar la funció:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'afegeixen els parèntesis després del nom de la funció, en realitat s'està executant la funció i guardant el valor retornat per la funció en la propietat onclick d'element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Assignar una funció externa a un esdeveniment d'un element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&lt;br /&gt;
// Executar una funció i guardar el seu resultat en una propietat d'un element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El gran avantatge d'aquest mètode és que el codi XHTML resultant és molt &amp;quot;net&amp;quot;, ja que no es barreja amb el codi Javascript. A més, dins de les funcions externes assignades sí que es pot utilitzar la variable '''this''' per referir-se a l'element que provoca l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
L'únic inconvenient d'aquest mètode és que la pàgina s'ha de carregar completament abans que es puguin utilitzar les funcions DOM que assignen els manegadors als elements XHTML. Una de les formes més senzilles d'assegurar que cert codi es va a executar després que la pàgina es carregui per complet és utilitzar l'esdeveniment '''onload''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = muestraMensaje;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gestor d'esdeveniments amb DOM====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El mètode addEventListener ens permet incloure un gestor d'esdeveniment. La sintaxi de addEventListener és la següent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
element_que_escolta.addEventListener('event',funció_a_llançar, booleà);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''element_que_escolta'' - és qualsevol element present en un document al qual es vol associar l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
''esdeveniment'' - és el succés ocorregut sobre l'element (clic, load, ...).&lt;br /&gt;
&lt;br /&gt;
''funció_a_llançar'' - és qualsevol funció definida que vulguem que s'executi quan passi l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
''booleà'' - és un valor que defineix l'ordre del flux d'esdeveniments.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si es vol escoltar un esdeveniment només una vegada i després eliminar-ho s'ha d'utilitzar el mètode removeEventListener:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
element_que_escolta.removeEventListener ('esdeveniment',funció_a_llançar, booleà);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTA 1:'' Explicació del paràmetre booleà del mètode addEventListener amb un exemple.&lt;br /&gt;
Suposem que tenim això:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Exemple de fluix events&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;Clica aqui&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quan fem clic al div no només ho estem fent sobre ell, sinó sobre els elements que el contenen en l'arbre del DOM, és a dir, hem fet clic a més sobre l'element html i sobre l'element body. Sí només hi ha una funció assignada a una escolta per al div no hi ha major problema, però si a més hi ha una per al html i una altra per al body, quin és l'ordre en què s'han de llançar les tres funcions?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per contestar a aquesta pregunta hi ha un model de comportament, el flux d'esdeveniments (anglès). Segons aquest, quan es fa clic sobre un element, l'esdeveniment es propaga en dues fases, una que és la captura -el esdeveniment comença en el nivell superior del document i recorre els elements de pares a fills- i l'altra la bombolla -el ordre invers, ascendint de fills a pares-.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un cop vist això, podem comprendre el tercer paràmetre de addEventListener, que el que fa és permetre'ns escollir l'ordre de propagació:&lt;br /&gt;
&lt;br /&gt;
'''true''': El flux d'esdeveniments és com el representat, i la fase de captura passa en llançar l'esdeveniment. L'ordre de propagació per l'exemple seria, per tant, l'indicat, ''html-body-div.''&lt;br /&gt;
&lt;br /&gt;
'''false''': Permet saltar la fase de captura, i la propagació seguiria només la bombolla. Així, l'ordre seria ''div-body-html.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTA 2:'' A internet explorer no funciona en les versions anteriors a la 7 (inclosa).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        function alerta(){&lt;br /&gt;
            alert(this);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        window.onload = function (){&lt;br /&gt;
            var elBody = document.getElementsByTagName('body')[0];&lt;br /&gt;
            var elDiv = document.getElementById('elDiv');&lt;br /&gt;
            var elButton = document.getElementById('elButton');&lt;br /&gt;
         &lt;br /&gt;
            elBody.addEventListener('click',alerta,false);&lt;br /&gt;
            elDiv.addEventListener('click',alerta,false);&lt;br /&gt;
            elButton.addEventListener('click',alerta,false);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//event.stopPropagation();   //evita propagarse el evento en forma de burbuja&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body id=&amp;quot;body&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;elDiv&amp;quot;&amp;gt;Clica aqui&lt;br /&gt;
          &amp;lt;button id=&amp;quot;elButton&amp;quot;&amp;gt;boton&amp;lt;/button&amp;gt;&lt;br /&gt;
     &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemple d'utilització manejadores d'esdeveniments amb DOM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function muestraMensaje() {&lt;br /&gt;
  				console.log(&amp;quot;Has pulsado el ratón&amp;quot;);&lt;br /&gt;
  				elDiv.removeEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);  // borra el evento asociado de tipo click a ese elemento.&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			var elDiv = document.getElementById(&amp;quot;div_principal&amp;quot;);&lt;br /&gt;
			elDiv.addEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
En el caso que no queramos que se aplique el evento de tipo de Submit o Hipervínculo &amp;quot;&amp;lt;a&amp;gt;&amp;lt;/a&amp;gt;&amp;quot; al ser botón usaremos &amp;quot;e.preventDefault()&amp;quot; y realizará las acciones que tengamos establecidas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
window.addEventListener(&amp;quot;load&amp;quot;,ejemplo); // window.onload= ejemplo;&lt;br /&gt;
&lt;br /&gt;
	function ejemplo(){&lt;br /&gt;
			function muestraMensaje(e) {&lt;br /&gt;
  				console.log(&amp;quot;Has pulsado el ratón&amp;quot;);&lt;br /&gt;
                                e.preventDefault();  //evita que se ejecute el submit y recargue la página&lt;br /&gt;
			}&lt;br /&gt;
         document.getElementById(&amp;quot;boton&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);&lt;br /&gt;
	}      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;./index.html&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;input type=&amp;quot;submit&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;boton&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En el següent exemple, s'afegeixen esdeveniments als elements de tipus ''input=text'' d'un formulari complex:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form id=&amp;quot;formulario&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;holaa&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    function resalta() {&lt;br /&gt;
        console.log(&amp;quot;holaa&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    window.onload = function() {&lt;br /&gt;
        var formulario = document.getElementById(&amp;quot;formulario&amp;quot;);&lt;br /&gt;
        var camposInput = formulario.getElementsByTagName(&amp;quot;input&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        for(var i=0; i&amp;lt;camposInput.length; i++) {&lt;br /&gt;
            if(camposInput[i].type == &amp;quot;text&amp;quot;) {&lt;br /&gt;
                camposInput[i].onclick = resalta;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Alert ===&lt;br /&gt;
Volem provar els events de la pàgina, per fer-ho posa un alert amb un missatge en els següents casos:&lt;br /&gt;
* Al carregar-se completament la pàgina.&lt;br /&gt;
* Al clicar en un botó&lt;br /&gt;
* Al passar damunt d'un paràgraf&lt;br /&gt;
* Al passar damunt d'una imatge&lt;br /&gt;
* Al sortir del damunt d'una imatge&lt;br /&gt;
* Al clicar en un enllaç&lt;br /&gt;
&lt;br /&gt;
:[[Exercici1 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Desplegable ===&lt;br /&gt;
Es vol disposar de un menu desplegable on cada element del desplegable sigui el nom de la pàgina a la cual fa referència. Quan es seleccioni una entrada del desplegable, el navegador canvia la seva url per la del desplegable.&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 2 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Rollover ===&lt;br /&gt;
Un intercanvi d'imatge és una cosa grandiosa. L'usuari aproxima el punter del ratolí a una imatge i aquesta canvia a una altre imatge. Quan l'usuari abandona la imatge, torna a canviar a la imatge anterior. &lt;br /&gt;
Fes un programa amb javascript que reprodueixi el comportament anterior.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 3 Events]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Mostrar / Ocultar text ===&lt;br /&gt;
Donada la següent pàgina&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	function muestraOculta() {&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_1&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_1&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_2&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_2&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_3&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_3&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Realitza els següents apartats:&lt;br /&gt;
*Quan es cliqui sobre el primer enllaç, s'oculti la seva secció relacionada&lt;br /&gt;
*Quan es torni a clicar sobre el mateix enllaç, es mostri una altra vegada aquesta secció de continguts&lt;br /&gt;
*Completar la resta d'enllaços de la pàgina perquè el seu comportament sigui idèntic al del primer enllaç&lt;br /&gt;
*Quan una secció s'oculti, ha de canviar el missatge de l'enllaç associat (pista: propietat innerHTML)&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 4 Events]]&lt;br /&gt;
&lt;br /&gt;
== Obtenint informació de l'esdeveniment (objecte event)==&lt;br /&gt;
Normalment, els manegadors d'esdeveniments requereixen informació addicional per processar les seves tasques. Si una funció per exemple s'encarrega de processar l'esdeveniment onclick, potser necessiti saber que posició estava el ratolí en el moment de punxar el botó.&lt;br /&gt;
&lt;br /&gt;
No obstant això, el cas més habitual en el qual és necessari conèixer informació addicional sobre l'esdeveniment és el dels esdeveniments associats al teclat. Normalment, és molt important conèixer la tecla que s'ha premut, per exemple per diferenciar les tecles normals de les tecles especials (ENTER, tabulador, Alt, Ctrl., etc.).&lt;br /&gt;
&lt;br /&gt;
Javascript permet obtenir informació sobre el ratolí i el teclat mitjançant un objecte especial anomenat ''event''. Desafortunadament, els diferents navegadors presenten diferències molt notables en el tractament de la informació sobre els esdeveniments.&lt;br /&gt;
&lt;br /&gt;
La principal diferència resideix en la forma en la qual s'obté l'objecte event. Internet Explorer considera que aquest objecte forma part de l'objecte window i la resta de navegadors ho consideren com l'únic argument que tenen les funcions manejadoras d'esdeveniments.&lt;br /&gt;
&lt;br /&gt;
Encara que és un comportament que resulta molt estrany al principi, tots els navegadors moderns excepte Internet Explorer creen màgicament i de forma automàtica un argument que es passa a la funció manegadora, per la qual cosa no és necessari incloure-ho en la trucada a la funció manegadora. D'aquesta forma, per utilitzar aquest &amp;quot;argument màgic&amp;quot;, només és necessari assignar-li un nom, ja que els navegadors ho creen automàticament.&lt;br /&gt;
&lt;br /&gt;
En resum, en els navegadors tipus Internet Explorer, l'objecte event s'obté directament mitjançant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var esdeveniment = window.event;&lt;br /&gt;
D'altra banda, en la resta de navegadors, l'objecte event s'obté màgicament a partir de l'argument que el navegador crea automàticament:&lt;br /&gt;
&lt;br /&gt;
function manejadorEventos(elEvento) {&lt;br /&gt;
var esdeveniment = elEvento;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si es vol programar una aplicació que funcioni correctament en tots els navegadors, és necessari obtenir l'objecte event de forma correcta segons cada navegador. El següent codi mostra la forma correcta d'obtenir l'objecte event en qualsevol navegador:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function manejadorEventos(elEvento) {&lt;br /&gt;
var esdeveniment = elEvento || window.event;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una vegada obtingut l'objecte event, ja es pot accedir a tota la informació relacionada amb l'esdeveniment, que depèn del tipus d'esdeveniment produït.&lt;br /&gt;
&lt;br /&gt;
=== Informació sobre l'esdeveniment ===&lt;br /&gt;
La propietat '''type''' indica el tipus d'esdeveniment produït, la qual cosa és útil quan una mateixa funció s'utilitza per manejar diversos esdeveniments:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var tipus = esdeveniment.type;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La propietat type retorna el tipus d'esdeveniment produït, que és igual al nom de l'esdeveniment però sense el prefix '''on'''.&lt;br /&gt;
&lt;br /&gt;
Mitjançant aquesta propietat, es pot refer de forma més senzilla l'exemple anterior en el qual es ressaltava una secció de continguts en passar el ratolí per damunt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ressalta(elEvento) {&lt;br /&gt;
    var esdeveniment = elEvento || window.event;&lt;br /&gt;
    switch(esdeveniment.type) {&lt;br /&gt;
         case 'mouseover':&lt;br /&gt;
               this.style.borderColor = 'black';&lt;br /&gt;
               break;&lt;br /&gt;
         case 'mouseout':&lt;br /&gt;
               this.style.borderColor = 'silver';&lt;br /&gt;
               break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
       document.getElementById(&amp;quot;seccion&amp;quot;).onmouseover = ressalta;&lt;br /&gt;
       document.getElementById(&amp;quot;seccion&amp;quot;).onmouseout = ressalta;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;div id=&amp;quot;seccion&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot;&amp;gt;&lt;br /&gt;
  Secció de continguts...&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Informació sobre els esdeveniments de teclat ===&lt;br /&gt;
De tots els esdeveniments disponibles en Javascript, els esdeveniments relacionats amb el teclat són els més incompatibles entre diferents navegadors i per tant, els més difícils de manegar. En primer lloc, existeixen moltes diferències entre els navegadors, els teclats i els sistemes operatius dels usuaris, principalment a causa de les diferències entre idiomes.&lt;br /&gt;
&lt;br /&gt;
A més, existeixen tres esdeveniments diferents per a les pulsacions de les tecles ('''onkeyup''', '''onkeypress''' i '''onkeydown'''). Finalment, existeixen dos tipus de tecles: les tecles normals (com a lletres, nombres i símbols normals) i les tecles especials (com ENTER, Alt, Shift, etc.)&lt;br /&gt;
&lt;br /&gt;
Quan un usuari prem una tecla normal, es produeixen tres esdeveniments seguits i en aquest ordre: &lt;br /&gt;
*'''onkeydown''', &lt;br /&gt;
*'''onkeypress''' i &lt;br /&gt;
*'''onkeyup'''. &lt;br /&gt;
L'esdeveniment '''onkeydown''' es correspon amb el fet de prémer una tecla i no deixar-la anar; l'esdeveniment '''onkeypress''' és la pròpia pulsació de la tecla i l'esdeveniment '''onkeyup''' fa referència al fet de deixar anar una tecla que estava premuda.&lt;br /&gt;
&lt;br /&gt;
La forma més senzilla d'obtenir la informació sobre la tecla que s'ha premut és mitjançant l'esdeveniment '''onkeypress'''. La informació que proporcionen els esdeveniments '''onkeydown''' i '''onkeyup''' es pot considerar com més tècnica, ja que retornen el ''codi intern'' de cada tecla i no el caràcter que s'ha premut.&lt;br /&gt;
&lt;br /&gt;
A continuació s'inclou una llista amb totes les propietats diferents de tots els esdeveniments de teclat tant en Internet Explorer com en la resta de navegadors:&lt;br /&gt;
&lt;br /&gt;
*Esdeveniment keydown:&lt;br /&gt;
**Mateix comportament en tots els navegadors:&lt;br /&gt;
***Propietat keyCode: codi intern de la tecla&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
*Esdeveniment keypress:&lt;br /&gt;
**Internet Explorer:&lt;br /&gt;
***Propietat keyCode: el codi del caràcter de la tecla que s'ha premut&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
**Resta de navegadors:&lt;br /&gt;
**Propietat keyCode: per a les tecles normals, no definit. Per a les tecles especials, el codi intern de la tecla.&lt;br /&gt;
**Propietat charCode: per a les tecles normals, el codi del caràcter de la tecla que s'ha premut. Per a les tecles especials, 0.&lt;br /&gt;
*Esdeveniment keyup:&lt;br /&gt;
**Mateix comportament en tots els navegadors:&lt;br /&gt;
***Propietat keyCode: codi intern de la tecla&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
Per convertir el codi d'un caràcter (no confondre amb el codi intern) al caràcter que representa la tecla que s'ha premut, s'utilitza la funció ''String.fromCharCode().''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    window.onkeydown = teclado;&lt;br /&gt;
    window.onkeypress = teclado;&lt;br /&gt;
    window.onkeyup = teclado;&lt;br /&gt;
&lt;br /&gt;
    function teclado(magica) {&lt;br /&gt;
        var e = magica || window.event; // para salvar las deficiencias de IE=window.event&lt;br /&gt;
        mostrar(e.type, e.keyCode, e.which, e.charCode, e.key);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function mostrar(evento, keyCode, which, charCode, key) {&lt;br /&gt;
      &lt;br /&gt;
        let cadena =  &amp;quot;&amp;lt;b&amp;gt; Evento: &amp;lt;/b&amp;gt;&amp;quot; + evento &lt;br /&gt;
                     + &amp;quot; ==&amp;gt; &amp;lt;b&amp;gt; keyCode: &amp;lt;/b&amp;gt;&amp;quot; + keyCode &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; which: &amp;lt;/b&amp;gt;&amp;quot; + which &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; charCode: &amp;lt;/b&amp;gt;&amp;quot;+ charCode &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; key: &amp;lt;/b&amp;gt;&amp;quot;+ key &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; FromCharCode: &amp;lt;/b&amp;gt;&amp;quot;+String.fromCharCode(charCode)+&amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         let info = document.getElementById(&amp;quot;info&amp;quot;); //display&lt;br /&gt;
         info.innerHTML += cadena&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;info&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://sospedia.net/pinchar-el-teclado-en-javascript/&lt;br /&gt;
&lt;br /&gt;
https://www.w3.org/2002/09/tests/keys-cancel2.html&lt;br /&gt;
&lt;br /&gt;
==== Exercici Teclat ====&lt;br /&gt;
Crea un script que mostri per pantalla la següent informació cada vedada que es premi una tecla:&lt;br /&gt;
* Caràcter permut  (amb key i StringCharCode)&lt;br /&gt;
* Tipus event (keydown, keypress, keyup)&lt;br /&gt;
* Propietat keycode&lt;br /&gt;
* Propietat charcode&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 5 events]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== informació sobre els esdeveniments de ratolí ===&lt;br /&gt;
La informació més rellevant sobre els esdeveniments relacionats amb el ratolí és la de les coordenades de la posició del punter del ratolí. Encara que l'origen de les coordenades sempre es troba en la cantonada superior esquerra, el punt que es pren com a referència de les coordenades pot variar.&lt;br /&gt;
&lt;br /&gt;
D'aquesta forma, és possible obtenir la posició del ratolí respecte de la pantalla de l'ordinador, respecte de la finestra del navegador i respecte de la pròpia pàgina HTML (que s'utilitza quan l'usuari ha fet scroll sobre la pàgina). Les coordenades més senzilles són les que es refereixen a la posició del punter respecte de la finestra del navegador, que s'obtenen mitjançant les propietats clientX i clientY:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function muestraInformacion(elEvento) {&lt;br /&gt;
   var esdeveniment = elEvento || window.event;&lt;br /&gt;
   var coordenadaX = esdeveniment.clientX;&lt;br /&gt;
   var coordenadaY = esdeveniment.clientY;&lt;br /&gt;
   alert(&amp;quot;Has premut el ratolí en la posició: &amp;quot; + coordenadaX + &amp;quot;, &amp;quot; + coordenadaY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.onclick = muestraInformacion;&lt;br /&gt;
//document.addeventlistener(click,&amp;quot;muestraInformacion&amp;quot;,false);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les coordenades de la posició del punter del ratolí respecte de la pantalla completa de l'ordinador de l'usuari s'obtenen de la mateixa forma, mitjançant les propietats '''screenX''' i '''screenY''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var coordenadaX = esdeveniment.screenX;&lt;br /&gt;
var coordenadaY = esdeveniment.screenY;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En moltes ocasions, és necessari obtenir un altre parell de coordenades diferents: les que corresponen a la posició del ratolí respecte de l'origen de la pàgina. Aquestes coordenades no sempre coincideixen amb les coordenades respecte de l'origen de la finestra del navegador, ja que l'usuari pot fer scroll sobre la pàgina web. Internet Explorer no proporciona aquestes coordenades de forma directa, mentre que la resta de navegadors sí que ho fan. D'aquesta forma, és necessari detectar si el navegador és de tipus Internet Explorer i en cas afirmatiu realitzar un càlcul senzill:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Detectar si el navegador és Internet Explorer&lt;br /&gt;
var ie = navigator.userAgent.toLowerCase().indexOf('msie')!=-1;&lt;br /&gt;
&lt;br /&gt;
if(ie) {&lt;br /&gt;
     coordenadaX = esdeveniment.clientX + document.body.scrollLeft;&lt;br /&gt;
     coordenadaY = esdeveniment.clientY + document.body.scrollTop;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
     coordenadaX = esdeveniment.pageX;&lt;br /&gt;
     coordenadaY = esdeveniment.pageY;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;Has premut el ratolí en la posició: &amp;quot; + coordenadaX + &amp;quot;, &amp;quot; + coordenadaY + &amp;quot; respecte de la pàgina web&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La variable '''ie''' val '''true''' si el navegador en el qual s'executa el script és de tipus Internet Explorer (qualsevol versió) i val '''false''' en un altre cas. Per a la resta de navegadors, les coordenades respecte de l'origen de la pàgina s'obtenen mitjançant les propietats '''pageX''' i '''pageY'''. En el cas d'Internet Explorer, s'obtenen sumant la posició respecte de la finestra del navegador (clientX, clientY) i el desplaçament que ha sofert la pàgina (document.bodi.scrollLeft, document.bodi.scrollTop).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Client_page_screen.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gràfics senzills amb canvas ===&lt;br /&gt;
Amb els esdeveniments de teclat i ratolí podrem programar jocs senzills. Només ens caldrà saber com situar i moure gràfics per la pantalla. Amb aquesta finalitat ens serà d'ajuda l'ús de l'element '''canvas''' de HTML.&lt;br /&gt;
&lt;br /&gt;
Al següent exemple definim un canvas (llenç) de 800x600 píxels i hi situem la imatge d'un cotxe a la coordenada (400,300). &lt;br /&gt;
&amp;lt;source lang=&amp;quot;HTML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;canvas id=&amp;quot;myCanvas&amp;quot; width=&amp;quot;800&amp;quot; height=&amp;quot;600&amp;quot; style=&amp;quot;background-color: lightskyblue;&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img id=&amp;quot;cotxe&amp;quot; src=&amp;quot;cotxe.jpg&amp;quot; style=&amp;quot;display: none;&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var canvas;&lt;br /&gt;
var ctx;&lt;br /&gt;
var imatge;&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
         canvas= document.getElementById(&amp;quot;myCanvas&amp;quot;);&lt;br /&gt;
         ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
         imatge=document.getElementById(&amp;quot;cotxe&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ctx.drawImage(imatge,400,300);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si volem simular el moviment de la imatge haurem l'haurem d'esborrar de la posició antiga i tornar-la a dibuixar a la nova posició. Per borrar la imatge podem dibuixar un rectangle del color de fons del canvas sobre la imatge amb les instruccions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
ctx.fillStyle = &amp;quot;lightskyblue&amp;quot;&lt;br /&gt;
ctx.fillRect(0,300,100,66);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'exemple dibuixem al canvas un triangle de color lightskyblue a la coordenada (0,300) i de dimensions 100x66.&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Coordenades del punter ===&lt;br /&gt;
Crea una pàgina on es mostri constantment les coordenades del punter dins de la pàgina (propietats clientX, clientY).&lt;br /&gt;
&lt;br /&gt;
=== event MOUSEOVER ===&lt;br /&gt;
Crea una pàgina de contingut lliure que tingui els següents elements:&lt;br /&gt;
*Títol (capçalera H1)&lt;br /&gt;
*Tres paràgrafs que continguin una imatge alineada a la dreta o a l'esquerra del text. La longitud del text de cada paràgraf serà prou extensa per a superar l'alçada de la imatge respectiva.&lt;br /&gt;
*Tres títols (capçalera H2) que precediran cadascun dels paràgrafs.&lt;br /&gt;
Programa les respostes als events MOUSEOVER de cada element de forma que:&lt;br /&gt;
*tots els elements de text (quatre capçaleres i tres paràgrafs) canviin de format quan tenen el punter del ratolí al damunt. Cada element de text tornarà al seu format original quan el punter ja no sigui al damunt&lt;br /&gt;
*les imatges giraran en sentit horari quan tinguin el punter al damunt i deixaran de fer-ho quan el punter ja no sigui al damunt.&lt;br /&gt;
&lt;br /&gt;
=== Ordre dels events ===&lt;br /&gt;
Crea una pàgina amb quatre seccions DIV aniuades i etiquetades amb els noms div1, ... , div4:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;div1&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div2&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div3&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div4&amp;quot;&amp;gt;contingut random...&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Crea funcions de resposta a l'event CLICK per a cada element DIV que escrigui un missatge de l'estil &amp;quot;Has clickat sobre l'element div1&amp;quot;.&lt;br /&gt;
Com aconseguiries que l'ordre en què es disparen els elements siguin els següents?:&lt;br /&gt;
*div1,div2,div3,div4&lt;br /&gt;
*div4,div3,div2,div1&lt;br /&gt;
*div1,div3,div4,div2&lt;br /&gt;
&lt;br /&gt;
=== Estrella Michelin ===&lt;br /&gt;
&lt;br /&gt;
Un restaurant té 4 tapes principals on cadascuna té un preu  1 €, 2 €, 3 € i 4 € (esquerra a dreta). &lt;br /&gt;
&lt;br /&gt;
Com el local és petit, es disposa de dos cambrers, cadascun d'ells té un botó que l'executarà en el cas de servir una tapa. Quan un cambrer serveixi una tapa haurà:&lt;br /&gt;
*1. Primer seleccionar-se amb el botó&lt;br /&gt;
*2. Clicar a la tapa o tapes servides.&lt;br /&gt;
&lt;br /&gt;
Cada vegada que el cambrer faci click a una tapa el seu preu s'incrementarà en la recaudació del cambrer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Michelin.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
:[[solucio michelin]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Fitxer:Gamepad.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
Dibuixa un rectangle i que es mova en funció del joystick, i mostre per pantalla els diferents botons.&lt;br /&gt;
 &lt;br /&gt;
http://html5gamepad.com&lt;br /&gt;
&lt;br /&gt;
:[[ejm_gamepad]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ratolí i Teclat ===&lt;br /&gt;
a) Es vol que el ratolí, en qualsevol punt de la finestra del navegador, es mostri la posició del punter respecte del navegador i respecte de la pàgina.&lt;br /&gt;
[[Fitxer:ex_ratoli.gif|100px]]&lt;br /&gt;
&lt;br /&gt;
b) Es vol que, a més a més, en prémer qualsevol tecla, el missatge mostrat ha de canviar per indicar el nou esdeveniment i la seva informació associada.&lt;br /&gt;
[[Fitxer:ex_teclat.gif|100px]]&lt;br /&gt;
&lt;br /&gt;
c)Afegir la següent característica al script: quan es prem un botó del ratolí, el color de fons del quadre de missatge ha de ser groc (#FFFFCC) i quan es prem una tecla, el color de fons ha de ser blau (#CCE6FF). En tornar a moure el ratolí, el color de fons torna a ser blanc.&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fitxer:ex_tec_rat_color.gif|200px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 6 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Posició ratolí ===&lt;br /&gt;
Crear un script que informi a l'usuari en què zona de la pantalla ha premut el ratolí. Les zones definides són les següents: esquerra a dalt, esquerra a baix, dreta a dalt i dreta a baix.&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 7 Events]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Cuadrat===&lt;br /&gt;
&lt;br /&gt;
Es desitja que un cuadrat es mova al llarg de la pantalla&lt;br /&gt;
&lt;br /&gt;
:[[sol_cuadrat]]&lt;br /&gt;
&lt;br /&gt;
=== Joc Tenis ===&lt;br /&gt;
Es tracta de implementar en Javascript un dels 1ers jocs que es va inventar per a PC. El joc del Tenis. &lt;br /&gt;
[[Fitxer:tenis.png|400px|center]]&lt;br /&gt;
Per començar el joc s'ha de pulsar la tecla 'S', per parar 'P' i per reinicializar la 'R'.&lt;br /&gt;
&lt;br /&gt;
Jugador 1:&lt;br /&gt;
*Utilitza el ratolí per el desplaçament de la raqueta&lt;br /&gt;
Jugador 2:&lt;br /&gt;
*tecla '↑' per desplaçar la raqueta cap a dalt&lt;br /&gt;
*tecla '↓' per desplaçar la raqueta cap a baix&lt;br /&gt;
Altres aspectes del joc&lt;br /&gt;
*A més a més, hi ha un marcador que indiqui qui va guanyant.&lt;br /&gt;
*També hi ha un botó, per exemple F2, per augmentar el número de pilotes&lt;br /&gt;
*També hi ha un botó per canviar els colors del joc. Pot existir diversos temes (F5-F8)&lt;br /&gt;
&lt;br /&gt;
https://www.w3schools.com/html/html5_draganddrop.asp&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Expressions Regulars =&lt;br /&gt;
Les expressions regulars son una necessitat a l'hora de validar formularis. Alguns problemes de validació no es podrien solucionar de una manera elegant sense elles.&lt;br /&gt;
Les expressions regulars son senzillament una manera d'expresar un patró per a cadenes coincidents de text. La expressions contenen termes i operadors que ens pemeten definir els patrons.&lt;br /&gt;
&lt;br /&gt;
== Creació d'expresions regulars ==&lt;br /&gt;
A Javascript, com succeeix amb la majoria d'objectes, existeixen dos formes de crear expresions regulars: &lt;br /&gt;
*mitjançant un literal&lt;br /&gt;
*creant una instància d'un objecte de tipus '''RegExp'''&lt;br /&gt;
&lt;br /&gt;
La creació d'una expressió regular amb un literal és molt sezill. Veïem un exemple. Volem crear una expressió regular que coincideixi exactament amb el string &amp;quot;test&amp;quot;:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = /test/;&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
Les expresions regulars van envoltades del caràctes /. Igual que els String van envoltades del caràcter &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
També podíem haver creat una instància del objecte RegExp de la següent manera:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = new RegExp(&amp;quot;test&amp;quot;);&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificadors ha utilitzar a l'hora de crear expressions regulars ==&lt;br /&gt;
A més a més de la propia expressió regular, podem introduïr els següents modificadors:&lt;br /&gt;
*''i'': Fa que no distingeixi de majúscules i minúscules. ex: /test/i&lt;br /&gt;
*''g'': Realitza una comparació global, en comptes de parar-se després de la primera coincidència.&lt;br /&gt;
*''m'': Realitza una comparació multilínia (més detalls a https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/multiline )&lt;br /&gt;
Exemple d'ús:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = /test/ig&lt;br /&gt;
var pattern2 = new RegExp(&amp;quot;test&amp;quot;,&amp;quot;ig&amp;quot;);&lt;br /&gt;
//exemple d'us de la expressió regular&lt;br /&gt;
alert(pattern.test(&amp;quot;test&amp;quot;));&lt;br /&gt;
alert(pattern2.test(&amp;quot;test&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termes i Operadors ==&lt;br /&gt;
&lt;br /&gt;
*''Coincidència exacta'': Tot lo que no sigui un caràcter especial o un operador haurà d'apareixer de forma literal en la expressió. Ex: /test/ la paraula '''test'' ha d'aparèixer exactament.&lt;br /&gt;
*''Combinacions de caràcters'': Moltes vegades no volem combinar un caràcter literal específic, sino un grup finit de caràcters. Podem especificar-ho col·locant el grup de caràcters que volem combinar entre claudàtors. Ex: [abc]&lt;br /&gt;
*''Combinacions de caràcters excloents'': Altres vegades volem combinar tots els caràcters trets d'uns quants. Per fer-ho podem utilitzar el símbol ''^'' seguit dels caràcters que no volem en la expresió. Ex: [^abc]. &lt;br /&gt;
*''Rang de valors'': També tenim la habilitat d'especificar un rang de valors. Ex: volem qualsevol caràcter entre '''a''' i '''m''' minmúscula --&amp;gt; [a-m] (ambdós incloses).&lt;br /&gt;
&lt;br /&gt;
=== Caràcters especials ===&lt;br /&gt;
Existeixen caràcters especials en les expresions regulars, de fet, ja hem vist uns quants: '''[''', ''']''', '''-''' i '''^'''.&lt;br /&gt;
Però encara hi ha uns quants més com serien el '''$''', '''{''', '''}''', '''?''', ''',''', '''+''' i el '''.'''&lt;br /&gt;
Com podem fer per utilitzar-los de forma literal en comptes d'utilitzar-los com a operadors de les expressions regulars? Escapant-los.&lt;br /&gt;
Però com? Utilitzant un caràcter especial: ''\''. Ex: La expressió regular '''/\[/''' significa el caràcter '''[''' i no l'inici d'un grup de caràcters.  &lt;br /&gt;
Així mateix, per poder utilitzar el caràcter '''\''' dintre de la expressió regular l'haurem d'escapar. Ex: '''\\''' correspon al literal '''\'''.&lt;br /&gt;
&lt;br /&gt;
=== Principis i finals ===&lt;br /&gt;
A vegades volem que un patró coincideixi amb el principi d'una cadena o amb el final. &lt;br /&gt;
*Principi: Utilitzarem el caràcter ''^''. Ex: /^test/ : només coincideix si la cadena '''test''' coincideix amb el principi.&lt;br /&gt;
*Final: Utilitzarem el caràcter ''$''. Ex: /test$/ : només coincideix si la cadena '''test''' coincideix amb el final.&lt;br /&gt;
*Principi i final: Ex: /^test$/ : Indica que el patró especificat ha d'incluir tota la cadena candidata.&lt;br /&gt;
&lt;br /&gt;
=== Repetició de caràcters ===&lt;br /&gt;
&lt;br /&gt;
Si volem combinar una serie de quatre caràcters 'a' podem expressar-ho amb ''/aaa/'' però que succeeix si volem utilitzar un número qualsevol de repeticions del mateix caràcter?&lt;br /&gt;
Tenim diferents opcions:&lt;br /&gt;
*Podem especificar que un caràcter és opcional, es a dir, &amp;lt;b&amp;gt;pot aparèixer alguna vegada o cap (0 ó 1)&amp;lt;/b&amp;gt;, Es fa afegint el caràcter '''''?''''' al final. Exemple: /t?est/. Aquest patró combina dues opcions: '''test i est'''.&lt;br /&gt;
*Si volem que un caràcter '''apareixi moltes vegades (1 o més)''' utilitzarem '''''+'''''. Ex: /t+est/. Aquest patró combina '''test''', '''ttest''' i '''tttest''' però no '''est'''.&lt;br /&gt;
*Si volem que un '''caràcter apareixi zero o més vegades (0 o més)''' utilitzem el caràcter '''*'''. Ex: /t*est/. Aquest patró combina '''test''', '''ttest''', '''tttest''' i també '''est'''.&lt;br /&gt;
*Podem especificar una quantitat concreta amb el número de repeticions permeses entre claudàtors '''''{}'''''Text en negreta. Per exemple, /a{4}/ indica una coincidència de quatre caràcters 'a' consecutius.&lt;br /&gt;
*També podem especificar un intérval per al compte de repeticions. Per exemple, /a{4,10}/ indica una combinació de 4 a 10 caracters 'a' consecutius.&lt;br /&gt;
*Si en aquest interval no s'indica el segon valor de l'intèrval indiquem que el número final és infinit. Ex: /a{4,}/. Aquest patró combina qualsevol cadena de cuatre o més caràcters 'a' consecutius. Fixat que és important posar la '''coma''' després del 4.&lt;br /&gt;
&lt;br /&gt;
=== Caràcters predefinits ===&lt;br /&gt;
La sintaxis de les expressions regulars ens proporcionen un nombre de termes predefinits que representen caràcters o clases de caràcters que s'utilitzen amb freqüència. &lt;br /&gt;
Taula:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Terme Predefinit&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Equivalència&lt;br /&gt;
|-&lt;br /&gt;
| \t ||Tabulació horitzontal&lt;br /&gt;
|-&lt;br /&gt;
| \b ||Retrocés&lt;br /&gt;
|-&lt;br /&gt;
| \v ||Tabulació Vertical&lt;br /&gt;
|-&lt;br /&gt;
| \f||Salt de página&lt;br /&gt;
|-&lt;br /&gt;
| \r||Retorn de carro.&lt;br /&gt;
|-&lt;br /&gt;
| \n||Nova linia&lt;br /&gt;
|-&lt;br /&gt;
| \cA : \cZ||Caràcters de control&lt;br /&gt;
|-&lt;br /&gt;
| \x0000 : \xFFFF||Unicode Hexadecimal&lt;br /&gt;
|-&lt;br /&gt;
|  \x00 : \xFF||ASCII Hexadecimal&lt;br /&gt;
|-&lt;br /&gt;
| .||Qualsevol caràcter, excepte nova linia&lt;br /&gt;
|-&lt;br /&gt;
|  \d||Qualsevol dígit decimal. Equivalent a [0-9]&lt;br /&gt;
|-&lt;br /&gt;
| \D||Qualsevol caràcter menys un dígit decimal. Equivalent a [^0-9]&lt;br /&gt;
|-&lt;br /&gt;
| \w||Qualsevol caràcter alfanuméric incloent el subratllat. [A-Za-z0-9_]&lt;br /&gt;
|-&lt;br /&gt;
| \W||Qualsevol caràcter menys els alfanumèric i el subratllat. [^A-Za-z0-9_]&lt;br /&gt;
|-&lt;br /&gt;
| \s||Qualsevol espai en blanc (espai, tabulador, salt de pàgina,etc.)&lt;br /&gt;
|-&lt;br /&gt;
| \S||Qualsevol caràcter menys un espai en blanc.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Per veure el llistat complert fes click [http://www.visibone.com/regular-expressions/ aquí].&lt;br /&gt;
&lt;br /&gt;
=== Agrupació de caràcters ===&lt;br /&gt;
De moment, hem observat que els operadors + i * només afecten al terme que els '''precedeix'''. Si volem aplicar-los a un grup de termes, podem utilitzar ''parèntesis'', igual que si es tractés d'una formula matemàtica. Per exemple: /(ab)+/. Aquest patró combina una o més aparicions de la cadena '''ab'''.&lt;br /&gt;
&lt;br /&gt;
=== Alternància de caràcters ===&lt;br /&gt;
La alternància pot expressar-se utilitzant el caràcter '''|'''. Per exemple: /a|b/ combina el caràcter '''a''' o '''b''', i /(ab)+|(cd)+/ combina només una o més repeticions de '''ab''' o '''cd'''.&lt;br /&gt;
&lt;br /&gt;
== Mètodes de les Expressions Regulars ==&lt;br /&gt;
*''pattern.test(cadena)'' : Executa la expressió regular e indica si la cadena passada per paràmetre coincideix o no. (retorna True o False)&lt;br /&gt;
*''pattern.exec(cadena)'' : Executa la expressió regular i retorna la primera coincidència.&lt;br /&gt;
== Resum Expressions Regulars ==&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Expresiones.jpg]]&lt;br /&gt;
[http://rua.ua.es/dspace/bitstream/10045/13363/6/07c-JavaScriptExpReg.pdf Resum Expressions Regulars]&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.regexr.com/ Comprovar expressions regulars]&lt;br /&gt;
&lt;br /&gt;
[https://regex101.com/ Comprovar expressions regulars II]&lt;br /&gt;
&lt;br /&gt;
Crea un patró per a cadascuna de les diferents cadenes que es mostren a continuació:&lt;br /&gt;
&lt;br /&gt;
*Codi postal. Ex: 46700&lt;br /&gt;
*Numero de telèfon amb prefix i guións, el primer nombre pot ser un 8 ó 9. Ex: 93-123-11-33&lt;br /&gt;
*Numero de telèfon amb prefix i punts. Ex: 93-1.231.1339&lt;br /&gt;
*Numero de telèfon internacional. Ex: (+34)952356817 &lt;br /&gt;
*Nom d'usuari amb un mínim de 4 i un màxim de 15. Ex: julio_30&lt;br /&gt;
*Nombre Real. Ex:  -122.33 ó 7,3 ó 8 &lt;br /&gt;
*Numero ISBN de 13 dígits: 978-3-16-148410-0&lt;br /&gt;
*Numero de la seguretat social: 01-123456789&lt;br /&gt;
*Adreça Postal amb les següent condicions: Carrer (C\), Plaza(Pz.), Avinguda(Av.). Direcció. Numero - Porta.&lt;br /&gt;
Ex: C\ Mare de Deu de montserrat. 233 - 2&lt;br /&gt;
*Numero IP d'un ordinador de la versió 4.&lt;br /&gt;
*Numero Mac d'un ordinador separats per ':'&lt;br /&gt;
*URL (amb http, https, www, etc)&lt;br /&gt;
*Data: Ex: DD/MM/AAAA&lt;br /&gt;
*Hora: 23:55:55&lt;br /&gt;
*Email&lt;br /&gt;
*Comprobar un nombre propio&lt;br /&gt;
*Targeta de crèdit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Codi postal. Ex: 46700&lt;br /&gt;
**sol: ^\d{5}$ &lt;br /&gt;
*Numero de telèfon amb prefix i guións, el primer nombre pot ser un 8 ó 9. Ex: 93-123-11-33&lt;br /&gt;
**sol: ^[89](\d-\d{3})-\d{2}-\d{2}$&lt;br /&gt;
*Numero de telèfon amb prefix i punts. Ex: 93-1.231.1339&lt;br /&gt;
**sol: ^[89](\d-\d.)\d{3}\.\d{3}$&lt;br /&gt;
*Numero de telèfon internacional. Ex: (+34)952356817 &lt;br /&gt;
**sol: ^\(\+\d{2,3}\)\d{9}$&lt;br /&gt;
*Nom d'usuari amb un mínim de 4 i un màxim de 15. Ex: julio_30&lt;br /&gt;
**sol: ^[a-z\d_]{4,15}$&lt;br /&gt;
*Nombre Real. Ex:  -122.33 ó 7,3 ó 8 &lt;br /&gt;
**sol: ^[+-]?\d+([,.]\d+)?$    &lt;br /&gt;
*Numero ISBN de 13 dígits: 978-3-16-148410-0&lt;br /&gt;
*Numero de la seguretat social: 01-123456789&lt;br /&gt;
**sol: ^\d{2}-\d{9}$&lt;br /&gt;
**sol: ^[0-1]{2}-\d{9}$&lt;br /&gt;
*Adreça Postal amb les següent condicions: Carrer (C\), Plaza(Pz.), Avinguda(Av.). Direcció. Numero - Porta.&lt;br /&gt;
Ex: C\ Mare de Deu de montserrat. 233 - 2&lt;br /&gt;
**sol: ^((C\\)|(Pz\.)|(Av\.))\s.+\.\s\d{1,5}\s-\s\d$&lt;br /&gt;
((C\\)|(Pz\.)|(Av\.))[a-zA-Z ]+\.[0-9 ]+\-[0-9 ]+&lt;br /&gt;
*Numero IP d'un ordinador de la versió 4.&lt;br /&gt;
** sol: ^((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]?)\.)((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]|[0-9])\.){2}((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]|[0-9]))$&lt;br /&gt;
 ^(?:\d{1,3}\.){3}\d{1,3}$&lt;br /&gt;
*Numero Mac d'un ordinador separats per ':'&lt;br /&gt;
*URL (amb http, https, www, etc)&lt;br /&gt;
**sol:(www\.|http:\/\/|https:\/\/)\S*\.(com|es|org))&lt;br /&gt;
*Data: Ex: DD/MM/AAAA&lt;br /&gt;
**sol: ^\d{1,2}\/\d{1,2}\/\d{2,4}$ &lt;br /&gt;
         ^([3][0-1]|[0-2][0-9])\/[0-1]?[0-2]\/[1-2]\d{3}$  coge hasta el día 31 y el mes 12 &lt;br /&gt;
*Hora: 23:55:55&lt;br /&gt;
**sol: ^(0[1-9]|1\d|2[0-3]):([0-5]\d):([0-5]\d)$ &lt;br /&gt;
*Email&lt;br /&gt;
**sol: /^[\w]+@{1}[\w]+\.[a-z]{2,3}$/&lt;br /&gt;
**sol: ^[\\w-]+(\\.[\\w-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$ &lt;br /&gt;
*Comprobar un nombre propio&lt;br /&gt;
**sol: /^([A-Z]{1}[a-zñáéíóú]+[\s]*)+$/ &lt;br /&gt;
*Targeta de crèdit&lt;br /&gt;
**sol:  ^((67\d{2})|(4\d{3})|(5[1-5]\d{2})|(6011))(-?\s?\d{4}){3}|(3[4,7])\ d{2}-?\s?\d{6}-?\s?\d{5}$&lt;br /&gt;
&lt;br /&gt;
= Formularis =&lt;br /&gt;
JavaScript disposa de nombroses propietats i funcions que faciliten la programació d'aplicacions que manegen formularis. En primer lloc, quan es carrega una pàgina web, el navegador crea automàticament una matriu anomenat forms i que conté la referència a tots els formularis de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Per accedir al array forms , s'utilitza l'objecte document , de manera que document.forms és la matriu que conté tots els formularis de la pàgina. Com es tracta d'un array, l'accés a cada formulari es realitza amb la mateixa sintaxi dels arrays. La següent instrucció accedeix al primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més de l'array de formularis, el navegador crea automàticament una matriu anomenat ''elements'' per cadascun dels formularis de la pàgina. Cada array elements conté la referència a tots els elements (quadres de text, botons, llistes desplegables, etc.) d'aquest formulari. Utilitzant la sintaxi dels arrays, la següent instrucció obté el primer element del primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]. elements [0]; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La sintaxi dels arrays no sempre és tan concisa. El següent exemple mostra com obtenir directament l'últim element del primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]. elements [document. forms [0]. elements. length - 1];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Encara que aquesta forma d'accedir als formularis és ràpida i senzilla, té un inconvenient molt greu. Què passa si canvia el disseny de la pàgina i en el codi HTML es canvia l'ordre dels formularis originals o s'afegeixen nous formularis? El problema és que &amp;quot;el primer formulari de la pàgina&amp;quot; ara podria ser un altre formulari diferent al que espera l'aplicació.&lt;br /&gt;
&lt;br /&gt;
En un entorn tan canviant com el disseny web, és molt difícil confiar que l'ordre dels formularis es mantingui estable en una pàgina web. Per aquest motiu, sempre s'hauria d'evitar l'accés als formularis d'una pàgina mitjançant l'array ''document.forms''.&lt;br /&gt;
&lt;br /&gt;
Una forma d'evitar els problemes del mètode anterior consisteix a accedir als formularis d'una pàgina a través del seu nom (atribut '''name''') o a través del seu atribut '''id''' . L'objecte document permet accedir directament a qualsevol formulari mitjançant la seva atribut '''name''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var formularioPrincipal = document. formulari;&lt;br /&gt;
 var formularioSecundario = document. otro_formulario;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/ Form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;otro_formulario&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Accedint d'aquesta forma als formularis de la pàgina, l'script funciona correctament encara que es reordenin els formularis o s'afegeixin nous formularis a la pàgina. Els elements dels formularis també es poden accedir directament mitjançant el seu atribut '''name''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  var formularioPrincipal = document. formulari;&lt;br /&gt;
 var primerElemento = document. formulari. element;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;Input type = &amp;quot;text&amp;quot; name = &amp;quot;element&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Òbviament, també es pot accedir als formularis i als seus elements utilitzant les funcions DOM d'accés directe als nodes. El següent exemple utilitza l'habitual funció '''document.getElementById()''' per accedir de forma directa a un formulari i un dels seus elements:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var formularioPrincipal = document. getElementById (&amp;quot;formulari&amp;quot;);&lt;br /&gt;
 var primerElemento = document. getElementById (&amp;quot;element&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot; id = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;Input type = &amp;quot;text&amp;quot; name = &amp;quot;element&amp;quot; id = &amp;quot;element&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Independentment del mètode utilitzat per obtenir la referència a un element de formulari, cada element disposa de les següents propietats útils per al desenvolupament de les aplicacions:&lt;br /&gt;
*''type'' : indica el tipus d'element que es tracta. Per als elements de tipus &amp;lt;input&amp;gt; ( text , button , checkbox , etc.) coincideix amb el valor del seu atribut '''type''' . Per a les llistes desplegables normals (element &amp;lt;select&amp;gt; ) el seu valor és '''select-one''' , el que permet diferenciar-les de les llistes que permeten seleccionar diversos elements alhora i el tipus és '''select-multiple'''. Finalment, en els elements de tipus &amp;lt;textarea&amp;gt; , el valor de type és '''textarea''' .&lt;br /&gt;
*''form'' : és una referència directa al formulari al qual pertany l'element. Així, per accedir al formulari d'un element, es pot utilitzar document.getElementById(&amp;quot;id_del_elemento&amp;quot;).form&lt;br /&gt;
*''name'' : obté el valor de l'atribut name de XHTML. Només es pot llegir el seu valor, per la qual cosa no es pot modificar.&lt;br /&gt;
*''value'' : permet llegir i modificar el valor de l'atribut value de XHTML. Per als camps de text ( &amp;lt;input type=&amp;quot;text&amp;quot;&amp;gt; i &amp;lt;textarea&amp;gt; ) obté el text que ha escrit l'usuari. Per als botons obté el text que es mostra al botó. Per als elements checkbox i radiobutton no és molt útil, com es veurà més endavant&lt;br /&gt;
&lt;br /&gt;
== Validació ==&lt;br /&gt;
&lt;br /&gt;
La principal utilitat de JavaScript en el maneig dels formularis és la validació de les dades introduïdes pels usuaris. Abans d'enviar un formulari al servidor, es recomana validar mitjançant JavaScript les dades inserides per l'usuari. D'aquesta manera, si l'usuari ha comès algun error en omplir el formulari, se li pot notificar de forma instantània, sense necessitat d'esperar la resposta del servidor.&lt;br /&gt;
&lt;br /&gt;
Notificar els errors de forma immediata mitjançant JavaScript millora la satisfacció de l'usuari amb l'aplicació (el que tècnicament es coneix com &amp;quot;millorar l'experiència d'usuari&amp;quot;) i ajuda a reduir la càrrega de processament al servidor.&lt;br /&gt;
&lt;br /&gt;
Normalment, la validació d'un formulari consisteix en cridar a una funció de validació quan l'usuari prem sobre el botó d'enviament del formulari. En aquesta funció, es comproven si els valors que ha introduït l'usuari compleixen les restriccions imposades per l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Encara que hi ha tantes possibles comprovacions com a elements de formulari diferents, algunes comprovacions són molt habituals: que ompli un camp obligatori, que se seleccioni el valor d'una llista desplegable, que l'adreça d'email indicada sigui correcta, que la data introduïda sigui lògica, que s'hagi introduït un nombre on així es requereix, etc.&lt;br /&gt;
&lt;br /&gt;
A continuació es mostra el codi JavaScript bàsic necessari per incorporar la validació a un formulari:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form name=&amp;quot;formulario&amp;quot;  onSubmit=&amp;quot;return ValidaCampos()&amp;quot;&amp;gt;&lt;br /&gt;
 Teléfono: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;telefono&amp;quot; size=&amp;quot;15&amp;quot; maxlength=&amp;quot;15&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
           &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enviar&amp;quot; name=&amp;quot;enviar&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
I l'esquema de la funció validacio() és el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ValidaCampos() {&lt;br /&gt;
   var expresion_regular_telefono = /^[89](\d-\d.)\d{3}\.\d{3}$/;  &lt;br /&gt;
// 9 cifras numéricas.&lt;br /&gt;
// Usaremos el método &amp;quot;test&amp;quot; de las expresiones regulares:&lt;br /&gt;
      if (expresion_regular_telefono.test(formulario.telefono.value) == false) {&lt;br /&gt;
                alert('Campo TELEFONO no válido.');&lt;br /&gt;
                return false; // sale de la función y NO envía el formulario&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                alert('Gracias por rellenar nuestro formulario correctamente.');&lt;br /&gt;
                return true; // sale de la función y SÍ envía el formulario&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El funcionament d'aquesta tècnica de validació es basa en el comportament de l'esdeveniment '''onsubmit''' de JavaScript. Igual que altres esdeveniments com '''onclick''' i '''onkeypress''' , l'esdeveniment '''onsubmit''' varia el seu comportament en funció del valor que retorna.&lt;br /&gt;
&lt;br /&gt;
Així, si l'esdeveniment '''onsubmit''' torna el valor '''true''' , el formulari s'envia com ho faria normalment. No obstant això, si l'esdeveniment onsubmit torna el valor '''false''' , el formulari no s'envia. La clau d'aquesta tècnica consisteix a comprovar tots i cadascun dels elements del formulari. En tant es troba un element incorrecte, es torna el valor '''false''' . Si no es troba cap error, es torna el valor '''true'''.&lt;br /&gt;
&lt;br /&gt;
Per tant, en primer lloc es defineix l'esdeveniment '''onsubmit''' del formulari com:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  onsubmit = &amp;quot;return validacio()&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Com el codi JavaScript retorna el valor resultant de la funció '''validacio()''' , el formulari només s'enviarà al servidor si aquesta funció retorna '''true''' . En el cas que la funció '''validacio()''' retorni '''false''' , el formulari romandrà sense enviar.&lt;br /&gt;
&lt;br /&gt;
Dins de la funció '''validacio()''' es comproven totes les condicions imposades per l'aplicació. Quan no es compleix una condició, es retorna '''false''' i per tant el formulari no s'envia. Si s'arriba al final de la funció, totes les condicions s'han complert correctament, de manera que es retorna '''true''' i el formulari s'envia.&lt;br /&gt;
&lt;br /&gt;
La notificació dels errors comesos depèn del disseny de cada aplicació. En el codi de l'exemple anterior simplement es mostren missatges mitjançant la funció '''alert()''' indicant l'error produït. Les aplicacions web ben dissenyades mostren cada missatge d'error al costat de l'element de formulari corresponent i també solen mostrar un missatge principal indicant que el formulari conté errors.&lt;br /&gt;
&lt;br /&gt;
Un cop definit l'esquema de la funció '''validacio()''' , s'ha d'afegir a aquesta funció el codi corresponent a totes les comprovacions que es realitzen sobre els elements del formulari.&lt;br /&gt;
&lt;br /&gt;
== Validació formularis HTML5==&lt;br /&gt;
&lt;br /&gt;
[http://cybmeta.com/validacion-de-formularios-con-html5/ Validació formularis HTML5 I]&lt;br /&gt;
&lt;br /&gt;
[http://mytutorials85.blogspot.com.es/2012/04/formularios-en-html5.html?email=fdfds%40fds Validació formularis HTML5 II]&lt;br /&gt;
&lt;br /&gt;
[https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation Client-side form validation]&lt;br /&gt;
&lt;br /&gt;
== Exercicis de Validació ==&lt;br /&gt;
&lt;br /&gt;
=== Formulari de validació 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea un formulari que demani 4 camps en un textbox: nom, cognoms, email i telèfon. El formulari tindrà un botó &amp;quot;Enviar&amp;quot; que validarà el contingut dels textbox i en cas de passar les validacions s'obrirà una nova pàgina (que no cal que existeixi) amb els valors introduïts passats amb el mètode GET:&lt;br /&gt;
*tots els camps seran obligatoris&lt;br /&gt;
*el format serà el típic de cada camp&lt;br /&gt;
*mostra els missatges d'error d'un en un, per ordre i posant el focus al camp que produeix cada error&lt;br /&gt;
*usa els elements que coneixes de HTML, CSS, etc per a marcar l'error. Sigues creatiu&lt;br /&gt;
&lt;br /&gt;
=== Formulari de validació 2 ===&lt;br /&gt;
&lt;br /&gt;
Al formulari anterior afegeix els camps data de naixement, adreça, codi postal i municipi (per aquest ordre) tenint en compte:&lt;br /&gt;
*la data de naixement ha de ser vàlida, en format dd/mm/aaaa i anterior a la data actual.&lt;br /&gt;
*l'adreça estarà formada per caràcters alfanumèrics i també admetrà espais,comes i guions.&lt;br /&gt;
*el codi postal i municipi tindran el format típic d'aquests camps.&lt;br /&gt;
&lt;br /&gt;
=== solució ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.input_ok {background-color: lightcyan}&lt;br /&gt;
.input_error {background-color: rgb(255, 255, 119)}&lt;br /&gt;
.label_error {color: darkred}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body &amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Exercici 1 de Validacions&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;form name=&amp;quot;formulari&amp;quot; onSubmit=&amp;quot;return valida()&amp;quot; action=&amp;quot;ex_validacions.html&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label for=&amp;quot;nom&amp;quot;&amp;gt;Nom:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;nom&amp;quot; name=&amp;quot;nom&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_nom&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;cognoms&amp;quot;&amp;gt;Cognoms:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;cognoms&amp;quot; name=&amp;quot;cognoms&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_cognoms&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;email&amp;quot;&amp;gt;Email:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;email&amp;quot; name=&amp;quot;email&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_email&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;telefon&amp;quot;&amp;gt;Telefon:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;telefon&amp;quot; name=&amp;quot;telefon&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_telefon&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;data&amp;quot;&amp;gt;Data de naixement:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;data&amp;quot; name=&amp;quot;data&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_data&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;adreca&amp;quot;&amp;gt;Adreça:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;adreca&amp;quot; name=&amp;quot;adreca&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_adreca&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;cp&amp;quot;&amp;gt;Codi postal:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;cp&amp;quot; name=&amp;quot;cp&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_cp&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;municipi&amp;quot;&amp;gt;Municipi:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;municipi&amp;quot; name=&amp;quot;municipi&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_municipi&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body &amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function valida(){&lt;br /&gt;
&lt;br /&gt;
var nom=document.getElementById(&amp;quot;nom&amp;quot;).value;&lt;br /&gt;
var cognoms=document.getElementById(&amp;quot;cognoms&amp;quot;).value;&lt;br /&gt;
var email=document.getElementById(&amp;quot;email&amp;quot;).value;&lt;br /&gt;
var telefon=document.getElementById(&amp;quot;telefon&amp;quot;).value;&lt;br /&gt;
var data=document.getElementById(&amp;quot;data&amp;quot;).value;&lt;br /&gt;
var adreca=document.getElementById(&amp;quot;adreca&amp;quot;).value;&lt;br /&gt;
var cp=document.getElementById(&amp;quot;cp&amp;quot;).value;&lt;br /&gt;
var municipi=document.getElementById(&amp;quot;municipi&amp;quot;).value;&lt;br /&gt;
var patt_alfanumeric = /^[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ]+(\s[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ]+)*$/;&lt;br /&gt;
var patt_email = /^\w+@\w+\.\w+$/;&lt;br /&gt;
var patt_telefon =/^\d{9}$/;&lt;br /&gt;
var patt_data = /^\d{2}\/\d{2}\/\d{4}$/;&lt;br /&gt;
var patt_adreca = /^[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ\,\.\-]+(\s[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ\,\.\-]+)*$/;&lt;br /&gt;
var patt_cp=/^\d{5}$/;&lt;br /&gt;
&lt;br /&gt;
// reset format dels textbox i missatges d'error&lt;br /&gt;
document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//validació del nom&lt;br /&gt;
if(nom==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_alfanumeric.test(nom)) {&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació dels cognoms&lt;br /&gt;
if(cognoms==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_alfanumeric.test(cognoms)) {&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del email&lt;br /&gt;
if(email==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_email.test(email)) {&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (ex. usuari@servidor.xx)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del telefon&lt;br /&gt;
if(telefon==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_telefon.test(telefon)) {&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (6 digits)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació de la data&lt;br /&gt;
if(data==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_data.test(data)) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (dd/mm/aaaa)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var components_data = data.split(&amp;quot;/&amp;quot;);&lt;br /&gt;
var val_data=Date.parse(components_data[2]+&amp;quot;/&amp;quot;+components_data[1]+&amp;quot;/&amp;quot;+components_data[0]);&lt;br /&gt;
&lt;br /&gt;
if(isNaN(val_data)) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;data no vàlida&amp;quot;;&lt;br /&gt;
	return false;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var today=new Date();&lt;br /&gt;
if(val_data&amp;gt;=today) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;la data ha de ser anterior a la data acutal&amp;quot;;&lt;br /&gt;
	return false;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//validació de l'adreça&lt;br /&gt;
if(adreca==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_adreca.test(adreca)) {&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del codi postal&lt;br /&gt;
if(cp==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_cp.test(cp)) {&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (5 digits)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del municipi&lt;br /&gt;
if(municipi==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_adreca.test(municipi)) {&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return true;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
	&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
POSIBLE EJERCICIO&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tags = document.querySelectorAll('h1,h2,h3,h4,h5,h6,div,p');&lt;br /&gt;
for (var i = tags.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
  tags[i].style.outline = &amp;quot;1px solid green&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validar un camp de text Obligatori ===&lt;br /&gt;
Es tracta de forçar l'usuari a introduir un valor en un quadre de text o textarea en què sigui obligatori.Perquè es doni per completat un camp de text obligatori, es comprova que el valor introduït sigui vàlid, que el nombre de caràcters introduït sigui més gran que zero i que no s'hagin introduït només espais en blanc.  El text introduït tingui una longitud superior a zero caràcters, és a dir, que no sigui un text buit i per últim, el valor introduït per l'usuari no només estigui format per espais en blanc.&lt;br /&gt;
&lt;br /&gt;
:[[solució_valor_quadre_text]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un camp de text amb valors numèrics ===&lt;br /&gt;
Es tracta d'obligar l'usuari a introduir un valor numèric en un quadre de text.&lt;br /&gt;
:[[solucio_camp_text]]&lt;br /&gt;
&lt;br /&gt;
===  Validar que s'ha seleccionat una opció d'una llista ===&lt;br /&gt;
Es tracta d'obligar l'usuari a seleccionar un element d'una llista desplegable.&lt;br /&gt;
:[[solucio_llista]]&lt;br /&gt;
&lt;br /&gt;
=== Validar una adreça de correu electrònic ===&lt;br /&gt;
Es tracta d'obligar l'usuari a introduir una adreça de correu amb un format vàlid. Per tant, el que es comprova és que la direcció sembli vàlida, ja que no es comprova si es tracta d'un compte de correu electrònic real i operativa. La comprovació es realitza novament mitjançant les expressions regulars, ja que les adreces de correu electrònic vàlides poden ser molt diferents.&lt;br /&gt;
:[[solucio_correu_electronic]]&lt;br /&gt;
&lt;br /&gt;
=== Validar una data ===&lt;br /&gt;
Les dates solen ser els camps de formulari més complicats de validar per la multitud de formes diferents en què es poden introduir.&lt;br /&gt;
:[[solucio_dates]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un número de DNI ===&lt;br /&gt;
Es tracta de comprovar que el nombre proporcionat per l'usuari es correspon amb un nombre vàlid de document nacional d'identitat o DNI. Encara que per cada país o regió els requisits del document d'identitat de les persones poden variar, a continuació es mostra un exemple genèric fàcilment adaptable. La validació no només ha de comprovar que el nombre estigui format per vuit xifres i una lletra, sinó que també cal comprovar que la lletra indicada és correcta per al número introduït.&lt;br /&gt;
:[[solució_dni]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un número de telèfon ===&lt;br /&gt;
Els números de telèfon poden ser indicats de formes molt diferents: amb prefix nacional, amb prefix internacional, agrupat per parells, separant els números amb guions, etc.&lt;br /&gt;
:[[solucio_telefon]]&lt;br /&gt;
&lt;br /&gt;
=== Validar que un checkbox ha estat seleccionat ===&lt;br /&gt;
*a)Es tracta de validar si un element de tipus checkbox s'ha de seleccionar de forma obligatòria. &lt;br /&gt;
*b)Es tracta de validar si tots els checkbox del formulari han estat seleccionats.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_checkbox]]&lt;br /&gt;
&lt;br /&gt;
=== Validar que un radiobutton ha estat seleccionat ===&lt;br /&gt;
Encara que es tracta d'un cas similar al dels checkbox, la validació dels radiobutton presenta una diferència important: en general, la comprovació que es realitza és que l'usuari hagi seleccionat algun radiobutton dels que formen un determinat grup.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_radiobutton]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;JavaScript RegExp Reference: https://www.w3schools.com/jsref/jsref_obj_regexp.asp&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Experiments amb Expresions Regulars: http://www.regexplanet.com/advanced/javascript/index.html &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;John Resig, Bear Bibeault, &amp;quot;Secrets of the Javascript Ninja&amp;quot;, Manning Publications, 2012. ISBN 193398869X&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[http://librosweb.es/javascript/capitulo_7.html Introducció a Javascript] &amp;lt;/p&amp;gt; &amp;lt;p&amp;gt; [https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions Expressions Regulars a Mozilla]&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_Esdeveniments_i_Validacio_de_formularis&amp;diff=16998</id>
		<title>NF1 - Esdeveniments i Validacio de formularis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_Esdeveniments_i_Validacio_de_formularis&amp;diff=16998"/>
				<updated>2023-01-13T16:45:55Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* Exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Esdeveniments =&lt;br /&gt;
Fins ara, totes les aplicacions i scripts que s'han creat tenen alguna cosa en comú: s'executen des de la primera instrucció fins a l'última de forma seqüencial. Gràcies a les estructures de control de flux (if, for, while) és possible modificar lleugerament aquest comportament i repetir alguns trossos del script i saltar-se altres trossos en funció d'algunes condicions.&lt;br /&gt;
&lt;br /&gt;
Aquest tipus d'aplicacions són poc útils, ja que no interactuen amb els usuaris i no poden respondre als diferents esdeveniments que es produeixen durant l'execució d'una aplicació. Afortunadament, les aplicacions web creades amb el llenguatge Javascript poden utilitzar el model de programació basada en esdeveniments.&lt;br /&gt;
&lt;br /&gt;
En aquest tipus de programació, els scripts es dediquen a esperar al fet que l'usuari &amp;quot;faci alguna cosa&amp;quot; (que premi una tecla, que mogui el ratolí, que tanqui la finestra del navegador). A continuació, el script respon a l'acció de l'usuari normalment processant aquesta informació i generant un resultat.&lt;br /&gt;
&lt;br /&gt;
Els esdeveniments fan possible que els usuaris transmetin informació als programes. Javascript defineix nombrosos esdeveniments que permeten una interacció completa entre l'usuari i les pàgines/aplicacions web. La pulsació d'una tecla constitueix un esdeveniment, així com punxar o moure el ratolí, seleccionar un element d'un formulari, redimensionar la finestra del navegador, etc.&lt;br /&gt;
&lt;br /&gt;
Javascript permet assignar una funció a cadascun dels esdeveniments. D'aquesta forma, quan es produeix qualsevol esdeveniment, Javascript executa la seva funció associada. Aquest tipus de funcions es denominen &amp;quot;event handlers&amp;quot; en anglès i solen traduir-se per &amp;quot;manegadors d'esdeveniments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Model bàsic d'esdeveniments ==&lt;br /&gt;
=== Tipus d'esdeveniments ===&lt;br /&gt;
En aquest model, cada element o etiqueta XHTML defineix la seva pròpia llista de possibles esdeveniments que se li poden assignar. Un mateix tipus d'esdeveniment (per exemple, clicar el botó esquerre del ratolí) pot estar definit per a diversos elements XHTML diferents i un mateix element XHTML pot tenir associats varis esdeveniments diferents.&lt;br /&gt;
&lt;br /&gt;
El nom de cada esdeveniment es construeix mitjançant el prefix ''on'', seguit del nom en anglès de l'acció associada a l'esdeveniment. Així, l'esdeveniment de punxar un element amb el ratolí es denomina ''onclick'' i l'esdeveniment associat a l'acció de moure el ratolí es denomina ''onmousemove''.&lt;br /&gt;
&lt;br /&gt;
La següent taula resumeix els esdeveniments més importants definits per Javascript:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Event&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Descripció&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Elements per els que está definit&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onblur&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deseleccionar l'element (el contrari de onfocus)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;button&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;label&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onchange&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Succeeix quan el valor del element ha canviat&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onclick&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;clicar i deixar anar el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;ondblclick&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;clicar dos vegades seguides amb el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onfocus&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Seleccionar un element&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;button&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;label&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeydown&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer una tecla (sense deixar-la anar)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeypress&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer una tecla&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeyup&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deixar anar una tecla premuda&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onload&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;La pàgina s'ha carregat completament&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmousedown&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer (sense deixar anar) un botn del ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmousemove&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Moure el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseout&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;El ratolí &amp;lt;em&amp;gt;&amp;quot;surt&amp;quot;&amp;lt;/em&amp;gt; de l'element (passa sobre un altre element)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseover&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;El ratoli &amp;lt;em&amp;gt;&amp;quot;entra&amp;quot;&amp;lt;/em&amp;gt; dintre de l'elemento (passa per sobre de l'element)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseup&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deixar anar el botó que estava premut en el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onreset&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Inicialitzar el formulari (esborrar totes les dades)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;form&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onresize&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;S'ha modificat la mida de la finestra del navegador&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onselect&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Seleccionar un text&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onsubmit&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Enviar el formulari&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;form&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onunload&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;S'abandona la pàgina (per exemple al tancar el navegador)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu veure tots el esdeveniments [[http://www.w3schools.com/jsref/dom_obj_event.asp aquí]]&lt;br /&gt;
&lt;br /&gt;
===Gestor  d'esdeveniments===&lt;br /&gt;
&lt;br /&gt;
Un esdeveniment de Javascript per si mateix manca d'utilitat. Perquè els esdeveniments resultin útils, s'han d'associar funcions o codi Javascript a cada esdeveniment. D'aquesta forma, quan es produeix un esdeveniment s'executa el codi indicat, per la qual cosa l'aplicació pot respondre davant qualsevol esdeveniment que es produeixi durant la seva execució.&lt;br /&gt;
&lt;br /&gt;
Les funcions o codi Javascript que es defineixen per a cada esdeveniment es denominen &amp;quot;manegador d'esdeveniments&amp;quot; i com Javascript és un llenguatge molt flexible, existeixen diverses formes diferents d'indicar els manegadors:&lt;br /&gt;
&lt;br /&gt;
*Manejadores com a atributs dels elements XHTML.&lt;br /&gt;
*Manejadores com a funcions Javascript externes.&lt;br /&gt;
*Manejadores &amp;quot;semàntics&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments com a atributs XHTML ====&lt;br /&gt;
&lt;br /&gt;
Es tracta del mètode més senzill i alhora menys professional d'indicar el codi Javascript que s'ha d'executar quan es produeixi un esdeveniment. En aquest cas, el codi s'inclou en un atribut del propi element XHTML. En el següent exemple, es vol mostrar un missatge quan l'usuari cliqui amb el ratolí sobre un botó:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquest mètode, es defineixen atributs XHTML amb el mateix nom que els esdeveniments que es volen manejar. L'exemple anterior només vol controlar l'esdeveniment de clicar amb el ratolí, el nom del qual és onclick. Així, l'element XHTML pel qual es vol definir aquest esdeveniment, ha d'incloure un atribut anomenat onclick.&lt;br /&gt;
&lt;br /&gt;
El contingut de l'atribut és una cadena de text que conté totes les instruccions Javascript que s'executen quan es produeix l'esdeveniment. En aquest cas, el codi Javascript és molt senzill (alert('Gràcies per clicar');), ja que solament es tracta de mostrar un missatge.&lt;br /&gt;
&lt;br /&gt;
En aquest altre exemple, quan l'usuari punxa sobre l'element &amp;lt;div&amp;gt; es mostra un missatge i quan l'usuari passa el ratolí per sobre de l'element, es mostra un altre missatge:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div onclick=&amp;quot;alert('Has clicat amb el ratolí');&amp;quot; onmouseover=&amp;quot;alert('Acabes de passar el ratolí per damunt');&amp;quot;&amp;gt;Ratolí&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pots clicar sobre aquest element o simplement passar el ratolí per damunt.&lt;br /&gt;
Aquest altre exemple inclou una de les instruccions més utilitzades en les aplicacions Javascript més antigues:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body onload=&amp;quot;alert(&amp;quot;La pàgina s'ha carregat completament &amp;quot;);&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior es mostra després que la pàgina s'hagi carregat completament, és a dir, després que s'hagi descarregat el seu codi HTML, les seves imatges i qualsevol altre objecte inclòs a la pàgina.&lt;br /&gt;
&lt;br /&gt;
L'esdeveniment onload és un dels més utilitzats ja que, com veurem en el capítol de DOM, les funcions que permeten accedir i manipular els nodes de l'arbre DOM solament estan disponibles quan la pàgina s'ha carregat completament.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments i variable this ====&lt;br /&gt;
&lt;br /&gt;
En els esdeveniments, es pot utilitzar la variable '''this''' per referir-se a l'element XHTML que ha provocat l'esdeveniment. Aquesta variable és molt útil per a exemples com el següent:&lt;br /&gt;
&lt;br /&gt;
Quan l'usuari passa el ratolí per sobre de el &amp;lt;div&amp;gt;, el color de la vora es mostra de color negre. Quan el ratolí surt de el &amp;lt;div&amp;gt;, es torna a mostrar la vora amb el color gris clar original.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Element &amp;lt;div&amp;gt; original:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si no s'utilitza la variable this, el codi necessari per modificar el color de les vores, seria el següent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;document.getElementById('continguts').style.borderColor='black';&amp;quot; onmouseout=&amp;quot;document.getElementById('continguts').style.borderColor='silver';&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codi anterior és massa llarg i massa propens a cometre errors. Dins del codi d'un esdeveniment, Javascript crea automàticament la variable this, que fa referència a l'element XHTML que ha provocat l'esdeveniment. Així, l'exemple anterior es pot reescriure de la següent manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;this.style.borderColor='black';&amp;quot; onmouseout=&amp;quot;this.style.borderColor='silver';&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codi anterior és molt més compacte, més fàcil de llegir i d'escriure i segueix funcionant correctament encara que es modifiqui el valor de l'atribut ''id'' de el &amp;lt; div &amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments com a funcions externes ====&lt;br /&gt;
&lt;br /&gt;
La definició dels manegadores d'esdeveniments en els atributs XHTML és el mètode més senzill però menys aconsellable de tractar amb els esdeveniments en Javascript. El principal inconvenient és que es complica a l'excés quan s'afegeixen algunes poques instruccions, per la qual cosa solament és recomanable per als casos més senzills.&lt;br /&gt;
&lt;br /&gt;
Si es realitzen aplicacions complexes, com per exemple la validació d'un formulari, és aconsellable agrupar tot el codi Javascript en una funció externa i cridar a aquesta funció des de l'element XHTML.&lt;br /&gt;
&lt;br /&gt;
Seguint amb l'exemple anterior que mostra un missatge en clicar sobre un botó:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilitzant funcions externes es pot transformar en:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function mostraMissatge() {&lt;br /&gt;
  alert('Gràcies per clicar');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;mostraMissatge()&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquesta tècnica consisteix a extreure totes les instruccions de Javascript i agrupar-les en una funció externa. Una vegada definida la funció, en l'atribut de l'element XHTML s'inclou el nom de la funció, per indicar que és la funció que s'executa quan es produeix l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
La crida a la funció es realitza de la forma habitual, indicant el seu nom seguit dels parèntesis i de forma opcional, incloent tots els arguments i paràmetres que es necessitin.&lt;br /&gt;
&lt;br /&gt;
El principal inconvenient d'aquest mètode és que en les funcions externes no es pot seguir utilitzant la variable '''this''' i per tant, és necessari passar aquesta variable com a paràmetre a la funció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ressalta(element) {&lt;br /&gt;
	switch(element.style.borderColor) {&lt;br /&gt;
		case 'silver':&lt;br /&gt;
		case 'silver silver silver silver':&lt;br /&gt;
		case '#c0c0c0':&lt;br /&gt;
			element.style.borderColor = 'black';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'black':&lt;br /&gt;
		case 'black black black black':&lt;br /&gt;
		case '#000000':&lt;br /&gt;
			element.style.borderColor = 'silver';&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;ressalta(this)&amp;quot; onmouseout=&amp;quot;ressalta(this)&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En l'exemple anterior, la funció externa és cridada amb el paràmetre ''this'', que dins de la funció es denomina element. La complexitat de l'exemple es produeix sobretot per la forma en la qual els diferents navegadors emmagatzemen el valor de la propietat *&lt;br /&gt;
''borderColor''.&lt;br /&gt;
&lt;br /&gt;
Mentre que Firefox emmagatzema (en cas que les quatre vores coincideixin en color) el valor ''black'', Internet Explorer ho emmagatzema com ''black black black black'' i Opera emmagatzema la seva representació hexadecimal ''#000000''.&lt;br /&gt;
&lt;br /&gt;
====Gestor d'esdeveniments semàntics====&lt;br /&gt;
Els mètodes que s'han vist per afegir manejadores d'esdeveniments (com a atributs XHTML i com a funcions externes) tenen un greu inconvenient: &amp;quot;embruten&amp;quot; el codi XHTML de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Com és conegut, una de les bones pràctiques bàsiques en el disseny de pàgines i aplicacions web és la separació dels continguts (XHTML) i el seu aspecte o presentació (CSS). Sempre que sigui possible, també es recomana separar els continguts (XHTML) i el seu comportament o programació (Javascript).&lt;br /&gt;
&lt;br /&gt;
Barrejar el codi Javascript amb els elements XHTML solament contribueix a complicar el codi font de la pàgina, a dificultar la modificació i manteniment de la pàgina i a reduir la semàntica del document final produït.&lt;br /&gt;
&lt;br /&gt;
Afortunadament, existeix un mètode alternatiu per definir els manegadores d'esdeveniments de Javascript. Aquesta tècnica és una evolució del mètode de les funcions externes, ja que es basa a utilitzar les propietats DOM dels elements XHTML per assignar totes les funcions externes que actuen de manejadores d'esdeveniments. Així, el següent exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;clica&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Es pot transformar en:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Funció externa&lt;br /&gt;
function mostraMissatge() {&lt;br /&gt;
alert('Gràcies per clicar');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Assignar la funció externa a l'element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&lt;br /&gt;
// Element XHTML&lt;br /&gt;
&amp;lt;input id=&amp;quot;clica&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tècnica dels manegadores semàntics consisteix en:&lt;br /&gt;
&lt;br /&gt;
*Assignar un identificador únic a l'element XHTML mitjançant l'atribut ''id''.&lt;br /&gt;
*Crear una funció de Javascript encarregada de manejar l'esdeveniment.&lt;br /&gt;
*Assignar la funció externa a l'esdeveniment corresponent en l'element desitjat.&lt;br /&gt;
*L'últim pas és la clau d'aquesta tècnica. En primer lloc, s'obté l'element al que es desitja associar la funció externa:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A continuació, s'utilitza una propietat de l'element amb el mateix nom que l'esdeveniment que es vol manejar. En aquest cas, la propietat és ''onclick'':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'assigna la funció externa mitjançant el seu nom sense parèntesi. El més important (i la causa més comuna d'errors) és indicar solament el nom de la funció, és a dir, prescindir dels parèntesis en assignar la funció:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'afegeixen els parèntesis després del nom de la funció, en realitat s'està executant la funció i guardant el valor retornat per la funció en la propietat onclick d'element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Assignar una funció externa a un esdeveniment d'un element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&lt;br /&gt;
// Executar una funció i guardar el seu resultat en una propietat d'un element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El gran avantatge d'aquest mètode és que el codi XHTML resultant és molt &amp;quot;net&amp;quot;, ja que no es barreja amb el codi Javascript. A més, dins de les funcions externes assignades sí que es pot utilitzar la variable '''this''' per referir-se a l'element que provoca l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
L'únic inconvenient d'aquest mètode és que la pàgina s'ha de carregar completament abans que es puguin utilitzar les funcions DOM que assignen els manegadors als elements XHTML. Una de les formes més senzilles d'assegurar que cert codi es va a executar després que la pàgina es carregui per complet és utilitzar l'esdeveniment '''onload''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = muestraMensaje;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gestor d'esdeveniments amb DOM====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El mètode addEventListener ens permet incloure un gestor d'esdeveniment. La sintaxi de addEventListener és la següent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
element_que_escolta.addEventListener('event',funció_a_llançar, booleà);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''element_que_escolta'' - és qualsevol element present en un document al qual es vol associar l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
''esdeveniment'' - és el succés ocorregut sobre l'element (clic, load, ...).&lt;br /&gt;
&lt;br /&gt;
''funció_a_llançar'' - és qualsevol funció definida que vulguem que s'executi quan passi l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
''booleà'' - és un valor que defineix l'ordre del flux d'esdeveniments.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si es vol escoltar un esdeveniment només una vegada i després eliminar-ho s'ha d'utilitzar el mètode removeEventListener:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
element_que_escolta.removeEventListener ('esdeveniment',funció_a_llançar, booleà);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTA 1:'' Explicació del paràmetre booleà del mètode addEventListener amb un exemple.&lt;br /&gt;
Suposem que tenim això:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Exemple de fluix events&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;Clica aqui&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quan fem clic al div no només ho estem fent sobre ell, sinó sobre els elements que el contenen en l'arbre del DOM, és a dir, hem fet clic a més sobre l'element html i sobre l'element body. Sí només hi ha una funció assignada a una escolta per al div no hi ha major problema, però si a més hi ha una per al html i una altra per al body, quin és l'ordre en què s'han de llançar les tres funcions?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per contestar a aquesta pregunta hi ha un model de comportament, el flux d'esdeveniments (anglès). Segons aquest, quan es fa clic sobre un element, l'esdeveniment es propaga en dues fases, una que és la captura -el esdeveniment comença en el nivell superior del document i recorre els elements de pares a fills- i l'altra la bombolla -el ordre invers, ascendint de fills a pares-.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un cop vist això, podem comprendre el tercer paràmetre de addEventListener, que el que fa és permetre'ns escollir l'ordre de propagació:&lt;br /&gt;
&lt;br /&gt;
'''true''': El flux d'esdeveniments és com el representat, i la fase de captura passa en llançar l'esdeveniment. L'ordre de propagació per l'exemple seria, per tant, l'indicat, ''html-body-div.''&lt;br /&gt;
&lt;br /&gt;
'''false''': Permet saltar la fase de captura, i la propagació seguiria només la bombolla. Així, l'ordre seria ''div-body-html.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTA 2:'' A internet explorer no funciona en les versions anteriors a la 7 (inclosa).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        function alerta(){&lt;br /&gt;
            alert(this);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        window.onload = function (){&lt;br /&gt;
            var elBody = document.getElementsByTagName('body')[0];&lt;br /&gt;
            var elDiv = document.getElementById('elDiv');&lt;br /&gt;
            var elButton = document.getElementById('elButton');&lt;br /&gt;
         &lt;br /&gt;
            elBody.addEventListener('click',alerta,false);&lt;br /&gt;
            elDiv.addEventListener('click',alerta,false);&lt;br /&gt;
            elButton.addEventListener('click',alerta,false);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//event.stopPropagation();   //evita propagarse el evento en forma de burbuja&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body id=&amp;quot;body&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;elDiv&amp;quot;&amp;gt;Clica aqui&lt;br /&gt;
          &amp;lt;button id=&amp;quot;elButton&amp;quot;&amp;gt;boton&amp;lt;/button&amp;gt;&lt;br /&gt;
     &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemple d'utilització manejadores d'esdeveniments amb DOM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function muestraMensaje() {&lt;br /&gt;
  				console.log(&amp;quot;Has pulsado el ratón&amp;quot;);&lt;br /&gt;
  				elDiv.removeEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);  // borra el evento asociado de tipo click a ese elemento.&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			var elDiv = document.getElementById(&amp;quot;div_principal&amp;quot;);&lt;br /&gt;
			elDiv.addEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
En el caso que no queramos que se aplique el evento de tipo de Submit o Hipervínculo &amp;quot;&amp;lt;a&amp;gt;&amp;lt;/a&amp;gt;&amp;quot; al ser botón usaremos &amp;quot;e.preventDefault()&amp;quot; y realizará las acciones que tengamos establecidas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
window.addEventListener(&amp;quot;load&amp;quot;,ejemplo); // window.onload= ejemplo;&lt;br /&gt;
&lt;br /&gt;
	function ejemplo(){&lt;br /&gt;
			function muestraMensaje(e) {&lt;br /&gt;
  				console.log(&amp;quot;Has pulsado el ratón&amp;quot;);&lt;br /&gt;
                                e.preventDefault();  //evita que se ejecute el submit y recargue la página&lt;br /&gt;
			}&lt;br /&gt;
         document.getElementById(&amp;quot;boton&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);&lt;br /&gt;
	}      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;./index.html&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;input type=&amp;quot;submit&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;boton&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En el següent exemple, s'afegeixen esdeveniments als elements de tipus ''input=text'' d'un formulari complex:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form id=&amp;quot;formulario&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;holaa&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    function resalta() {&lt;br /&gt;
        console.log(&amp;quot;holaa&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    window.onload = function() {&lt;br /&gt;
        var formulario = document.getElementById(&amp;quot;formulario&amp;quot;);&lt;br /&gt;
        var camposInput = formulario.getElementsByTagName(&amp;quot;input&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        for(var i=0; i&amp;lt;camposInput.length; i++) {&lt;br /&gt;
            if(camposInput[i].type == &amp;quot;text&amp;quot;) {&lt;br /&gt;
                camposInput[i].onclick = resalta;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Alert ===&lt;br /&gt;
Volem provar els events de la pàgina, per fer-ho posa un alert amb un missatge en els següents casos:&lt;br /&gt;
* Al carregar-se completament la pàgina.&lt;br /&gt;
* Al clicar en un botó&lt;br /&gt;
* Al passar damunt d'un paràgraf&lt;br /&gt;
* Al passar damunt d'una imatge&lt;br /&gt;
* Al sortir del damunt d'una imatge&lt;br /&gt;
* Al clicar en un enllaç&lt;br /&gt;
&lt;br /&gt;
:[[Exercici1 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Desplegable ===&lt;br /&gt;
Es vol disposar de un menu desplegable on cada element del desplegable sigui el nom de la pàgina a la cual fa referència. Quan es seleccioni una entrada del desplegable, el navegador canvia la seva url per la del desplegable.&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 2 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Rollover ===&lt;br /&gt;
Un intercanvi d'imatge és una cosa grandiosa. L'usuari aproxima el punter del ratolí a una imatge i aquesta canvia a una altre imatge. Quan l'usuari abandona la imatge, torna a canviar a la imatge anterior. &lt;br /&gt;
Fes un programa amb javascript que reprodueixi el comportament anterior.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 3 Events]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Mostrar / Ocultar text ===&lt;br /&gt;
Donada la següent pàgina&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	function muestraOculta() {&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_1&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_1&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_2&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_2&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_3&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_3&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Realitza els següents apartats:&lt;br /&gt;
*Quan es cliqui sobre el primer enllaç, s'oculti la seva secció relacionada&lt;br /&gt;
*Quan es torni a clicar sobre el mateix enllaç, es mostri una altra vegada aquesta secció de continguts&lt;br /&gt;
*Completar la resta d'enllaços de la pàgina perquè el seu comportament sigui idèntic al del primer enllaç&lt;br /&gt;
*Quan una secció s'oculti, ha de canviar el missatge de l'enllaç associat (pista: propietat innerHTML)&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 4 Events]]&lt;br /&gt;
&lt;br /&gt;
== Obtenint informació de l'esdeveniment (objecte event)==&lt;br /&gt;
Normalment, els manegadors d'esdeveniments requereixen informació addicional per processar les seves tasques. Si una funció per exemple s'encarrega de processar l'esdeveniment onclick, potser necessiti saber que posició estava el ratolí en el moment de punxar el botó.&lt;br /&gt;
&lt;br /&gt;
No obstant això, el cas més habitual en el qual és necessari conèixer informació addicional sobre l'esdeveniment és el dels esdeveniments associats al teclat. Normalment, és molt important conèixer la tecla que s'ha premut, per exemple per diferenciar les tecles normals de les tecles especials (ENTER, tabulador, Alt, Ctrl., etc.).&lt;br /&gt;
&lt;br /&gt;
Javascript permet obtenir informació sobre el ratolí i el teclat mitjançant un objecte especial anomenat ''event''. Desafortunadament, els diferents navegadors presenten diferències molt notables en el tractament de la informació sobre els esdeveniments.&lt;br /&gt;
&lt;br /&gt;
La principal diferència resideix en la forma en la qual s'obté l'objecte event. Internet Explorer considera que aquest objecte forma part de l'objecte window i la resta de navegadors ho consideren com l'únic argument que tenen les funcions manejadoras d'esdeveniments.&lt;br /&gt;
&lt;br /&gt;
Encara que és un comportament que resulta molt estrany al principi, tots els navegadors moderns excepte Internet Explorer creen màgicament i de forma automàtica un argument que es passa a la funció manegadora, per la qual cosa no és necessari incloure-ho en la trucada a la funció manegadora. D'aquesta forma, per utilitzar aquest &amp;quot;argument màgic&amp;quot;, només és necessari assignar-li un nom, ja que els navegadors ho creen automàticament.&lt;br /&gt;
&lt;br /&gt;
En resum, en els navegadors tipus Internet Explorer, l'objecte event s'obté directament mitjançant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var esdeveniment = window.event;&lt;br /&gt;
D'altra banda, en la resta de navegadors, l'objecte event s'obté màgicament a partir de l'argument que el navegador crea automàticament:&lt;br /&gt;
&lt;br /&gt;
function manejadorEventos(elEvento) {&lt;br /&gt;
var esdeveniment = elEvento;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si es vol programar una aplicació que funcioni correctament en tots els navegadors, és necessari obtenir l'objecte event de forma correcta segons cada navegador. El següent codi mostra la forma correcta d'obtenir l'objecte event en qualsevol navegador:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function manejadorEventos(elEvento) {&lt;br /&gt;
var esdeveniment = elEvento || window.event;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una vegada obtingut l'objecte event, ja es pot accedir a tota la informació relacionada amb l'esdeveniment, que depèn del tipus d'esdeveniment produït.&lt;br /&gt;
&lt;br /&gt;
=== Informació sobre l'esdeveniment ===&lt;br /&gt;
La propietat '''type''' indica el tipus d'esdeveniment produït, la qual cosa és útil quan una mateixa funció s'utilitza per manejar diversos esdeveniments:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var tipus = esdeveniment.type;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La propietat type retorna el tipus d'esdeveniment produït, que és igual al nom de l'esdeveniment però sense el prefix '''on'''.&lt;br /&gt;
&lt;br /&gt;
Mitjançant aquesta propietat, es pot refer de forma més senzilla l'exemple anterior en el qual es ressaltava una secció de continguts en passar el ratolí per damunt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ressalta(elEvento) {&lt;br /&gt;
    var esdeveniment = elEvento || window.event;&lt;br /&gt;
    switch(esdeveniment.type) {&lt;br /&gt;
         case 'mouseover':&lt;br /&gt;
               this.style.borderColor = 'black';&lt;br /&gt;
               break;&lt;br /&gt;
         case 'mouseout':&lt;br /&gt;
               this.style.borderColor = 'silver';&lt;br /&gt;
               break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
       document.getElementById(&amp;quot;seccion&amp;quot;).onmouseover = ressalta;&lt;br /&gt;
       document.getElementById(&amp;quot;seccion&amp;quot;).onmouseout = ressalta;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;div id=&amp;quot;seccion&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot;&amp;gt;&lt;br /&gt;
  Secció de continguts...&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Informació sobre els esdeveniments de teclat ===&lt;br /&gt;
De tots els esdeveniments disponibles en Javascript, els esdeveniments relacionats amb el teclat són els més incompatibles entre diferents navegadors i per tant, els més difícils de manegar. En primer lloc, existeixen moltes diferències entre els navegadors, els teclats i els sistemes operatius dels usuaris, principalment a causa de les diferències entre idiomes.&lt;br /&gt;
&lt;br /&gt;
A més, existeixen tres esdeveniments diferents per a les pulsacions de les tecles ('''onkeyup''', '''onkeypress''' i '''onkeydown'''). Finalment, existeixen dos tipus de tecles: les tecles normals (com a lletres, nombres i símbols normals) i les tecles especials (com ENTER, Alt, Shift, etc.)&lt;br /&gt;
&lt;br /&gt;
Quan un usuari prem una tecla normal, es produeixen tres esdeveniments seguits i en aquest ordre: &lt;br /&gt;
*'''onkeydown''', &lt;br /&gt;
*'''onkeypress''' i &lt;br /&gt;
*'''onkeyup'''. &lt;br /&gt;
L'esdeveniment '''onkeydown''' es correspon amb el fet de prémer una tecla i no deixar-la anar; l'esdeveniment '''onkeypress''' és la pròpia pulsació de la tecla i l'esdeveniment '''onkeyup''' fa referència al fet de deixar anar una tecla que estava premuda.&lt;br /&gt;
&lt;br /&gt;
La forma més senzilla d'obtenir la informació sobre la tecla que s'ha premut és mitjançant l'esdeveniment '''onkeypress'''. La informació que proporcionen els esdeveniments '''onkeydown''' i '''onkeyup''' es pot considerar com més tècnica, ja que retornen el ''codi intern'' de cada tecla i no el caràcter que s'ha premut.&lt;br /&gt;
&lt;br /&gt;
A continuació s'inclou una llista amb totes les propietats diferents de tots els esdeveniments de teclat tant en Internet Explorer com en la resta de navegadors:&lt;br /&gt;
&lt;br /&gt;
*Esdeveniment keydown:&lt;br /&gt;
**Mateix comportament en tots els navegadors:&lt;br /&gt;
***Propietat keyCode: codi intern de la tecla&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
*Esdeveniment keypress:&lt;br /&gt;
**Internet Explorer:&lt;br /&gt;
***Propietat keyCode: el codi del caràcter de la tecla que s'ha premut&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
**Resta de navegadors:&lt;br /&gt;
**Propietat keyCode: per a les tecles normals, no definit. Per a les tecles especials, el codi intern de la tecla.&lt;br /&gt;
**Propietat charCode: per a les tecles normals, el codi del caràcter de la tecla que s'ha premut. Per a les tecles especials, 0.&lt;br /&gt;
*Esdeveniment keyup:&lt;br /&gt;
**Mateix comportament en tots els navegadors:&lt;br /&gt;
***Propietat keyCode: codi intern de la tecla&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
Per convertir el codi d'un caràcter (no confondre amb el codi intern) al caràcter que representa la tecla que s'ha premut, s'utilitza la funció ''String.fromCharCode().''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    window.onkeydown = teclado;&lt;br /&gt;
    window.onkeypress = teclado;&lt;br /&gt;
    window.onkeyup = teclado;&lt;br /&gt;
&lt;br /&gt;
    function teclado(magica) {&lt;br /&gt;
        var e = magica || window.event; // para salvar las deficiencias de IE=window.event&lt;br /&gt;
        mostrar(e.type, e.keyCode, e.which, e.charCode, e.key);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function mostrar(evento, keyCode, which, charCode, key) {&lt;br /&gt;
      &lt;br /&gt;
        let cadena =  &amp;quot;&amp;lt;b&amp;gt; Evento: &amp;lt;/b&amp;gt;&amp;quot; + evento &lt;br /&gt;
                     + &amp;quot; ==&amp;gt; &amp;lt;b&amp;gt; keyCode: &amp;lt;/b&amp;gt;&amp;quot; + keyCode &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; which: &amp;lt;/b&amp;gt;&amp;quot; + which &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; charCode: &amp;lt;/b&amp;gt;&amp;quot;+ charCode &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; key: &amp;lt;/b&amp;gt;&amp;quot;+ key &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; FromCharCode: &amp;lt;/b&amp;gt;&amp;quot;+String.fromCharCode(charCode)+&amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         let info = document.getElementById(&amp;quot;info&amp;quot;); //display&lt;br /&gt;
         info.innerHTML += cadena&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;info&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://sospedia.net/pinchar-el-teclado-en-javascript/&lt;br /&gt;
&lt;br /&gt;
https://www.w3.org/2002/09/tests/keys-cancel2.html&lt;br /&gt;
&lt;br /&gt;
==== Exercici Teclat ====&lt;br /&gt;
Crea un script que mostri per pantalla la següent informació cada vedada que es premi una tecla:&lt;br /&gt;
* Caràcter permut  (amb key i StringCharCode)&lt;br /&gt;
* Tipus event (keydown, keypress, keyup)&lt;br /&gt;
* Propietat keycode&lt;br /&gt;
* Propietat charcode&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 5 events]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== informació sobre els esdeveniments de ratolí ===&lt;br /&gt;
La informació més rellevant sobre els esdeveniments relacionats amb el ratolí és la de les coordenades de la posició del punter del ratolí. Encara que l'origen de les coordenades sempre es troba en la cantonada superior esquerra, el punt que es pren com a referència de les coordenades pot variar.&lt;br /&gt;
&lt;br /&gt;
D'aquesta forma, és possible obtenir la posició del ratolí respecte de la pantalla de l'ordinador, respecte de la finestra del navegador i respecte de la pròpia pàgina HTML (que s'utilitza quan l'usuari ha fet scroll sobre la pàgina). Les coordenades més senzilles són les que es refereixen a la posició del punter respecte de la finestra del navegador, que s'obtenen mitjançant les propietats clientX i clientY:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function muestraInformacion(elEvento) {&lt;br /&gt;
   var esdeveniment = elEvento || window.event;&lt;br /&gt;
   var coordenadaX = esdeveniment.clientX;&lt;br /&gt;
   var coordenadaY = esdeveniment.clientY;&lt;br /&gt;
   alert(&amp;quot;Has premut el ratolí en la posició: &amp;quot; + coordenadaX + &amp;quot;, &amp;quot; + coordenadaY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.onclick = muestraInformacion;&lt;br /&gt;
//document.addeventlistener(click,&amp;quot;muestraInformacion&amp;quot;,false);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les coordenades de la posició del punter del ratolí respecte de la pantalla completa de l'ordinador de l'usuari s'obtenen de la mateixa forma, mitjançant les propietats '''screenX''' i '''screenY''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var coordenadaX = esdeveniment.screenX;&lt;br /&gt;
var coordenadaY = esdeveniment.screenY;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En moltes ocasions, és necessari obtenir un altre parell de coordenades diferents: les que corresponen a la posició del ratolí respecte de l'origen de la pàgina. Aquestes coordenades no sempre coincideixen amb les coordenades respecte de l'origen de la finestra del navegador, ja que l'usuari pot fer scroll sobre la pàgina web. Internet Explorer no proporciona aquestes coordenades de forma directa, mentre que la resta de navegadors sí que ho fan. D'aquesta forma, és necessari detectar si el navegador és de tipus Internet Explorer i en cas afirmatiu realitzar un càlcul senzill:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Detectar si el navegador és Internet Explorer&lt;br /&gt;
var ie = navigator.userAgent.toLowerCase().indexOf('msie')!=-1;&lt;br /&gt;
&lt;br /&gt;
if(ie) {&lt;br /&gt;
     coordenadaX = esdeveniment.clientX + document.body.scrollLeft;&lt;br /&gt;
     coordenadaY = esdeveniment.clientY + document.body.scrollTop;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
     coordenadaX = esdeveniment.pageX;&lt;br /&gt;
     coordenadaY = esdeveniment.pageY;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;Has premut el ratolí en la posició: &amp;quot; + coordenadaX + &amp;quot;, &amp;quot; + coordenadaY + &amp;quot; respecte de la pàgina web&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La variable '''ie''' val '''true''' si el navegador en el qual s'executa el script és de tipus Internet Explorer (qualsevol versió) i val '''false''' en un altre cas. Per a la resta de navegadors, les coordenades respecte de l'origen de la pàgina s'obtenen mitjançant les propietats '''pageX''' i '''pageY'''. En el cas d'Internet Explorer, s'obtenen sumant la posició respecte de la finestra del navegador (clientX, clientY) i el desplaçament que ha sofert la pàgina (document.bodi.scrollLeft, document.bodi.scrollTop).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Client_page_screen.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gràfics senzills amb canvas ===&lt;br /&gt;
Amb els esdeveniments de teclat i ratolí podrem programar jocs senzills. Només ens caldrà saber com situar i moure gràfics per la pantalla. Amb aquesta finalitat ens serà d'ajuda l'ús de l'element '''canvas''' de HTML.&lt;br /&gt;
&lt;br /&gt;
Al següent exemple definim un canvas (llenç) de 800x600 píxels i hi situem la imatge d'un cotxe a la coordenada (400,300). &lt;br /&gt;
&amp;lt;source lang=&amp;quot;HTML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;canvas id=&amp;quot;myCanvas&amp;quot; width=&amp;quot;800&amp;quot; height=&amp;quot;600&amp;quot; style=&amp;quot;background-color: lightskyblue;&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img id=&amp;quot;cotxe&amp;quot; src=&amp;quot;cotxe.jpg&amp;quot; style=&amp;quot;display: none;&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var canvas;&lt;br /&gt;
var ctx;&lt;br /&gt;
var imatge;&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
         canvas= document.getElementById(&amp;quot;myCanvas&amp;quot;);&lt;br /&gt;
         ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
         imatge=document.getElementById(&amp;quot;cotxe&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ctx.drawImage(imatge,400,300);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si volem simular el moviment de la imatge haurem l'haurem d'esborrar de la posició antiga i tornar-la a dibuixar a la nova posició. Per borrar la imatge podem dibuixar un rectangle del color de fons del canvas sobre la imatge amb les instruccions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
ctx.fillStyle = &amp;quot;lightskyblue&amp;quot;&lt;br /&gt;
ctx.fillRect(0,300,100,66);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'exemple dibuixem al canvas un triangle de color lightskyblue a la coordenada (0,300) i de dimensions 100x66.&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Coordenades del punter ===&lt;br /&gt;
Crea una pàgina on es mostri constantment les coordenades del punter dins de la pàgina (propietats clientX, clientY).&lt;br /&gt;
&lt;br /&gt;
=== event MOUSEOVER ===&lt;br /&gt;
Crea una pàgina de contingut lliure que tingui els següents elements:&lt;br /&gt;
*Títol (capçalera H1)&lt;br /&gt;
*Tres paràgrafs que continguin una imatge alineada a la dreta o a l'esquerra del text. La longitud del text de cada paràgraf serà prou extensa per a superar l'alçada de la imatge respectiva.&lt;br /&gt;
*Tres títols (capçalera H2) que precediran cadascun dels paràgrafs.&lt;br /&gt;
Programa les respostes als events MOUSEOVER de cada element de forma que:&lt;br /&gt;
*tots els elements de text (quatre capçaleres i tres paràgrafs) canviin de format quan tenen el punter del ratolí al damunt. Cada element de text tornarà al seu format original quan el punter ja no sigui al damunt&lt;br /&gt;
*les imatges giraran en sentit horari quan tinguin el punter al damunt i deixaran de fer-ho quan el punter ja no sigui al damunt.&lt;br /&gt;
&lt;br /&gt;
=== Ordre dels events ===&lt;br /&gt;
Crea una pàgina amb quatre seccions DIV aniuades i etiquetades amb els noms div1, ... , div4:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;div1&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div2&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div3&amp;quot;&amp;gt;&amp;lt;div id=&amp;quot;div4&amp;quot;&amp;gt;contingut random...&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Crea funcions de resposta a l'event CLICK per a cada element DIV que escrigui un missatge de l'estil &amp;quot;Has clickat sobre l'element div1&amp;quot;.&lt;br /&gt;
Com aconseguiries que l'ordre en què es disparen els elements siguin els següents?:&lt;br /&gt;
*div1,div2,div3,div4&lt;br /&gt;
*div4,div3,div2,div1&lt;br /&gt;
*div1,div3,div4,div2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Fitxer:Gamepad.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
Dibuixa un rectangle i que es mova en funció del joystick, i mostre per pantalla els diferents botons.&lt;br /&gt;
 &lt;br /&gt;
http://html5gamepad.com&lt;br /&gt;
&lt;br /&gt;
:[[ejm_gamepad]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ratolí i Teclat ===&lt;br /&gt;
a) Es vol que el ratolí, en qualsevol punt de la finestra del navegador, es mostri la posició del punter respecte del navegador i respecte de la pàgina.&lt;br /&gt;
[[Fitxer:ex_ratoli.gif|100px]]&lt;br /&gt;
&lt;br /&gt;
b) Es vol que, a més a més, en prémer qualsevol tecla, el missatge mostrat ha de canviar per indicar el nou esdeveniment i la seva informació associada.&lt;br /&gt;
[[Fitxer:ex_teclat.gif|100px]]&lt;br /&gt;
&lt;br /&gt;
c)Afegir la següent característica al script: quan es prem un botó del ratolí, el color de fons del quadre de missatge ha de ser groc (#FFFFCC) i quan es prem una tecla, el color de fons ha de ser blau (#CCE6FF). En tornar a moure el ratolí, el color de fons torna a ser blanc.&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fitxer:ex_tec_rat_color.gif|200px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 6 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Posició ratolí ===&lt;br /&gt;
Crear un script que informi a l'usuari en què zona de la pantalla ha premut el ratolí. Les zones definides són les següents: esquerra a dalt, esquerra a baix, dreta a dalt i dreta a baix.&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 7 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Estrella Michelin ===&lt;br /&gt;
&lt;br /&gt;
Un restaurant té 4 tapes principals on cadascuna té un preu  1 €, 2 €, 3 € i 4 € (esquerra a dreta). &lt;br /&gt;
&lt;br /&gt;
Com el local és petit, es disposa de dos cambrers, cadascun d'ells té un botó que l'executarà en el cas de servir una tapa. Quan un cambrer serveixi una tapa haurà:&lt;br /&gt;
*1. Primer seleccionar-se amb el botó&lt;br /&gt;
*2. Clicar a la tapa o tapes servides.&lt;br /&gt;
&lt;br /&gt;
Cada vegada que el cambrer faci click a una tapa el seu preu s'incrementarà en la recaudació del cambrer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Michelin.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
:[[solucio michelin]]&lt;br /&gt;
&lt;br /&gt;
===Cuadrat===&lt;br /&gt;
&lt;br /&gt;
Es desitja que un cuadrat es mova al llarg de la pantalla&lt;br /&gt;
&lt;br /&gt;
:[[sol_cuadrat]]&lt;br /&gt;
&lt;br /&gt;
=== Joc Tenis ===&lt;br /&gt;
Es tracta de implementar en Javascript un dels 1ers jocs que es va inventar per a PC. El joc del Tenis. &lt;br /&gt;
[[Fitxer:tenis.png|400px|center]]&lt;br /&gt;
Per començar el joc s'ha de pulsar la tecla 'S', per parar 'P' i per reinicializar la 'R'.&lt;br /&gt;
&lt;br /&gt;
Jugador 1:&lt;br /&gt;
*Utilitza el ratolí per el desplaçament de la raqueta&lt;br /&gt;
Jugador 2:&lt;br /&gt;
*tecla '↑' per desplaçar la raqueta cap a dalt&lt;br /&gt;
*tecla '↓' per desplaçar la raqueta cap a baix&lt;br /&gt;
Altres aspectes del joc&lt;br /&gt;
*A més a més, hi ha un marcador que indiqui qui va guanyant.&lt;br /&gt;
*També hi ha un botó, per exemple F2, per augmentar el número de pilotes&lt;br /&gt;
*També hi ha un botó per canviar els colors del joc. Pot existir diversos temes (F5-F8)&lt;br /&gt;
&lt;br /&gt;
https://www.w3schools.com/html/html5_draganddrop.asp&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Expressions Regulars =&lt;br /&gt;
Les expressions regulars son una necessitat a l'hora de validar formularis. Alguns problemes de validació no es podrien solucionar de una manera elegant sense elles.&lt;br /&gt;
Les expressions regulars son senzillament una manera d'expresar un patró per a cadenes coincidents de text. La expressions contenen termes i operadors que ens pemeten definir els patrons.&lt;br /&gt;
&lt;br /&gt;
== Creació d'expresions regulars ==&lt;br /&gt;
A Javascript, com succeeix amb la majoria d'objectes, existeixen dos formes de crear expresions regulars: &lt;br /&gt;
*mitjançant un literal&lt;br /&gt;
*creant una instància d'un objecte de tipus '''RegExp'''&lt;br /&gt;
&lt;br /&gt;
La creació d'una expressió regular amb un literal és molt sezill. Veïem un exemple. Volem crear una expressió regular que coincideixi exactament amb el string &amp;quot;test&amp;quot;:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = /test/;&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
Les expresions regulars van envoltades del caràctes /. Igual que els String van envoltades del caràcter &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
També podíem haver creat una instància del objecte RegExp de la següent manera:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = new RegExp(&amp;quot;test&amp;quot;);&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificadors ha utilitzar a l'hora de crear expressions regulars ==&lt;br /&gt;
A més a més de la propia expressió regular, podem introduïr els següents modificadors:&lt;br /&gt;
*''i'': Fa que no distingeixi de majúscules i minúscules. ex: /test/i&lt;br /&gt;
*''g'': Realitza una comparació global, en comptes de parar-se després de la primera coincidència.&lt;br /&gt;
*''m'': Realitza una comparació multilínia (més detalls a https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/multiline )&lt;br /&gt;
Exemple d'ús:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = /test/ig&lt;br /&gt;
var pattern2 = new RegExp(&amp;quot;test&amp;quot;,&amp;quot;ig&amp;quot;);&lt;br /&gt;
//exemple d'us de la expressió regular&lt;br /&gt;
alert(pattern.test(&amp;quot;test&amp;quot;));&lt;br /&gt;
alert(pattern2.test(&amp;quot;test&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termes i Operadors ==&lt;br /&gt;
&lt;br /&gt;
*''Coincidència exacta'': Tot lo que no sigui un caràcter especial o un operador haurà d'apareixer de forma literal en la expressió. Ex: /test/ la paraula '''test'' ha d'aparèixer exactament.&lt;br /&gt;
*''Combinacions de caràcters'': Moltes vegades no volem combinar un caràcter literal específic, sino un grup finit de caràcters. Podem especificar-ho col·locant el grup de caràcters que volem combinar entre claudàtors. Ex: [abc]&lt;br /&gt;
*''Combinacions de caràcters excloents'': Altres vegades volem combinar tots els caràcters trets d'uns quants. Per fer-ho podem utilitzar el símbol ''^'' seguit dels caràcters que no volem en la expresió. Ex: [^abc]. &lt;br /&gt;
*''Rang de valors'': També tenim la habilitat d'especificar un rang de valors. Ex: volem qualsevol caràcter entre '''a''' i '''m''' minmúscula --&amp;gt; [a-m] (ambdós incloses).&lt;br /&gt;
&lt;br /&gt;
=== Caràcters especials ===&lt;br /&gt;
Existeixen caràcters especials en les expresions regulars, de fet, ja hem vist uns quants: '''[''', ''']''', '''-''' i '''^'''.&lt;br /&gt;
Però encara hi ha uns quants més com serien el '''$''', '''{''', '''}''', '''?''', ''',''', '''+''' i el '''.'''&lt;br /&gt;
Com podem fer per utilitzar-los de forma literal en comptes d'utilitzar-los com a operadors de les expressions regulars? Escapant-los.&lt;br /&gt;
Però com? Utilitzant un caràcter especial: ''\''. Ex: La expressió regular '''/\[/''' significa el caràcter '''[''' i no l'inici d'un grup de caràcters.  &lt;br /&gt;
Així mateix, per poder utilitzar el caràcter '''\''' dintre de la expressió regular l'haurem d'escapar. Ex: '''\\''' correspon al literal '''\'''.&lt;br /&gt;
&lt;br /&gt;
=== Principis i finals ===&lt;br /&gt;
A vegades volem que un patró coincideixi amb el principi d'una cadena o amb el final. &lt;br /&gt;
*Principi: Utilitzarem el caràcter ''^''. Ex: /^test/ : només coincideix si la cadena '''test''' coincideix amb el principi.&lt;br /&gt;
*Final: Utilitzarem el caràcter ''$''. Ex: /test$/ : només coincideix si la cadena '''test''' coincideix amb el final.&lt;br /&gt;
*Principi i final: Ex: /^test$/ : Indica que el patró especificat ha d'incluir tota la cadena candidata.&lt;br /&gt;
&lt;br /&gt;
=== Repetició de caràcters ===&lt;br /&gt;
&lt;br /&gt;
Si volem combinar una serie de quatre caràcters 'a' podem expressar-ho amb ''/aaa/'' però que succeeix si volem utilitzar un número qualsevol de repeticions del mateix caràcter?&lt;br /&gt;
Tenim diferents opcions:&lt;br /&gt;
*Podem especificar que un caràcter és opcional, es a dir, &amp;lt;b&amp;gt;pot aparèixer alguna vegada o cap (0 ó 1)&amp;lt;/b&amp;gt;, Es fa afegint el caràcter '''''?''''' al final. Exemple: /t?est/. Aquest patró combina dues opcions: '''test i est'''.&lt;br /&gt;
*Si volem que un caràcter '''apareixi moltes vegades (1 o més)''' utilitzarem '''''+'''''. Ex: /t+est/. Aquest patró combina '''test''', '''ttest''' i '''tttest''' però no '''est'''.&lt;br /&gt;
*Si volem que un '''caràcter apareixi zero o més vegades (0 o més)''' utilitzem el caràcter '''*'''. Ex: /t*est/. Aquest patró combina '''test''', '''ttest''', '''tttest''' i també '''est'''.&lt;br /&gt;
*Podem especificar una quantitat concreta amb el número de repeticions permeses entre claudàtors '''''{}'''''Text en negreta. Per exemple, /a{4}/ indica una coincidència de quatre caràcters 'a' consecutius.&lt;br /&gt;
*També podem especificar un intérval per al compte de repeticions. Per exemple, /a{4,10}/ indica una combinació de 4 a 10 caracters 'a' consecutius.&lt;br /&gt;
*Si en aquest interval no s'indica el segon valor de l'intèrval indiquem que el número final és infinit. Ex: /a{4,}/. Aquest patró combina qualsevol cadena de cuatre o més caràcters 'a' consecutius. Fixat que és important posar la '''coma''' després del 4.&lt;br /&gt;
&lt;br /&gt;
=== Caràcters predefinits ===&lt;br /&gt;
La sintaxis de les expressions regulars ens proporcionen un nombre de termes predefinits que representen caràcters o clases de caràcters que s'utilitzen amb freqüència. &lt;br /&gt;
Taula:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Terme Predefinit&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Equivalència&lt;br /&gt;
|-&lt;br /&gt;
| \t ||Tabulació horitzontal&lt;br /&gt;
|-&lt;br /&gt;
| \b ||Retrocés&lt;br /&gt;
|-&lt;br /&gt;
| \v ||Tabulació Vertical&lt;br /&gt;
|-&lt;br /&gt;
| \f||Salt de página&lt;br /&gt;
|-&lt;br /&gt;
| \r||Retorn de carro.&lt;br /&gt;
|-&lt;br /&gt;
| \n||Nova linia&lt;br /&gt;
|-&lt;br /&gt;
| \cA : \cZ||Caràcters de control&lt;br /&gt;
|-&lt;br /&gt;
| \x0000 : \xFFFF||Unicode Hexadecimal&lt;br /&gt;
|-&lt;br /&gt;
|  \x00 : \xFF||ASCII Hexadecimal&lt;br /&gt;
|-&lt;br /&gt;
| .||Qualsevol caràcter, excepte nova linia&lt;br /&gt;
|-&lt;br /&gt;
|  \d||Qualsevol dígit decimal. Equivalent a [0-9]&lt;br /&gt;
|-&lt;br /&gt;
| \D||Qualsevol caràcter menys un dígit decimal. Equivalent a [^0-9]&lt;br /&gt;
|-&lt;br /&gt;
| \w||Qualsevol caràcter alfanuméric incloent el subratllat. [A-Za-z0-9_]&lt;br /&gt;
|-&lt;br /&gt;
| \W||Qualsevol caràcter menys els alfanumèric i el subratllat. [^A-Za-z0-9_]&lt;br /&gt;
|-&lt;br /&gt;
| \s||Qualsevol espai en blanc (espai, tabulador, salt de pàgina,etc.)&lt;br /&gt;
|-&lt;br /&gt;
| \S||Qualsevol caràcter menys un espai en blanc.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Per veure el llistat complert fes click [http://www.visibone.com/regular-expressions/ aquí].&lt;br /&gt;
&lt;br /&gt;
=== Agrupació de caràcters ===&lt;br /&gt;
De moment, hem observat que els operadors + i * només afecten al terme que els '''precedeix'''. Si volem aplicar-los a un grup de termes, podem utilitzar ''parèntesis'', igual que si es tractés d'una formula matemàtica. Per exemple: /(ab)+/. Aquest patró combina una o més aparicions de la cadena '''ab'''.&lt;br /&gt;
&lt;br /&gt;
=== Alternància de caràcters ===&lt;br /&gt;
La alternància pot expressar-se utilitzant el caràcter '''|'''. Per exemple: /a|b/ combina el caràcter '''a''' o '''b''', i /(ab)+|(cd)+/ combina només una o més repeticions de '''ab''' o '''cd'''.&lt;br /&gt;
&lt;br /&gt;
== Mètodes de les Expressions Regulars ==&lt;br /&gt;
*''pattern.test(cadena)'' : Executa la expressió regular e indica si la cadena passada per paràmetre coincideix o no. (retorna True o False)&lt;br /&gt;
*''pattern.exec(cadena)'' : Executa la expressió regular i retorna la primera coincidència.&lt;br /&gt;
== Resum Expressions Regulars ==&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Expresiones.jpg]]&lt;br /&gt;
[http://rua.ua.es/dspace/bitstream/10045/13363/6/07c-JavaScriptExpReg.pdf Resum Expressions Regulars]&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.regexr.com/ Comprovar expressions regulars]&lt;br /&gt;
&lt;br /&gt;
[https://regex101.com/ Comprovar expressions regulars II]&lt;br /&gt;
&lt;br /&gt;
Crea un patró per a cadascuna de les diferents cadenes que es mostren a continuació:&lt;br /&gt;
&lt;br /&gt;
*Codi postal. Ex: 46700&lt;br /&gt;
*Numero de telèfon amb prefix i guións, el primer nombre pot ser un 8 ó 9. Ex: 93-123-11-33&lt;br /&gt;
*Numero de telèfon amb prefix i punts. Ex: 93-1.231.1339&lt;br /&gt;
*Numero de telèfon internacional. Ex: (+34)952356817 &lt;br /&gt;
*Nom d'usuari amb un mínim de 4 i un màxim de 15. Ex: julio_30&lt;br /&gt;
*Nombre Real. Ex:  -122.33 ó 7,3 ó 8 &lt;br /&gt;
*Numero ISBN de 13 dígits: 978-3-16-148410-0&lt;br /&gt;
*Numero de la seguretat social: 01-123456789&lt;br /&gt;
*Adreça Postal amb les següent condicions: Carrer (C\), Plaza(Pz.), Avinguda(Av.). Direcció. Numero - Porta.&lt;br /&gt;
Ex: C\ Mare de Deu de montserrat. 233 - 2&lt;br /&gt;
*Numero IP d'un ordinador de la versió 4.&lt;br /&gt;
*Numero Mac d'un ordinador separats per ':'&lt;br /&gt;
*URL (amb http, https, www, etc)&lt;br /&gt;
*Data: Ex: DD/MM/AAAA&lt;br /&gt;
*Hora: 23:55:55&lt;br /&gt;
*Email&lt;br /&gt;
*Comprobar un nombre propio&lt;br /&gt;
*Targeta de crèdit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Codi postal. Ex: 46700&lt;br /&gt;
**sol: ^\d{5}$ &lt;br /&gt;
*Numero de telèfon amb prefix i guións, el primer nombre pot ser un 8 ó 9. Ex: 93-123-11-33&lt;br /&gt;
**sol: ^[89](\d-\d{3})-\d{2}-\d{2}$&lt;br /&gt;
*Numero de telèfon amb prefix i punts. Ex: 93-1.231.1339&lt;br /&gt;
**sol: ^[89](\d-\d.)\d{3}\.\d{3}$&lt;br /&gt;
*Numero de telèfon internacional. Ex: (+34)952356817 &lt;br /&gt;
**sol: ^\(\+\d{2,3}\)\d{9}$&lt;br /&gt;
*Nom d'usuari amb un mínim de 4 i un màxim de 15. Ex: julio_30&lt;br /&gt;
**sol: ^[a-z\d_]{4,15}$&lt;br /&gt;
*Nombre Real. Ex:  -122.33 ó 7,3 ó 8 &lt;br /&gt;
**sol: ^[+-]?\d+([,.]\d+)?$    &lt;br /&gt;
*Numero ISBN de 13 dígits: 978-3-16-148410-0&lt;br /&gt;
*Numero de la seguretat social: 01-123456789&lt;br /&gt;
**sol: ^\d{2}-\d{9}$&lt;br /&gt;
**sol: ^[0-1]{2}-\d{9}$&lt;br /&gt;
*Adreça Postal amb les següent condicions: Carrer (C\), Plaza(Pz.), Avinguda(Av.). Direcció. Numero - Porta.&lt;br /&gt;
Ex: C\ Mare de Deu de montserrat. 233 - 2&lt;br /&gt;
**sol: ^((C\\)|(Pz\.)|(Av\.))\s.+\.\s\d{1,5}\s-\s\d$&lt;br /&gt;
((C\\)|(Pz\.)|(Av\.))[a-zA-Z ]+\.[0-9 ]+\-[0-9 ]+&lt;br /&gt;
*Numero IP d'un ordinador de la versió 4.&lt;br /&gt;
** sol: ^((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]?)\.)((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]|[0-9])\.){2}((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]|[0-9]))$&lt;br /&gt;
 ^(?:\d{1,3}\.){3}\d{1,3}$&lt;br /&gt;
*Numero Mac d'un ordinador separats per ':'&lt;br /&gt;
*URL (amb http, https, www, etc)&lt;br /&gt;
**sol:(www\.|http:\/\/|https:\/\/)\S*\.(com|es|org))&lt;br /&gt;
*Data: Ex: DD/MM/AAAA&lt;br /&gt;
**sol: ^\d{1,2}\/\d{1,2}\/\d{2,4}$ &lt;br /&gt;
         ^([3][0-1]|[0-2][0-9])\/[0-1]?[0-2]\/[1-2]\d{3}$  coge hasta el día 31 y el mes 12 &lt;br /&gt;
*Hora: 23:55:55&lt;br /&gt;
**sol: ^(0[1-9]|1\d|2[0-3]):([0-5]\d):([0-5]\d)$ &lt;br /&gt;
*Email&lt;br /&gt;
**sol: /^[\w]+@{1}[\w]+\.[a-z]{2,3}$/&lt;br /&gt;
**sol: ^[\\w-]+(\\.[\\w-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$ &lt;br /&gt;
*Comprobar un nombre propio&lt;br /&gt;
**sol: /^([A-Z]{1}[a-zñáéíóú]+[\s]*)+$/ &lt;br /&gt;
*Targeta de crèdit&lt;br /&gt;
**sol:  ^((67\d{2})|(4\d{3})|(5[1-5]\d{2})|(6011))(-?\s?\d{4}){3}|(3[4,7])\ d{2}-?\s?\d{6}-?\s?\d{5}$&lt;br /&gt;
&lt;br /&gt;
= Formularis =&lt;br /&gt;
JavaScript disposa de nombroses propietats i funcions que faciliten la programació d'aplicacions que manegen formularis. En primer lloc, quan es carrega una pàgina web, el navegador crea automàticament una matriu anomenat forms i que conté la referència a tots els formularis de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Per accedir al array forms , s'utilitza l'objecte document , de manera que document.forms és la matriu que conté tots els formularis de la pàgina. Com es tracta d'un array, l'accés a cada formulari es realitza amb la mateixa sintaxi dels arrays. La següent instrucció accedeix al primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més de l'array de formularis, el navegador crea automàticament una matriu anomenat ''elements'' per cadascun dels formularis de la pàgina. Cada array elements conté la referència a tots els elements (quadres de text, botons, llistes desplegables, etc.) d'aquest formulari. Utilitzant la sintaxi dels arrays, la següent instrucció obté el primer element del primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]. elements [0]; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La sintaxi dels arrays no sempre és tan concisa. El següent exemple mostra com obtenir directament l'últim element del primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]. elements [document. forms [0]. elements. length - 1];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Encara que aquesta forma d'accedir als formularis és ràpida i senzilla, té un inconvenient molt greu. Què passa si canvia el disseny de la pàgina i en el codi HTML es canvia l'ordre dels formularis originals o s'afegeixen nous formularis? El problema és que &amp;quot;el primer formulari de la pàgina&amp;quot; ara podria ser un altre formulari diferent al que espera l'aplicació.&lt;br /&gt;
&lt;br /&gt;
En un entorn tan canviant com el disseny web, és molt difícil confiar que l'ordre dels formularis es mantingui estable en una pàgina web. Per aquest motiu, sempre s'hauria d'evitar l'accés als formularis d'una pàgina mitjançant l'array ''document.forms''.&lt;br /&gt;
&lt;br /&gt;
Una forma d'evitar els problemes del mètode anterior consisteix a accedir als formularis d'una pàgina a través del seu nom (atribut '''name''') o a través del seu atribut '''id''' . L'objecte document permet accedir directament a qualsevol formulari mitjançant la seva atribut '''name''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var formularioPrincipal = document. formulari;&lt;br /&gt;
 var formularioSecundario = document. otro_formulario;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/ Form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;otro_formulario&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Accedint d'aquesta forma als formularis de la pàgina, l'script funciona correctament encara que es reordenin els formularis o s'afegeixin nous formularis a la pàgina. Els elements dels formularis també es poden accedir directament mitjançant el seu atribut '''name''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  var formularioPrincipal = document. formulari;&lt;br /&gt;
 var primerElemento = document. formulari. element;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;Input type = &amp;quot;text&amp;quot; name = &amp;quot;element&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Òbviament, també es pot accedir als formularis i als seus elements utilitzant les funcions DOM d'accés directe als nodes. El següent exemple utilitza l'habitual funció '''document.getElementById()''' per accedir de forma directa a un formulari i un dels seus elements:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var formularioPrincipal = document. getElementById (&amp;quot;formulari&amp;quot;);&lt;br /&gt;
 var primerElemento = document. getElementById (&amp;quot;element&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot; id = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;Input type = &amp;quot;text&amp;quot; name = &amp;quot;element&amp;quot; id = &amp;quot;element&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Independentment del mètode utilitzat per obtenir la referència a un element de formulari, cada element disposa de les següents propietats útils per al desenvolupament de les aplicacions:&lt;br /&gt;
*''type'' : indica el tipus d'element que es tracta. Per als elements de tipus &amp;lt;input&amp;gt; ( text , button , checkbox , etc.) coincideix amb el valor del seu atribut '''type''' . Per a les llistes desplegables normals (element &amp;lt;select&amp;gt; ) el seu valor és '''select-one''' , el que permet diferenciar-les de les llistes que permeten seleccionar diversos elements alhora i el tipus és '''select-multiple'''. Finalment, en els elements de tipus &amp;lt;textarea&amp;gt; , el valor de type és '''textarea''' .&lt;br /&gt;
*''form'' : és una referència directa al formulari al qual pertany l'element. Així, per accedir al formulari d'un element, es pot utilitzar document.getElementById(&amp;quot;id_del_elemento&amp;quot;).form&lt;br /&gt;
*''name'' : obté el valor de l'atribut name de XHTML. Només es pot llegir el seu valor, per la qual cosa no es pot modificar.&lt;br /&gt;
*''value'' : permet llegir i modificar el valor de l'atribut value de XHTML. Per als camps de text ( &amp;lt;input type=&amp;quot;text&amp;quot;&amp;gt; i &amp;lt;textarea&amp;gt; ) obté el text que ha escrit l'usuari. Per als botons obté el text que es mostra al botó. Per als elements checkbox i radiobutton no és molt útil, com es veurà més endavant&lt;br /&gt;
&lt;br /&gt;
== Validació ==&lt;br /&gt;
&lt;br /&gt;
La principal utilitat de JavaScript en el maneig dels formularis és la validació de les dades introduïdes pels usuaris. Abans d'enviar un formulari al servidor, es recomana validar mitjançant JavaScript les dades inserides per l'usuari. D'aquesta manera, si l'usuari ha comès algun error en omplir el formulari, se li pot notificar de forma instantània, sense necessitat d'esperar la resposta del servidor.&lt;br /&gt;
&lt;br /&gt;
Notificar els errors de forma immediata mitjançant JavaScript millora la satisfacció de l'usuari amb l'aplicació (el que tècnicament es coneix com &amp;quot;millorar l'experiència d'usuari&amp;quot;) i ajuda a reduir la càrrega de processament al servidor.&lt;br /&gt;
&lt;br /&gt;
Normalment, la validació d'un formulari consisteix en cridar a una funció de validació quan l'usuari prem sobre el botó d'enviament del formulari. En aquesta funció, es comproven si els valors que ha introduït l'usuari compleixen les restriccions imposades per l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Encara que hi ha tantes possibles comprovacions com a elements de formulari diferents, algunes comprovacions són molt habituals: que ompli un camp obligatori, que se seleccioni el valor d'una llista desplegable, que l'adreça d'email indicada sigui correcta, que la data introduïda sigui lògica, que s'hagi introduït un nombre on així es requereix, etc.&lt;br /&gt;
&lt;br /&gt;
A continuació es mostra el codi JavaScript bàsic necessari per incorporar la validació a un formulari:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form name=&amp;quot;formulario&amp;quot;  onSubmit=&amp;quot;return ValidaCampos()&amp;quot;&amp;gt;&lt;br /&gt;
 Teléfono: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;telefono&amp;quot; size=&amp;quot;15&amp;quot; maxlength=&amp;quot;15&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
           &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enviar&amp;quot; name=&amp;quot;enviar&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
I l'esquema de la funció validacio() és el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ValidaCampos() {&lt;br /&gt;
   var expresion_regular_telefono = /^[89](\d-\d.)\d{3}\.\d{3}$/;  &lt;br /&gt;
// 9 cifras numéricas.&lt;br /&gt;
// Usaremos el método &amp;quot;test&amp;quot; de las expresiones regulares:&lt;br /&gt;
      if (expresion_regular_telefono.test(formulario.telefono.value) == false) {&lt;br /&gt;
                alert('Campo TELEFONO no válido.');&lt;br /&gt;
                return false; // sale de la función y NO envía el formulario&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                alert('Gracias por rellenar nuestro formulario correctamente.');&lt;br /&gt;
                return true; // sale de la función y SÍ envía el formulario&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El funcionament d'aquesta tècnica de validació es basa en el comportament de l'esdeveniment '''onsubmit''' de JavaScript. Igual que altres esdeveniments com '''onclick''' i '''onkeypress''' , l'esdeveniment '''onsubmit''' varia el seu comportament en funció del valor que retorna.&lt;br /&gt;
&lt;br /&gt;
Així, si l'esdeveniment '''onsubmit''' torna el valor '''true''' , el formulari s'envia com ho faria normalment. No obstant això, si l'esdeveniment onsubmit torna el valor '''false''' , el formulari no s'envia. La clau d'aquesta tècnica consisteix a comprovar tots i cadascun dels elements del formulari. En tant es troba un element incorrecte, es torna el valor '''false''' . Si no es troba cap error, es torna el valor '''true'''.&lt;br /&gt;
&lt;br /&gt;
Per tant, en primer lloc es defineix l'esdeveniment '''onsubmit''' del formulari com:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  onsubmit = &amp;quot;return validacio()&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Com el codi JavaScript retorna el valor resultant de la funció '''validacio()''' , el formulari només s'enviarà al servidor si aquesta funció retorna '''true''' . En el cas que la funció '''validacio()''' retorni '''false''' , el formulari romandrà sense enviar.&lt;br /&gt;
&lt;br /&gt;
Dins de la funció '''validacio()''' es comproven totes les condicions imposades per l'aplicació. Quan no es compleix una condició, es retorna '''false''' i per tant el formulari no s'envia. Si s'arriba al final de la funció, totes les condicions s'han complert correctament, de manera que es retorna '''true''' i el formulari s'envia.&lt;br /&gt;
&lt;br /&gt;
La notificació dels errors comesos depèn del disseny de cada aplicació. En el codi de l'exemple anterior simplement es mostren missatges mitjançant la funció '''alert()''' indicant l'error produït. Les aplicacions web ben dissenyades mostren cada missatge d'error al costat de l'element de formulari corresponent i també solen mostrar un missatge principal indicant que el formulari conté errors.&lt;br /&gt;
&lt;br /&gt;
Un cop definit l'esquema de la funció '''validacio()''' , s'ha d'afegir a aquesta funció el codi corresponent a totes les comprovacions que es realitzen sobre els elements del formulari.&lt;br /&gt;
&lt;br /&gt;
== Validació formularis HTML5==&lt;br /&gt;
&lt;br /&gt;
[http://cybmeta.com/validacion-de-formularios-con-html5/ Validació formularis HTML5 I]&lt;br /&gt;
&lt;br /&gt;
[http://mytutorials85.blogspot.com.es/2012/04/formularios-en-html5.html?email=fdfds%40fds Validació formularis HTML5 II]&lt;br /&gt;
&lt;br /&gt;
[https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation Client-side form validation]&lt;br /&gt;
&lt;br /&gt;
== Exercicis de Validació ==&lt;br /&gt;
&lt;br /&gt;
=== Formulari de validació 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea un formulari que demani 4 camps en un textbox: nom, cognoms, email i telèfon. El formulari tindrà un botó &amp;quot;Enviar&amp;quot; que validarà el contingut dels textbox i en cas de passar les validacions s'obrirà una nova pàgina (que no cal que existeixi) amb els valors introduïts passats amb el mètode GET:&lt;br /&gt;
*tots els camps seran obligatoris&lt;br /&gt;
*el format serà el típic de cada camp&lt;br /&gt;
*mostra els missatges d'error d'un en un, per ordre i posant el focus al camp que produeix cada error&lt;br /&gt;
*usa els elements que coneixes de HTML, CSS, etc per a marcar l'error. Sigues creatiu&lt;br /&gt;
&lt;br /&gt;
=== Formulari de validació 2 ===&lt;br /&gt;
&lt;br /&gt;
Al formulari anterior afegeix els camps data de naixement, adreça, codi postal i municipi (per aquest ordre) tenint en compte:&lt;br /&gt;
*la data de naixement ha de ser vàlida, en format dd/mm/aaaa i anterior a la data actual.&lt;br /&gt;
*l'adreça estarà formada per caràcters alfanumèrics i també admetrà espais,comes i guions.&lt;br /&gt;
*el codi postal i municipi tindran el format típic d'aquests camps.&lt;br /&gt;
&lt;br /&gt;
=== solució ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.input_ok {background-color: lightcyan}&lt;br /&gt;
.input_error {background-color: rgb(255, 255, 119)}&lt;br /&gt;
.label_error {color: darkred}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body &amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Exercici 1 de Validacions&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;form name=&amp;quot;formulari&amp;quot; onSubmit=&amp;quot;return valida()&amp;quot; action=&amp;quot;ex_validacions.html&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label for=&amp;quot;nom&amp;quot;&amp;gt;Nom:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;nom&amp;quot; name=&amp;quot;nom&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_nom&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;cognoms&amp;quot;&amp;gt;Cognoms:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;cognoms&amp;quot; name=&amp;quot;cognoms&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_cognoms&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;email&amp;quot;&amp;gt;Email:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;email&amp;quot; name=&amp;quot;email&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_email&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;telefon&amp;quot;&amp;gt;Telefon:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;telefon&amp;quot; name=&amp;quot;telefon&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_telefon&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;data&amp;quot;&amp;gt;Data de naixement:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;data&amp;quot; name=&amp;quot;data&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_data&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;adreca&amp;quot;&amp;gt;Adreça:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;adreca&amp;quot; name=&amp;quot;adreca&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_adreca&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;cp&amp;quot;&amp;gt;Codi postal:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;cp&amp;quot; name=&amp;quot;cp&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_cp&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;municipi&amp;quot;&amp;gt;Municipi:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;municipi&amp;quot; name=&amp;quot;municipi&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_municipi&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body &amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function valida(){&lt;br /&gt;
&lt;br /&gt;
var nom=document.getElementById(&amp;quot;nom&amp;quot;).value;&lt;br /&gt;
var cognoms=document.getElementById(&amp;quot;cognoms&amp;quot;).value;&lt;br /&gt;
var email=document.getElementById(&amp;quot;email&amp;quot;).value;&lt;br /&gt;
var telefon=document.getElementById(&amp;quot;telefon&amp;quot;).value;&lt;br /&gt;
var data=document.getElementById(&amp;quot;data&amp;quot;).value;&lt;br /&gt;
var adreca=document.getElementById(&amp;quot;adreca&amp;quot;).value;&lt;br /&gt;
var cp=document.getElementById(&amp;quot;cp&amp;quot;).value;&lt;br /&gt;
var municipi=document.getElementById(&amp;quot;municipi&amp;quot;).value;&lt;br /&gt;
var patt_alfanumeric = /^[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ]+(\s[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ]+)*$/;&lt;br /&gt;
var patt_email = /^\w+@\w+\.\w+$/;&lt;br /&gt;
var patt_telefon =/^\d{9}$/;&lt;br /&gt;
var patt_data = /^\d{2}\/\d{2}\/\d{4}$/;&lt;br /&gt;
var patt_adreca = /^[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ\,\.\-]+(\s[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ\,\.\-]+)*$/;&lt;br /&gt;
var patt_cp=/^\d{5}$/;&lt;br /&gt;
&lt;br /&gt;
// reset format dels textbox i missatges d'error&lt;br /&gt;
document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//validació del nom&lt;br /&gt;
if(nom==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_alfanumeric.test(nom)) {&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació dels cognoms&lt;br /&gt;
if(cognoms==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_alfanumeric.test(cognoms)) {&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del email&lt;br /&gt;
if(email==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_email.test(email)) {&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (ex. usuari@servidor.xx)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del telefon&lt;br /&gt;
if(telefon==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_telefon.test(telefon)) {&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (6 digits)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació de la data&lt;br /&gt;
if(data==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_data.test(data)) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (dd/mm/aaaa)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var components_data = data.split(&amp;quot;/&amp;quot;);&lt;br /&gt;
var val_data=Date.parse(components_data[2]+&amp;quot;/&amp;quot;+components_data[1]+&amp;quot;/&amp;quot;+components_data[0]);&lt;br /&gt;
&lt;br /&gt;
if(isNaN(val_data)) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;data no vàlida&amp;quot;;&lt;br /&gt;
	return false;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var today=new Date();&lt;br /&gt;
if(val_data&amp;gt;=today) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;la data ha de ser anterior a la data acutal&amp;quot;;&lt;br /&gt;
	return false;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//validació de l'adreça&lt;br /&gt;
if(adreca==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_adreca.test(adreca)) {&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del codi postal&lt;br /&gt;
if(cp==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_cp.test(cp)) {&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (5 digits)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del municipi&lt;br /&gt;
if(municipi==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_adreca.test(municipi)) {&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return true;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
	&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
POSIBLE EJERCICIO&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tags = document.querySelectorAll('h1,h2,h3,h4,h5,h6,div,p');&lt;br /&gt;
for (var i = tags.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
  tags[i].style.outline = &amp;quot;1px solid green&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validar un camp de text Obligatori ===&lt;br /&gt;
Es tracta de forçar l'usuari a introduir un valor en un quadre de text o textarea en què sigui obligatori.Perquè es doni per completat un camp de text obligatori, es comprova que el valor introduït sigui vàlid, que el nombre de caràcters introduït sigui més gran que zero i que no s'hagin introduït només espais en blanc.  El text introduït tingui una longitud superior a zero caràcters, és a dir, que no sigui un text buit i per últim, el valor introduït per l'usuari no només estigui format per espais en blanc.&lt;br /&gt;
&lt;br /&gt;
:[[solució_valor_quadre_text]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un camp de text amb valors numèrics ===&lt;br /&gt;
Es tracta d'obligar l'usuari a introduir un valor numèric en un quadre de text.&lt;br /&gt;
:[[solucio_camp_text]]&lt;br /&gt;
&lt;br /&gt;
===  Validar que s'ha seleccionat una opció d'una llista ===&lt;br /&gt;
Es tracta d'obligar l'usuari a seleccionar un element d'una llista desplegable.&lt;br /&gt;
:[[solucio_llista]]&lt;br /&gt;
&lt;br /&gt;
=== Validar una adreça de correu electrònic ===&lt;br /&gt;
Es tracta d'obligar l'usuari a introduir una adreça de correu amb un format vàlid. Per tant, el que es comprova és que la direcció sembli vàlida, ja que no es comprova si es tracta d'un compte de correu electrònic real i operativa. La comprovació es realitza novament mitjançant les expressions regulars, ja que les adreces de correu electrònic vàlides poden ser molt diferents.&lt;br /&gt;
:[[solucio_correu_electronic]]&lt;br /&gt;
&lt;br /&gt;
=== Validar una data ===&lt;br /&gt;
Les dates solen ser els camps de formulari més complicats de validar per la multitud de formes diferents en què es poden introduir.&lt;br /&gt;
:[[solucio_dates]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un número de DNI ===&lt;br /&gt;
Es tracta de comprovar que el nombre proporcionat per l'usuari es correspon amb un nombre vàlid de document nacional d'identitat o DNI. Encara que per cada país o regió els requisits del document d'identitat de les persones poden variar, a continuació es mostra un exemple genèric fàcilment adaptable. La validació no només ha de comprovar que el nombre estigui format per vuit xifres i una lletra, sinó que també cal comprovar que la lletra indicada és correcta per al número introduït.&lt;br /&gt;
:[[solució_dni]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un número de telèfon ===&lt;br /&gt;
Els números de telèfon poden ser indicats de formes molt diferents: amb prefix nacional, amb prefix internacional, agrupat per parells, separant els números amb guions, etc.&lt;br /&gt;
:[[solucio_telefon]]&lt;br /&gt;
&lt;br /&gt;
=== Validar que un checkbox ha estat seleccionat ===&lt;br /&gt;
*a)Es tracta de validar si un element de tipus checkbox s'ha de seleccionar de forma obligatòria. &lt;br /&gt;
*b)Es tracta de validar si tots els checkbox del formulari han estat seleccionats.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_checkbox]]&lt;br /&gt;
&lt;br /&gt;
=== Validar que un radiobutton ha estat seleccionat ===&lt;br /&gt;
Encara que es tracta d'un cas similar al dels checkbox, la validació dels radiobutton presenta una diferència important: en general, la comprovació que es realitza és que l'usuari hagi seleccionat algun radiobutton dels que formen un determinat grup.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_radiobutton]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;JavaScript RegExp Reference: https://www.w3schools.com/jsref/jsref_obj_regexp.asp&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Experiments amb Expresions Regulars: http://www.regexplanet.com/advanced/javascript/index.html &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;John Resig, Bear Bibeault, &amp;quot;Secrets of the Javascript Ninja&amp;quot;, Manning Publications, 2012. ISBN 193398869X&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[http://librosweb.es/javascript/capitulo_7.html Introducció a Javascript] &amp;lt;/p&amp;gt; &amp;lt;p&amp;gt; [https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions Expressions Regulars a Mozilla]&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_Esdeveniments_i_Validacio_de_formularis&amp;diff=16997</id>
		<title>NF1 - Esdeveniments i Validacio de formularis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_Esdeveniments_i_Validacio_de_formularis&amp;diff=16997"/>
				<updated>2023-01-13T16:34:03Z</updated>
		
		<summary type="html">&lt;p&gt;Jcomas: /* event MOUSEOVER */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Esdeveniments =&lt;br /&gt;
Fins ara, totes les aplicacions i scripts que s'han creat tenen alguna cosa en comú: s'executen des de la primera instrucció fins a l'última de forma seqüencial. Gràcies a les estructures de control de flux (if, for, while) és possible modificar lleugerament aquest comportament i repetir alguns trossos del script i saltar-se altres trossos en funció d'algunes condicions.&lt;br /&gt;
&lt;br /&gt;
Aquest tipus d'aplicacions són poc útils, ja que no interactuen amb els usuaris i no poden respondre als diferents esdeveniments que es produeixen durant l'execució d'una aplicació. Afortunadament, les aplicacions web creades amb el llenguatge Javascript poden utilitzar el model de programació basada en esdeveniments.&lt;br /&gt;
&lt;br /&gt;
En aquest tipus de programació, els scripts es dediquen a esperar al fet que l'usuari &amp;quot;faci alguna cosa&amp;quot; (que premi una tecla, que mogui el ratolí, que tanqui la finestra del navegador). A continuació, el script respon a l'acció de l'usuari normalment processant aquesta informació i generant un resultat.&lt;br /&gt;
&lt;br /&gt;
Els esdeveniments fan possible que els usuaris transmetin informació als programes. Javascript defineix nombrosos esdeveniments que permeten una interacció completa entre l'usuari i les pàgines/aplicacions web. La pulsació d'una tecla constitueix un esdeveniment, així com punxar o moure el ratolí, seleccionar un element d'un formulari, redimensionar la finestra del navegador, etc.&lt;br /&gt;
&lt;br /&gt;
Javascript permet assignar una funció a cadascun dels esdeveniments. D'aquesta forma, quan es produeix qualsevol esdeveniment, Javascript executa la seva funció associada. Aquest tipus de funcions es denominen &amp;quot;event handlers&amp;quot; en anglès i solen traduir-se per &amp;quot;manegadors d'esdeveniments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Model bàsic d'esdeveniments ==&lt;br /&gt;
=== Tipus d'esdeveniments ===&lt;br /&gt;
En aquest model, cada element o etiqueta XHTML defineix la seva pròpia llista de possibles esdeveniments que se li poden assignar. Un mateix tipus d'esdeveniment (per exemple, clicar el botó esquerre del ratolí) pot estar definit per a diversos elements XHTML diferents i un mateix element XHTML pot tenir associats varis esdeveniments diferents.&lt;br /&gt;
&lt;br /&gt;
El nom de cada esdeveniment es construeix mitjançant el prefix ''on'', seguit del nom en anglès de l'acció associada a l'esdeveniment. Així, l'esdeveniment de punxar un element amb el ratolí es denomina ''onclick'' i l'esdeveniment associat a l'acció de moure el ratolí es denomina ''onmousemove''.&lt;br /&gt;
&lt;br /&gt;
La següent taula resumeix els esdeveniments més importants definits per Javascript:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Event&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Descripció&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Elements per els que está definit&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onblur&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deseleccionar l'element (el contrari de onfocus)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;button&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;label&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onchange&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Succeeix quan el valor del element ha canviat&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onclick&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;clicar i deixar anar el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;ondblclick&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;clicar dos vegades seguides amb el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onfocus&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Seleccionar un element&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;button&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;label&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;select&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeydown&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer una tecla (sense deixar-la anar)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeypress&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer una tecla&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onkeyup&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deixar anar una tecla premuda&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Elements de formulari i &amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onload&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;La pàgina s'ha carregat completament&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmousedown&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Prémer (sense deixar anar) un botn del ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmousemove&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Moure el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseout&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;El ratolí &amp;lt;em&amp;gt;&amp;quot;surt&amp;quot;&amp;lt;/em&amp;gt; de l'element (passa sobre un altre element)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseover&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;El ratoli &amp;lt;em&amp;gt;&amp;quot;entra&amp;quot;&amp;lt;/em&amp;gt; dintre de l'elemento (passa per sobre de l'element)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onmouseup&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Deixar anar el botó que estava premut en el ratolí&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tots els elements&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onreset&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Inicialitzar el formulari (esborrar totes les dades)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;form&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onresize&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;S'ha modificat la mida de la finestra del navegador&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onselect&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Seleccionar un text&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;input&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;textarea&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onsubmit&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Enviar el formulari&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;form&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;onunload&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;S'abandona la pàgina (per exemple al tancar el navegador)&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu veure tots el esdeveniments [[http://www.w3schools.com/jsref/dom_obj_event.asp aquí]]&lt;br /&gt;
&lt;br /&gt;
===Gestor  d'esdeveniments===&lt;br /&gt;
&lt;br /&gt;
Un esdeveniment de Javascript per si mateix manca d'utilitat. Perquè els esdeveniments resultin útils, s'han d'associar funcions o codi Javascript a cada esdeveniment. D'aquesta forma, quan es produeix un esdeveniment s'executa el codi indicat, per la qual cosa l'aplicació pot respondre davant qualsevol esdeveniment que es produeixi durant la seva execució.&lt;br /&gt;
&lt;br /&gt;
Les funcions o codi Javascript que es defineixen per a cada esdeveniment es denominen &amp;quot;manegador d'esdeveniments&amp;quot; i com Javascript és un llenguatge molt flexible, existeixen diverses formes diferents d'indicar els manegadors:&lt;br /&gt;
&lt;br /&gt;
*Manejadores com a atributs dels elements XHTML.&lt;br /&gt;
*Manejadores com a funcions Javascript externes.&lt;br /&gt;
*Manejadores &amp;quot;semàntics&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments com a atributs XHTML ====&lt;br /&gt;
&lt;br /&gt;
Es tracta del mètode més senzill i alhora menys professional d'indicar el codi Javascript que s'ha d'executar quan es produeixi un esdeveniment. En aquest cas, el codi s'inclou en un atribut del propi element XHTML. En el següent exemple, es vol mostrar un missatge quan l'usuari cliqui amb el ratolí sobre un botó:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquest mètode, es defineixen atributs XHTML amb el mateix nom que els esdeveniments que es volen manejar. L'exemple anterior només vol controlar l'esdeveniment de clicar amb el ratolí, el nom del qual és onclick. Així, l'element XHTML pel qual es vol definir aquest esdeveniment, ha d'incloure un atribut anomenat onclick.&lt;br /&gt;
&lt;br /&gt;
El contingut de l'atribut és una cadena de text que conté totes les instruccions Javascript que s'executen quan es produeix l'esdeveniment. En aquest cas, el codi Javascript és molt senzill (alert('Gràcies per clicar');), ja que solament es tracta de mostrar un missatge.&lt;br /&gt;
&lt;br /&gt;
En aquest altre exemple, quan l'usuari punxa sobre l'element &amp;lt;div&amp;gt; es mostra un missatge i quan l'usuari passa el ratolí per sobre de l'element, es mostra un altre missatge:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div onclick=&amp;quot;alert('Has clicat amb el ratolí');&amp;quot; onmouseover=&amp;quot;alert('Acabes de passar el ratolí per damunt');&amp;quot;&amp;gt;Ratolí&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pots clicar sobre aquest element o simplement passar el ratolí per damunt.&lt;br /&gt;
Aquest altre exemple inclou una de les instruccions més utilitzades en les aplicacions Javascript més antigues:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body onload=&amp;quot;alert(&amp;quot;La pàgina s'ha carregat completament &amp;quot;);&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior es mostra després que la pàgina s'hagi carregat completament, és a dir, després que s'hagi descarregat el seu codi HTML, les seves imatges i qualsevol altre objecte inclòs a la pàgina.&lt;br /&gt;
&lt;br /&gt;
L'esdeveniment onload és un dels més utilitzats ja que, com veurem en el capítol de DOM, les funcions que permeten accedir i manipular els nodes de l'arbre DOM solament estan disponibles quan la pàgina s'ha carregat completament.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments i variable this ====&lt;br /&gt;
&lt;br /&gt;
En els esdeveniments, es pot utilitzar la variable '''this''' per referir-se a l'element XHTML que ha provocat l'esdeveniment. Aquesta variable és molt útil per a exemples com el següent:&lt;br /&gt;
&lt;br /&gt;
Quan l'usuari passa el ratolí per sobre de el &amp;lt;div&amp;gt;, el color de la vora es mostra de color negre. Quan el ratolí surt de el &amp;lt;div&amp;gt;, es torna a mostrar la vora amb el color gris clar original.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Element &amp;lt;div&amp;gt; original:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si no s'utilitza la variable this, el codi necessari per modificar el color de les vores, seria el següent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;document.getElementById('continguts').style.borderColor='black';&amp;quot; onmouseout=&amp;quot;document.getElementById('continguts').style.borderColor='silver';&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codi anterior és massa llarg i massa propens a cometre errors. Dins del codi d'un esdeveniment, Javascript crea automàticament la variable this, que fa referència a l'element XHTML que ha provocat l'esdeveniment. Així, l'exemple anterior es pot reescriure de la següent manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;continguts&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;this.style.borderColor='black';&amp;quot; onmouseout=&amp;quot;this.style.borderColor='silver';&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codi anterior és molt més compacte, més fàcil de llegir i d'escriure i segueix funcionant correctament encara que es modifiqui el valor de l'atribut ''id'' de el &amp;lt; div &amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Gestor d'esdeveniments com a funcions externes ====&lt;br /&gt;
&lt;br /&gt;
La definició dels manegadores d'esdeveniments en els atributs XHTML és el mètode més senzill però menys aconsellable de tractar amb els esdeveniments en Javascript. El principal inconvenient és que es complica a l'excés quan s'afegeixen algunes poques instruccions, per la qual cosa solament és recomanable per als casos més senzills.&lt;br /&gt;
&lt;br /&gt;
Si es realitzen aplicacions complexes, com per exemple la validació d'un formulari, és aconsellable agrupar tot el codi Javascript en una funció externa i cridar a aquesta funció des de l'element XHTML.&lt;br /&gt;
&lt;br /&gt;
Seguint amb l'exemple anterior que mostra un missatge en clicar sobre un botó:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilitzant funcions externes es pot transformar en:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function mostraMissatge() {&lt;br /&gt;
  alert('Gràcies per clicar');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;mostraMissatge()&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquesta tècnica consisteix a extreure totes les instruccions de Javascript i agrupar-les en una funció externa. Una vegada definida la funció, en l'atribut de l'element XHTML s'inclou el nom de la funció, per indicar que és la funció que s'executa quan es produeix l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
La crida a la funció es realitza de la forma habitual, indicant el seu nom seguit dels parèntesis i de forma opcional, incloent tots els arguments i paràmetres que es necessitin.&lt;br /&gt;
&lt;br /&gt;
El principal inconvenient d'aquest mètode és que en les funcions externes no es pot seguir utilitzant la variable '''this''' i per tant, és necessari passar aquesta variable com a paràmetre a la funció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ressalta(element) {&lt;br /&gt;
	switch(element.style.borderColor) {&lt;br /&gt;
		case 'silver':&lt;br /&gt;
		case 'silver silver silver silver':&lt;br /&gt;
		case '#c0c0c0':&lt;br /&gt;
			element.style.borderColor = 'black';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'black':&lt;br /&gt;
		case 'black black black black':&lt;br /&gt;
		case '#000000':&lt;br /&gt;
			element.style.borderColor = 'silver';&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot; onmouseover=&amp;quot;ressalta(this)&amp;quot; onmouseout=&amp;quot;ressalta(this)&amp;quot;&amp;gt;&lt;br /&gt;
Secció de continguts...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En l'exemple anterior, la funció externa és cridada amb el paràmetre ''this'', que dins de la funció es denomina element. La complexitat de l'exemple es produeix sobretot per la forma en la qual els diferents navegadors emmagatzemen el valor de la propietat *&lt;br /&gt;
''borderColor''.&lt;br /&gt;
&lt;br /&gt;
Mentre que Firefox emmagatzema (en cas que les quatre vores coincideixin en color) el valor ''black'', Internet Explorer ho emmagatzema com ''black black black black'' i Opera emmagatzema la seva representació hexadecimal ''#000000''.&lt;br /&gt;
&lt;br /&gt;
====Gestor d'esdeveniments semàntics====&lt;br /&gt;
Els mètodes que s'han vist per afegir manejadores d'esdeveniments (com a atributs XHTML i com a funcions externes) tenen un greu inconvenient: &amp;quot;embruten&amp;quot; el codi XHTML de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Com és conegut, una de les bones pràctiques bàsiques en el disseny de pàgines i aplicacions web és la separació dels continguts (XHTML) i el seu aspecte o presentació (CSS). Sempre que sigui possible, també es recomana separar els continguts (XHTML) i el seu comportament o programació (Javascript).&lt;br /&gt;
&lt;br /&gt;
Barrejar el codi Javascript amb els elements XHTML solament contribueix a complicar el codi font de la pàgina, a dificultar la modificació i manteniment de la pàgina i a reduir la semàntica del document final produït.&lt;br /&gt;
&lt;br /&gt;
Afortunadament, existeix un mètode alternatiu per definir els manegadores d'esdeveniments de Javascript. Aquesta tècnica és una evolució del mètode de les funcions externes, ja que es basa a utilitzar les propietats DOM dels elements XHTML per assignar totes les funcions externes que actuen de manejadores d'esdeveniments. Així, el següent exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input id=&amp;quot;clica&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; onclick=&amp;quot;alert('Gràcies per clicar');&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Es pot transformar en:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Funció externa&lt;br /&gt;
function mostraMissatge() {&lt;br /&gt;
alert('Gràcies per clicar');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Assignar la funció externa a l'element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&lt;br /&gt;
// Element XHTML&lt;br /&gt;
&amp;lt;input id=&amp;quot;clica&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;Clica i veuràs&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tècnica dels manegadores semàntics consisteix en:&lt;br /&gt;
&lt;br /&gt;
*Assignar un identificador únic a l'element XHTML mitjançant l'atribut ''id''.&lt;br /&gt;
*Crear una funció de Javascript encarregada de manejar l'esdeveniment.&lt;br /&gt;
*Assignar la funció externa a l'esdeveniment corresponent en l'element desitjat.&lt;br /&gt;
*L'últim pas és la clau d'aquesta tècnica. En primer lloc, s'obté l'element al que es desitja associar la funció externa:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A continuació, s'utilitza una propietat de l'element amb el mateix nom que l'esdeveniment que es vol manejar. En aquest cas, la propietat és ''onclick'':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'assigna la funció externa mitjançant el seu nom sense parèntesi. El més important (i la causa més comuna d'errors) és indicar solament el nom de la funció, és a dir, prescindir dels parèntesis en assignar la funció:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'afegeixen els parèntesis després del nom de la funció, en realitat s'està executant la funció i guardant el valor retornat per la funció en la propietat onclick d'element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Assignar una funció externa a un esdeveniment d'un element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge;&lt;br /&gt;
&lt;br /&gt;
// Executar una funció i guardar el seu resultat en una propietat d'un element&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = mostraMissatge();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El gran avantatge d'aquest mètode és que el codi XHTML resultant és molt &amp;quot;net&amp;quot;, ja que no es barreja amb el codi Javascript. A més, dins de les funcions externes assignades sí que es pot utilitzar la variable '''this''' per referir-se a l'element que provoca l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
L'únic inconvenient d'aquest mètode és que la pàgina s'ha de carregar completament abans que es puguin utilitzar les funcions DOM que assignen els manegadors als elements XHTML. Una de les formes més senzilles d'assegurar que cert codi es va a executar després que la pàgina es carregui per complet és utilitzar l'esdeveniment '''onload''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
document.getElementById(&amp;quot;clica&amp;quot;).onclick = muestraMensaje;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gestor d'esdeveniments amb DOM====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El mètode addEventListener ens permet incloure un gestor d'esdeveniment. La sintaxi de addEventListener és la següent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
element_que_escolta.addEventListener('event',funció_a_llançar, booleà);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''element_que_escolta'' - és qualsevol element present en un document al qual es vol associar l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
''esdeveniment'' - és el succés ocorregut sobre l'element (clic, load, ...).&lt;br /&gt;
&lt;br /&gt;
''funció_a_llançar'' - és qualsevol funció definida que vulguem que s'executi quan passi l'esdeveniment.&lt;br /&gt;
&lt;br /&gt;
''booleà'' - és un valor que defineix l'ordre del flux d'esdeveniments.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si es vol escoltar un esdeveniment només una vegada i després eliminar-ho s'ha d'utilitzar el mètode removeEventListener:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
element_que_escolta.removeEventListener ('esdeveniment',funció_a_llançar, booleà);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTA 1:'' Explicació del paràmetre booleà del mètode addEventListener amb un exemple.&lt;br /&gt;
Suposem que tenim això:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Exemple de fluix events&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div onclick=&amp;quot;processaEvent()&amp;quot;&amp;gt;Clica aqui&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quan fem clic al div no només ho estem fent sobre ell, sinó sobre els elements que el contenen en l'arbre del DOM, és a dir, hem fet clic a més sobre l'element html i sobre l'element body. Sí només hi ha una funció assignada a una escolta per al div no hi ha major problema, però si a més hi ha una per al html i una altra per al body, quin és l'ordre en què s'han de llançar les tres funcions?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per contestar a aquesta pregunta hi ha un model de comportament, el flux d'esdeveniments (anglès). Segons aquest, quan es fa clic sobre un element, l'esdeveniment es propaga en dues fases, una que és la captura -el esdeveniment comença en el nivell superior del document i recorre els elements de pares a fills- i l'altra la bombolla -el ordre invers, ascendint de fills a pares-.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un cop vist això, podem comprendre el tercer paràmetre de addEventListener, que el que fa és permetre'ns escollir l'ordre de propagació:&lt;br /&gt;
&lt;br /&gt;
'''true''': El flux d'esdeveniments és com el representat, i la fase de captura passa en llançar l'esdeveniment. L'ordre de propagació per l'exemple seria, per tant, l'indicat, ''html-body-div.''&lt;br /&gt;
&lt;br /&gt;
'''false''': Permet saltar la fase de captura, i la propagació seguiria només la bombolla. Així, l'ordre seria ''div-body-html.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTA 2:'' A internet explorer no funciona en les versions anteriors a la 7 (inclosa).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        function alerta(){&lt;br /&gt;
            alert(this);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        window.onload = function (){&lt;br /&gt;
            var elBody = document.getElementsByTagName('body')[0];&lt;br /&gt;
            var elDiv = document.getElementById('elDiv');&lt;br /&gt;
            var elButton = document.getElementById('elButton');&lt;br /&gt;
         &lt;br /&gt;
            elBody.addEventListener('click',alerta,false);&lt;br /&gt;
            elDiv.addEventListener('click',alerta,false);&lt;br /&gt;
            elButton.addEventListener('click',alerta,false);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//event.stopPropagation();   //evita propagarse el evento en forma de burbuja&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body id=&amp;quot;body&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;elDiv&amp;quot;&amp;gt;Clica aqui&lt;br /&gt;
          &amp;lt;button id=&amp;quot;elButton&amp;quot;&amp;gt;boton&amp;lt;/button&amp;gt;&lt;br /&gt;
     &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemple d'utilització manejadores d'esdeveniments amb DOM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function muestraMensaje() {&lt;br /&gt;
  				console.log(&amp;quot;Has pulsado el ratón&amp;quot;);&lt;br /&gt;
  				elDiv.removeEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);  // borra el evento asociado de tipo click a ese elemento.&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			var elDiv = document.getElementById(&amp;quot;div_principal&amp;quot;);&lt;br /&gt;
			elDiv.addEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
En el caso que no queramos que se aplique el evento de tipo de Submit o Hipervínculo &amp;quot;&amp;lt;a&amp;gt;&amp;lt;/a&amp;gt;&amp;quot; al ser botón usaremos &amp;quot;e.preventDefault()&amp;quot; y realizará las acciones que tengamos establecidas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
window.addEventListener(&amp;quot;load&amp;quot;,ejemplo); // window.onload= ejemplo;&lt;br /&gt;
&lt;br /&gt;
	function ejemplo(){&lt;br /&gt;
			function muestraMensaje(e) {&lt;br /&gt;
  				console.log(&amp;quot;Has pulsado el ratón&amp;quot;);&lt;br /&gt;
                                e.preventDefault();  //evita que se ejecute el submit y recargue la página&lt;br /&gt;
			}&lt;br /&gt;
         document.getElementById(&amp;quot;boton&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, muestraMensaje, false);&lt;br /&gt;
	}      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;./index.html&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;input type=&amp;quot;submit&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;boton&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En el següent exemple, s'afegeixen esdeveniments als elements de tipus ''input=text'' d'un formulari complex:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form id=&amp;quot;formulario&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;holaa&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    function resalta() {&lt;br /&gt;
        console.log(&amp;quot;holaa&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    window.onload = function() {&lt;br /&gt;
        var formulario = document.getElementById(&amp;quot;formulario&amp;quot;);&lt;br /&gt;
        var camposInput = formulario.getElementsByTagName(&amp;quot;input&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        for(var i=0; i&amp;lt;camposInput.length; i++) {&lt;br /&gt;
            if(camposInput[i].type == &amp;quot;text&amp;quot;) {&lt;br /&gt;
                camposInput[i].onclick = resalta;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Alert ===&lt;br /&gt;
Volem provar els events de la pàgina, per fer-ho posa un alert amb un missatge en els següents casos:&lt;br /&gt;
* Al carregar-se completament la pàgina.&lt;br /&gt;
* Al clicar en un botó&lt;br /&gt;
* Al passar damunt d'un paràgraf&lt;br /&gt;
* Al passar damunt d'una imatge&lt;br /&gt;
* Al sortir del damunt d'una imatge&lt;br /&gt;
* Al clicar en un enllaç&lt;br /&gt;
&lt;br /&gt;
:[[Exercici1 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Desplegable ===&lt;br /&gt;
Es vol disposar de un menu desplegable on cada element del desplegable sigui el nom de la pàgina a la cual fa referència. Quan es seleccioni una entrada del desplegable, el navegador canvia la seva url per la del desplegable.&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 2 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Rollover ===&lt;br /&gt;
Un intercanvi d'imatge és una cosa grandiosa. L'usuari aproxima el punter del ratolí a una imatge i aquesta canvia a una altre imatge. Quan l'usuari abandona la imatge, torna a canviar a la imatge anterior. &lt;br /&gt;
Fes un programa amb javascript que reprodueixi el comportament anterior.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 3 Events]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Mostrar / Ocultar text ===&lt;br /&gt;
Donada la següent pàgina&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	function muestraOculta() {&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_1&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_1&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_2&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_2&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p id=&amp;quot;contenidos_3&amp;quot;&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed mattis enim vitae orci. Phasellus libero. Maecenas nisl arcu, consequat congue, commodo nec, commodo ultricies, turpis. Quisque sapien nunc, posuere vitae, rutrum et, luctus at, pede. Pellentesque massa ante, ornare id, aliquam vitae, ultrices porttitor, pede. Nullam sit amet nisl elementum elit convallis malesuada. Phasellus magna sem, semper quis, faucibus ut, rhoncus non, mi. Duis pellentesque, felis eu adipiscing ullamcorper, odio urna consequat arcu, at posuere ante quam non dolor. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis scelerisque.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;a id=&amp;quot;enlace_3&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Ocultar contenidos&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Realitza els següents apartats:&lt;br /&gt;
*Quan es cliqui sobre el primer enllaç, s'oculti la seva secció relacionada&lt;br /&gt;
*Quan es torni a clicar sobre el mateix enllaç, es mostri una altra vegada aquesta secció de continguts&lt;br /&gt;
*Completar la resta d'enllaços de la pàgina perquè el seu comportament sigui idèntic al del primer enllaç&lt;br /&gt;
*Quan una secció s'oculti, ha de canviar el missatge de l'enllaç associat (pista: propietat innerHTML)&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 4 Events]]&lt;br /&gt;
&lt;br /&gt;
== Obtenint informació de l'esdeveniment (objecte event)==&lt;br /&gt;
Normalment, els manegadors d'esdeveniments requereixen informació addicional per processar les seves tasques. Si una funció per exemple s'encarrega de processar l'esdeveniment onclick, potser necessiti saber que posició estava el ratolí en el moment de punxar el botó.&lt;br /&gt;
&lt;br /&gt;
No obstant això, el cas més habitual en el qual és necessari conèixer informació addicional sobre l'esdeveniment és el dels esdeveniments associats al teclat. Normalment, és molt important conèixer la tecla que s'ha premut, per exemple per diferenciar les tecles normals de les tecles especials (ENTER, tabulador, Alt, Ctrl., etc.).&lt;br /&gt;
&lt;br /&gt;
Javascript permet obtenir informació sobre el ratolí i el teclat mitjançant un objecte especial anomenat ''event''. Desafortunadament, els diferents navegadors presenten diferències molt notables en el tractament de la informació sobre els esdeveniments.&lt;br /&gt;
&lt;br /&gt;
La principal diferència resideix en la forma en la qual s'obté l'objecte event. Internet Explorer considera que aquest objecte forma part de l'objecte window i la resta de navegadors ho consideren com l'únic argument que tenen les funcions manejadoras d'esdeveniments.&lt;br /&gt;
&lt;br /&gt;
Encara que és un comportament que resulta molt estrany al principi, tots els navegadors moderns excepte Internet Explorer creen màgicament i de forma automàtica un argument que es passa a la funció manegadora, per la qual cosa no és necessari incloure-ho en la trucada a la funció manegadora. D'aquesta forma, per utilitzar aquest &amp;quot;argument màgic&amp;quot;, només és necessari assignar-li un nom, ja que els navegadors ho creen automàticament.&lt;br /&gt;
&lt;br /&gt;
En resum, en els navegadors tipus Internet Explorer, l'objecte event s'obté directament mitjançant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var esdeveniment = window.event;&lt;br /&gt;
D'altra banda, en la resta de navegadors, l'objecte event s'obté màgicament a partir de l'argument que el navegador crea automàticament:&lt;br /&gt;
&lt;br /&gt;
function manejadorEventos(elEvento) {&lt;br /&gt;
var esdeveniment = elEvento;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si es vol programar una aplicació que funcioni correctament en tots els navegadors, és necessari obtenir l'objecte event de forma correcta segons cada navegador. El següent codi mostra la forma correcta d'obtenir l'objecte event en qualsevol navegador:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function manejadorEventos(elEvento) {&lt;br /&gt;
var esdeveniment = elEvento || window.event;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una vegada obtingut l'objecte event, ja es pot accedir a tota la informació relacionada amb l'esdeveniment, que depèn del tipus d'esdeveniment produït.&lt;br /&gt;
&lt;br /&gt;
=== Informació sobre l'esdeveniment ===&lt;br /&gt;
La propietat '''type''' indica el tipus d'esdeveniment produït, la qual cosa és útil quan una mateixa funció s'utilitza per manejar diversos esdeveniments:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var tipus = esdeveniment.type;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La propietat type retorna el tipus d'esdeveniment produït, que és igual al nom de l'esdeveniment però sense el prefix '''on'''.&lt;br /&gt;
&lt;br /&gt;
Mitjançant aquesta propietat, es pot refer de forma més senzilla l'exemple anterior en el qual es ressaltava una secció de continguts en passar el ratolí per damunt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ressalta(elEvento) {&lt;br /&gt;
    var esdeveniment = elEvento || window.event;&lt;br /&gt;
    switch(esdeveniment.type) {&lt;br /&gt;
         case 'mouseover':&lt;br /&gt;
               this.style.borderColor = 'black';&lt;br /&gt;
               break;&lt;br /&gt;
         case 'mouseout':&lt;br /&gt;
               this.style.borderColor = 'silver';&lt;br /&gt;
               break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
       document.getElementById(&amp;quot;seccion&amp;quot;).onmouseover = ressalta;&lt;br /&gt;
       document.getElementById(&amp;quot;seccion&amp;quot;).onmouseout = ressalta;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;div id=&amp;quot;seccion&amp;quot; style=&amp;quot;width:150px; height:60px; border:thin solid silver&amp;quot;&amp;gt;&lt;br /&gt;
  Secció de continguts...&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Informació sobre els esdeveniments de teclat ===&lt;br /&gt;
De tots els esdeveniments disponibles en Javascript, els esdeveniments relacionats amb el teclat són els més incompatibles entre diferents navegadors i per tant, els més difícils de manegar. En primer lloc, existeixen moltes diferències entre els navegadors, els teclats i els sistemes operatius dels usuaris, principalment a causa de les diferències entre idiomes.&lt;br /&gt;
&lt;br /&gt;
A més, existeixen tres esdeveniments diferents per a les pulsacions de les tecles ('''onkeyup''', '''onkeypress''' i '''onkeydown'''). Finalment, existeixen dos tipus de tecles: les tecles normals (com a lletres, nombres i símbols normals) i les tecles especials (com ENTER, Alt, Shift, etc.)&lt;br /&gt;
&lt;br /&gt;
Quan un usuari prem una tecla normal, es produeixen tres esdeveniments seguits i en aquest ordre: &lt;br /&gt;
*'''onkeydown''', &lt;br /&gt;
*'''onkeypress''' i &lt;br /&gt;
*'''onkeyup'''. &lt;br /&gt;
L'esdeveniment '''onkeydown''' es correspon amb el fet de prémer una tecla i no deixar-la anar; l'esdeveniment '''onkeypress''' és la pròpia pulsació de la tecla i l'esdeveniment '''onkeyup''' fa referència al fet de deixar anar una tecla que estava premuda.&lt;br /&gt;
&lt;br /&gt;
La forma més senzilla d'obtenir la informació sobre la tecla que s'ha premut és mitjançant l'esdeveniment '''onkeypress'''. La informació que proporcionen els esdeveniments '''onkeydown''' i '''onkeyup''' es pot considerar com més tècnica, ja que retornen el ''codi intern'' de cada tecla i no el caràcter que s'ha premut.&lt;br /&gt;
&lt;br /&gt;
A continuació s'inclou una llista amb totes les propietats diferents de tots els esdeveniments de teclat tant en Internet Explorer com en la resta de navegadors:&lt;br /&gt;
&lt;br /&gt;
*Esdeveniment keydown:&lt;br /&gt;
**Mateix comportament en tots els navegadors:&lt;br /&gt;
***Propietat keyCode: codi intern de la tecla&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
*Esdeveniment keypress:&lt;br /&gt;
**Internet Explorer:&lt;br /&gt;
***Propietat keyCode: el codi del caràcter de la tecla que s'ha premut&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
**Resta de navegadors:&lt;br /&gt;
**Propietat keyCode: per a les tecles normals, no definit. Per a les tecles especials, el codi intern de la tecla.&lt;br /&gt;
**Propietat charCode: per a les tecles normals, el codi del caràcter de la tecla que s'ha premut. Per a les tecles especials, 0.&lt;br /&gt;
*Esdeveniment keyup:&lt;br /&gt;
**Mateix comportament en tots els navegadors:&lt;br /&gt;
***Propietat keyCode: codi intern de la tecla&lt;br /&gt;
***Propietat charCode: no definit&lt;br /&gt;
Per convertir el codi d'un caràcter (no confondre amb el codi intern) al caràcter que representa la tecla que s'ha premut, s'utilitza la funció ''String.fromCharCode().''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    window.onkeydown = teclado;&lt;br /&gt;
    window.onkeypress = teclado;&lt;br /&gt;
    window.onkeyup = teclado;&lt;br /&gt;
&lt;br /&gt;
    function teclado(magica) {&lt;br /&gt;
        var e = magica || window.event; // para salvar las deficiencias de IE=window.event&lt;br /&gt;
        mostrar(e.type, e.keyCode, e.which, e.charCode, e.key);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function mostrar(evento, keyCode, which, charCode, key) {&lt;br /&gt;
      &lt;br /&gt;
        let cadena =  &amp;quot;&amp;lt;b&amp;gt; Evento: &amp;lt;/b&amp;gt;&amp;quot; + evento &lt;br /&gt;
                     + &amp;quot; ==&amp;gt; &amp;lt;b&amp;gt; keyCode: &amp;lt;/b&amp;gt;&amp;quot; + keyCode &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; which: &amp;lt;/b&amp;gt;&amp;quot; + which &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; charCode: &amp;lt;/b&amp;gt;&amp;quot;+ charCode &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; key: &amp;lt;/b&amp;gt;&amp;quot;+ key &lt;br /&gt;
                     + &amp;quot;&amp;lt;b&amp;gt; FromCharCode: &amp;lt;/b&amp;gt;&amp;quot;+String.fromCharCode(charCode)+&amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         let info = document.getElementById(&amp;quot;info&amp;quot;); //display&lt;br /&gt;
         info.innerHTML += cadena&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;info&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://sospedia.net/pinchar-el-teclado-en-javascript/&lt;br /&gt;
&lt;br /&gt;
https://www.w3.org/2002/09/tests/keys-cancel2.html&lt;br /&gt;
&lt;br /&gt;
==== Exercici Teclat ====&lt;br /&gt;
Crea un script que mostri per pantalla la següent informació cada vedada que es premi una tecla:&lt;br /&gt;
* Caràcter permut  (amb key i StringCharCode)&lt;br /&gt;
* Tipus event (keydown, keypress, keyup)&lt;br /&gt;
* Propietat keycode&lt;br /&gt;
* Propietat charcode&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 5 events]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== informació sobre els esdeveniments de ratolí ===&lt;br /&gt;
La informació més rellevant sobre els esdeveniments relacionats amb el ratolí és la de les coordenades de la posició del punter del ratolí. Encara que l'origen de les coordenades sempre es troba en la cantonada superior esquerra, el punt que es pren com a referència de les coordenades pot variar.&lt;br /&gt;
&lt;br /&gt;
D'aquesta forma, és possible obtenir la posició del ratolí respecte de la pantalla de l'ordinador, respecte de la finestra del navegador i respecte de la pròpia pàgina HTML (que s'utilitza quan l'usuari ha fet scroll sobre la pàgina). Les coordenades més senzilles són les que es refereixen a la posició del punter respecte de la finestra del navegador, que s'obtenen mitjançant les propietats clientX i clientY:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function muestraInformacion(elEvento) {&lt;br /&gt;
   var esdeveniment = elEvento || window.event;&lt;br /&gt;
   var coordenadaX = esdeveniment.clientX;&lt;br /&gt;
   var coordenadaY = esdeveniment.clientY;&lt;br /&gt;
   alert(&amp;quot;Has premut el ratolí en la posició: &amp;quot; + coordenadaX + &amp;quot;, &amp;quot; + coordenadaY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.onclick = muestraInformacion;&lt;br /&gt;
//document.addeventlistener(click,&amp;quot;muestraInformacion&amp;quot;,false);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les coordenades de la posició del punter del ratolí respecte de la pantalla completa de l'ordinador de l'usuari s'obtenen de la mateixa forma, mitjançant les propietats '''screenX''' i '''screenY''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var coordenadaX = esdeveniment.screenX;&lt;br /&gt;
var coordenadaY = esdeveniment.screenY;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En moltes ocasions, és necessari obtenir un altre parell de coordenades diferents: les que corresponen a la posició del ratolí respecte de l'origen de la pàgina. Aquestes coordenades no sempre coincideixen amb les coordenades respecte de l'origen de la finestra del navegador, ja que l'usuari pot fer scroll sobre la pàgina web. Internet Explorer no proporciona aquestes coordenades de forma directa, mentre que la resta de navegadors sí que ho fan. D'aquesta forma, és necessari detectar si el navegador és de tipus Internet Explorer i en cas afirmatiu realitzar un càlcul senzill:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Detectar si el navegador és Internet Explorer&lt;br /&gt;
var ie = navigator.userAgent.toLowerCase().indexOf('msie')!=-1;&lt;br /&gt;
&lt;br /&gt;
if(ie) {&lt;br /&gt;
     coordenadaX = esdeveniment.clientX + document.body.scrollLeft;&lt;br /&gt;
     coordenadaY = esdeveniment.clientY + document.body.scrollTop;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
     coordenadaX = esdeveniment.pageX;&lt;br /&gt;
     coordenadaY = esdeveniment.pageY;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;Has premut el ratolí en la posició: &amp;quot; + coordenadaX + &amp;quot;, &amp;quot; + coordenadaY + &amp;quot; respecte de la pàgina web&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La variable '''ie''' val '''true''' si el navegador en el qual s'executa el script és de tipus Internet Explorer (qualsevol versió) i val '''false''' en un altre cas. Per a la resta de navegadors, les coordenades respecte de l'origen de la pàgina s'obtenen mitjançant les propietats '''pageX''' i '''pageY'''. En el cas d'Internet Explorer, s'obtenen sumant la posició respecte de la finestra del navegador (clientX, clientY) i el desplaçament que ha sofert la pàgina (document.bodi.scrollLeft, document.bodi.scrollTop).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Client_page_screen.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gràfics senzills amb canvas ===&lt;br /&gt;
Amb els esdeveniments de teclat i ratolí podrem programar jocs senzills. Només ens caldrà saber com situar i moure gràfics per la pantalla. Amb aquesta finalitat ens serà d'ajuda l'ús de l'element '''canvas''' de HTML.&lt;br /&gt;
&lt;br /&gt;
Al següent exemple definim un canvas (llenç) de 800x600 píxels i hi situem la imatge d'un cotxe a la coordenada (400,300). &lt;br /&gt;
&amp;lt;source lang=&amp;quot;HTML&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;canvas id=&amp;quot;myCanvas&amp;quot; width=&amp;quot;800&amp;quot; height=&amp;quot;600&amp;quot; style=&amp;quot;background-color: lightskyblue;&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img id=&amp;quot;cotxe&amp;quot; src=&amp;quot;cotxe.jpg&amp;quot; style=&amp;quot;display: none;&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var canvas;&lt;br /&gt;
var ctx;&lt;br /&gt;
var imatge;&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
         canvas= document.getElementById(&amp;quot;myCanvas&amp;quot;);&lt;br /&gt;
         ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
         imatge=document.getElementById(&amp;quot;cotxe&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ctx.drawImage(imatge,400,300);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si volem simular el moviment de la imatge haurem l'haurem d'esborrar de la posició antiga i tornar-la a dibuixar a la nova posició. Per borrar la imatge podem dibuixar un rectangle del color de fons del canvas sobre la imatge amb les instruccions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
ctx.fillStyle = &amp;quot;lightskyblue&amp;quot;&lt;br /&gt;
ctx.fillRect(0,300,100,66);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'exemple dibuixem al canvas un triangle de color lightskyblue a la coordenada (0,300) i de dimensions 100x66.&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Coordenades del punter ===&lt;br /&gt;
Crea una pàgina on es mostri constantment les coordenades del punter dins de la pàgina (propietats clientX, clientY).&lt;br /&gt;
&lt;br /&gt;
=== event MOUSEOVER ===&lt;br /&gt;
Crea una pàgina de contingut lliure que tingui els següents elements:&lt;br /&gt;
*Títol (capçalera H1)&lt;br /&gt;
*Tres paràgrafs que continguin una imatge alineada a la dreta o a l'esquerra del text. La longitud del text de cada paràgraf serà prou extensa per a superar l'alçada de la imatge respectiva.&lt;br /&gt;
*Tres títols (capçalera H2) que precediran cadascun dels paràgrafs.&lt;br /&gt;
Programa les respostes als events MOUSEOVER de cada element de forma que:&lt;br /&gt;
*tots els elements de text (quatre capçaleres i tres paràgrafs) canviin de format quan tenen el punter del ratolí al damunt. Cada element de text tornarà al seu format original quan el punter ja no sigui al damunt&lt;br /&gt;
*les imatges giraran en sentit horari quan tinguin el punter al damunt i deixaran de fer-ho quan el punter ja no sigui al damunt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Fitxer:Gamepad.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
Dibuixa un rectangle i que es mova en funció del joystick, i mostre per pantalla els diferents botons.&lt;br /&gt;
 &lt;br /&gt;
http://html5gamepad.com&lt;br /&gt;
&lt;br /&gt;
:[[ejm_gamepad]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ratolí i Teclat ===&lt;br /&gt;
a) Es vol que el ratolí, en qualsevol punt de la finestra del navegador, es mostri la posició del punter respecte del navegador i respecte de la pàgina.&lt;br /&gt;
[[Fitxer:ex_ratoli.gif|100px]]&lt;br /&gt;
&lt;br /&gt;
b) Es vol que, a més a més, en prémer qualsevol tecla, el missatge mostrat ha de canviar per indicar el nou esdeveniment i la seva informació associada.&lt;br /&gt;
[[Fitxer:ex_teclat.gif|100px]]&lt;br /&gt;
&lt;br /&gt;
c)Afegir la següent característica al script: quan es prem un botó del ratolí, el color de fons del quadre de missatge ha de ser groc (#FFFFCC) i quan es prem una tecla, el color de fons ha de ser blau (#CCE6FF). En tornar a moure el ratolí, el color de fons torna a ser blanc.&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fitxer:ex_tec_rat_color.gif|200px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 6 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Posició ratolí ===&lt;br /&gt;
Crear un script que informi a l'usuari en què zona de la pantalla ha premut el ratolí. Les zones definides són les següents: esquerra a dalt, esquerra a baix, dreta a dalt i dreta a baix.&lt;br /&gt;
&lt;br /&gt;
:[[Exercici 7 Events]]&lt;br /&gt;
&lt;br /&gt;
=== Estrella Michelin ===&lt;br /&gt;
&lt;br /&gt;
Un restaurant té 4 tapes principals on cadascuna té un preu  1 €, 2 €, 3 € i 4 € (esquerra a dreta). &lt;br /&gt;
&lt;br /&gt;
Com el local és petit, es disposa de dos cambrers, cadascun d'ells té un botó que l'executarà en el cas de servir una tapa. Quan un cambrer serveixi una tapa haurà:&lt;br /&gt;
*1. Primer seleccionar-se amb el botó&lt;br /&gt;
*2. Clicar a la tapa o tapes servides.&lt;br /&gt;
&lt;br /&gt;
Cada vegada que el cambrer faci click a una tapa el seu preu s'incrementarà en la recaudació del cambrer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Michelin.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
:[[solucio michelin]]&lt;br /&gt;
&lt;br /&gt;
===Cuadrat===&lt;br /&gt;
&lt;br /&gt;
Es desitja que un cuadrat es mova al llarg de la pantalla&lt;br /&gt;
&lt;br /&gt;
:[[sol_cuadrat]]&lt;br /&gt;
&lt;br /&gt;
=== Joc Tenis ===&lt;br /&gt;
Es tracta de implementar en Javascript un dels 1ers jocs que es va inventar per a PC. El joc del Tenis. &lt;br /&gt;
[[Fitxer:tenis.png|400px|center]]&lt;br /&gt;
Per començar el joc s'ha de pulsar la tecla 'S', per parar 'P' i per reinicializar la 'R'.&lt;br /&gt;
&lt;br /&gt;
Jugador 1:&lt;br /&gt;
*Utilitza el ratolí per el desplaçament de la raqueta&lt;br /&gt;
Jugador 2:&lt;br /&gt;
*tecla '↑' per desplaçar la raqueta cap a dalt&lt;br /&gt;
*tecla '↓' per desplaçar la raqueta cap a baix&lt;br /&gt;
Altres aspectes del joc&lt;br /&gt;
*A més a més, hi ha un marcador que indiqui qui va guanyant.&lt;br /&gt;
*També hi ha un botó, per exemple F2, per augmentar el número de pilotes&lt;br /&gt;
*També hi ha un botó per canviar els colors del joc. Pot existir diversos temes (F5-F8)&lt;br /&gt;
&lt;br /&gt;
https://www.w3schools.com/html/html5_draganddrop.asp&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Expressions Regulars =&lt;br /&gt;
Les expressions regulars son una necessitat a l'hora de validar formularis. Alguns problemes de validació no es podrien solucionar de una manera elegant sense elles.&lt;br /&gt;
Les expressions regulars son senzillament una manera d'expresar un patró per a cadenes coincidents de text. La expressions contenen termes i operadors que ens pemeten definir els patrons.&lt;br /&gt;
&lt;br /&gt;
== Creació d'expresions regulars ==&lt;br /&gt;
A Javascript, com succeeix amb la majoria d'objectes, existeixen dos formes de crear expresions regulars: &lt;br /&gt;
*mitjançant un literal&lt;br /&gt;
*creant una instància d'un objecte de tipus '''RegExp'''&lt;br /&gt;
&lt;br /&gt;
La creació d'una expressió regular amb un literal és molt sezill. Veïem un exemple. Volem crear una expressió regular que coincideixi exactament amb el string &amp;quot;test&amp;quot;:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = /test/;&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
Les expresions regulars van envoltades del caràctes /. Igual que els String van envoltades del caràcter &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
També podíem haver creat una instància del objecte RegExp de la següent manera:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = new RegExp(&amp;quot;test&amp;quot;);&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificadors ha utilitzar a l'hora de crear expressions regulars ==&lt;br /&gt;
A més a més de la propia expressió regular, podem introduïr els següents modificadors:&lt;br /&gt;
*''i'': Fa que no distingeixi de majúscules i minúscules. ex: /test/i&lt;br /&gt;
*''g'': Realitza una comparació global, en comptes de parar-se després de la primera coincidència.&lt;br /&gt;
*''m'': Realitza una comparació multilínia (més detalls a https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/multiline )&lt;br /&gt;
Exemple d'ús:&lt;br /&gt;
&amp;lt;source type=java&amp;gt;&lt;br /&gt;
var pattern = /test/ig&lt;br /&gt;
var pattern2 = new RegExp(&amp;quot;test&amp;quot;,&amp;quot;ig&amp;quot;);&lt;br /&gt;
//exemple d'us de la expressió regular&lt;br /&gt;
alert(pattern.test(&amp;quot;test&amp;quot;));&lt;br /&gt;
alert(pattern2.test(&amp;quot;test&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termes i Operadors ==&lt;br /&gt;
&lt;br /&gt;
*''Coincidència exacta'': Tot lo que no sigui un caràcter especial o un operador haurà d'apareixer de forma literal en la expressió. Ex: /test/ la paraula '''test'' ha d'aparèixer exactament.&lt;br /&gt;
*''Combinacions de caràcters'': Moltes vegades no volem combinar un caràcter literal específic, sino un grup finit de caràcters. Podem especificar-ho col·locant el grup de caràcters que volem combinar entre claudàtors. Ex: [abc]&lt;br /&gt;
*''Combinacions de caràcters excloents'': Altres vegades volem combinar tots els caràcters trets d'uns quants. Per fer-ho podem utilitzar el símbol ''^'' seguit dels caràcters que no volem en la expresió. Ex: [^abc]. &lt;br /&gt;
*''Rang de valors'': També tenim la habilitat d'especificar un rang de valors. Ex: volem qualsevol caràcter entre '''a''' i '''m''' minmúscula --&amp;gt; [a-m] (ambdós incloses).&lt;br /&gt;
&lt;br /&gt;
=== Caràcters especials ===&lt;br /&gt;
Existeixen caràcters especials en les expresions regulars, de fet, ja hem vist uns quants: '''[''', ''']''', '''-''' i '''^'''.&lt;br /&gt;
Però encara hi ha uns quants més com serien el '''$''', '''{''', '''}''', '''?''', ''',''', '''+''' i el '''.'''&lt;br /&gt;
Com podem fer per utilitzar-los de forma literal en comptes d'utilitzar-los com a operadors de les expressions regulars? Escapant-los.&lt;br /&gt;
Però com? Utilitzant un caràcter especial: ''\''. Ex: La expressió regular '''/\[/''' significa el caràcter '''[''' i no l'inici d'un grup de caràcters.  &lt;br /&gt;
Així mateix, per poder utilitzar el caràcter '''\''' dintre de la expressió regular l'haurem d'escapar. Ex: '''\\''' correspon al literal '''\'''.&lt;br /&gt;
&lt;br /&gt;
=== Principis i finals ===&lt;br /&gt;
A vegades volem que un patró coincideixi amb el principi d'una cadena o amb el final. &lt;br /&gt;
*Principi: Utilitzarem el caràcter ''^''. Ex: /^test/ : només coincideix si la cadena '''test''' coincideix amb el principi.&lt;br /&gt;
*Final: Utilitzarem el caràcter ''$''. Ex: /test$/ : només coincideix si la cadena '''test''' coincideix amb el final.&lt;br /&gt;
*Principi i final: Ex: /^test$/ : Indica que el patró especificat ha d'incluir tota la cadena candidata.&lt;br /&gt;
&lt;br /&gt;
=== Repetició de caràcters ===&lt;br /&gt;
&lt;br /&gt;
Si volem combinar una serie de quatre caràcters 'a' podem expressar-ho amb ''/aaa/'' però que succeeix si volem utilitzar un número qualsevol de repeticions del mateix caràcter?&lt;br /&gt;
Tenim diferents opcions:&lt;br /&gt;
*Podem especificar que un caràcter és opcional, es a dir, &amp;lt;b&amp;gt;pot aparèixer alguna vegada o cap (0 ó 1)&amp;lt;/b&amp;gt;, Es fa afegint el caràcter '''''?''''' al final. Exemple: /t?est/. Aquest patró combina dues opcions: '''test i est'''.&lt;br /&gt;
*Si volem que un caràcter '''apareixi moltes vegades (1 o més)''' utilitzarem '''''+'''''. Ex: /t+est/. Aquest patró combina '''test''', '''ttest''' i '''tttest''' però no '''est'''.&lt;br /&gt;
*Si volem que un '''caràcter apareixi zero o més vegades (0 o més)''' utilitzem el caràcter '''*'''. Ex: /t*est/. Aquest patró combina '''test''', '''ttest''', '''tttest''' i també '''est'''.&lt;br /&gt;
*Podem especificar una quantitat concreta amb el número de repeticions permeses entre claudàtors '''''{}'''''Text en negreta. Per exemple, /a{4}/ indica una coincidència de quatre caràcters 'a' consecutius.&lt;br /&gt;
*També podem especificar un intérval per al compte de repeticions. Per exemple, /a{4,10}/ indica una combinació de 4 a 10 caracters 'a' consecutius.&lt;br /&gt;
*Si en aquest interval no s'indica el segon valor de l'intèrval indiquem que el número final és infinit. Ex: /a{4,}/. Aquest patró combina qualsevol cadena de cuatre o més caràcters 'a' consecutius. Fixat que és important posar la '''coma''' després del 4.&lt;br /&gt;
&lt;br /&gt;
=== Caràcters predefinits ===&lt;br /&gt;
La sintaxis de les expressions regulars ens proporcionen un nombre de termes predefinits que representen caràcters o clases de caràcters que s'utilitzen amb freqüència. &lt;br /&gt;
Taula:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Terme Predefinit&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Equivalència&lt;br /&gt;
|-&lt;br /&gt;
| \t ||Tabulació horitzontal&lt;br /&gt;
|-&lt;br /&gt;
| \b ||Retrocés&lt;br /&gt;
|-&lt;br /&gt;
| \v ||Tabulació Vertical&lt;br /&gt;
|-&lt;br /&gt;
| \f||Salt de página&lt;br /&gt;
|-&lt;br /&gt;
| \r||Retorn de carro.&lt;br /&gt;
|-&lt;br /&gt;
| \n||Nova linia&lt;br /&gt;
|-&lt;br /&gt;
| \cA : \cZ||Caràcters de control&lt;br /&gt;
|-&lt;br /&gt;
| \x0000 : \xFFFF||Unicode Hexadecimal&lt;br /&gt;
|-&lt;br /&gt;
|  \x00 : \xFF||ASCII Hexadecimal&lt;br /&gt;
|-&lt;br /&gt;
| .||Qualsevol caràcter, excepte nova linia&lt;br /&gt;
|-&lt;br /&gt;
|  \d||Qualsevol dígit decimal. Equivalent a [0-9]&lt;br /&gt;
|-&lt;br /&gt;
| \D||Qualsevol caràcter menys un dígit decimal. Equivalent a [^0-9]&lt;br /&gt;
|-&lt;br /&gt;
| \w||Qualsevol caràcter alfanuméric incloent el subratllat. [A-Za-z0-9_]&lt;br /&gt;
|-&lt;br /&gt;
| \W||Qualsevol caràcter menys els alfanumèric i el subratllat. [^A-Za-z0-9_]&lt;br /&gt;
|-&lt;br /&gt;
| \s||Qualsevol espai en blanc (espai, tabulador, salt de pàgina,etc.)&lt;br /&gt;
|-&lt;br /&gt;
| \S||Qualsevol caràcter menys un espai en blanc.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Per veure el llistat complert fes click [http://www.visibone.com/regular-expressions/ aquí].&lt;br /&gt;
&lt;br /&gt;
=== Agrupació de caràcters ===&lt;br /&gt;
De moment, hem observat que els operadors + i * només afecten al terme que els '''precedeix'''. Si volem aplicar-los a un grup de termes, podem utilitzar ''parèntesis'', igual que si es tractés d'una formula matemàtica. Per exemple: /(ab)+/. Aquest patró combina una o més aparicions de la cadena '''ab'''.&lt;br /&gt;
&lt;br /&gt;
=== Alternància de caràcters ===&lt;br /&gt;
La alternància pot expressar-se utilitzant el caràcter '''|'''. Per exemple: /a|b/ combina el caràcter '''a''' o '''b''', i /(ab)+|(cd)+/ combina només una o més repeticions de '''ab''' o '''cd'''.&lt;br /&gt;
&lt;br /&gt;
== Mètodes de les Expressions Regulars ==&lt;br /&gt;
*''pattern.test(cadena)'' : Executa la expressió regular e indica si la cadena passada per paràmetre coincideix o no. (retorna True o False)&lt;br /&gt;
*''pattern.exec(cadena)'' : Executa la expressió regular i retorna la primera coincidència.&lt;br /&gt;
== Resum Expressions Regulars ==&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Expresiones.jpg]]&lt;br /&gt;
[http://rua.ua.es/dspace/bitstream/10045/13363/6/07c-JavaScriptExpReg.pdf Resum Expressions Regulars]&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.regexr.com/ Comprovar expressions regulars]&lt;br /&gt;
&lt;br /&gt;
[https://regex101.com/ Comprovar expressions regulars II]&lt;br /&gt;
&lt;br /&gt;
Crea un patró per a cadascuna de les diferents cadenes que es mostren a continuació:&lt;br /&gt;
&lt;br /&gt;
*Codi postal. Ex: 46700&lt;br /&gt;
*Numero de telèfon amb prefix i guións, el primer nombre pot ser un 8 ó 9. Ex: 93-123-11-33&lt;br /&gt;
*Numero de telèfon amb prefix i punts. Ex: 93-1.231.1339&lt;br /&gt;
*Numero de telèfon internacional. Ex: (+34)952356817 &lt;br /&gt;
*Nom d'usuari amb un mínim de 4 i un màxim de 15. Ex: julio_30&lt;br /&gt;
*Nombre Real. Ex:  -122.33 ó 7,3 ó 8 &lt;br /&gt;
*Numero ISBN de 13 dígits: 978-3-16-148410-0&lt;br /&gt;
*Numero de la seguretat social: 01-123456789&lt;br /&gt;
*Adreça Postal amb les següent condicions: Carrer (C\), Plaza(Pz.), Avinguda(Av.). Direcció. Numero - Porta.&lt;br /&gt;
Ex: C\ Mare de Deu de montserrat. 233 - 2&lt;br /&gt;
*Numero IP d'un ordinador de la versió 4.&lt;br /&gt;
*Numero Mac d'un ordinador separats per ':'&lt;br /&gt;
*URL (amb http, https, www, etc)&lt;br /&gt;
*Data: Ex: DD/MM/AAAA&lt;br /&gt;
*Hora: 23:55:55&lt;br /&gt;
*Email&lt;br /&gt;
*Comprobar un nombre propio&lt;br /&gt;
*Targeta de crèdit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Codi postal. Ex: 46700&lt;br /&gt;
**sol: ^\d{5}$ &lt;br /&gt;
*Numero de telèfon amb prefix i guións, el primer nombre pot ser un 8 ó 9. Ex: 93-123-11-33&lt;br /&gt;
**sol: ^[89](\d-\d{3})-\d{2}-\d{2}$&lt;br /&gt;
*Numero de telèfon amb prefix i punts. Ex: 93-1.231.1339&lt;br /&gt;
**sol: ^[89](\d-\d.)\d{3}\.\d{3}$&lt;br /&gt;
*Numero de telèfon internacional. Ex: (+34)952356817 &lt;br /&gt;
**sol: ^\(\+\d{2,3}\)\d{9}$&lt;br /&gt;
*Nom d'usuari amb un mínim de 4 i un màxim de 15. Ex: julio_30&lt;br /&gt;
**sol: ^[a-z\d_]{4,15}$&lt;br /&gt;
*Nombre Real. Ex:  -122.33 ó 7,3 ó 8 &lt;br /&gt;
**sol: ^[+-]?\d+([,.]\d+)?$    &lt;br /&gt;
*Numero ISBN de 13 dígits: 978-3-16-148410-0&lt;br /&gt;
*Numero de la seguretat social: 01-123456789&lt;br /&gt;
**sol: ^\d{2}-\d{9}$&lt;br /&gt;
**sol: ^[0-1]{2}-\d{9}$&lt;br /&gt;
*Adreça Postal amb les següent condicions: Carrer (C\), Plaza(Pz.), Avinguda(Av.). Direcció. Numero - Porta.&lt;br /&gt;
Ex: C\ Mare de Deu de montserrat. 233 - 2&lt;br /&gt;
**sol: ^((C\\)|(Pz\.)|(Av\.))\s.+\.\s\d{1,5}\s-\s\d$&lt;br /&gt;
((C\\)|(Pz\.)|(Av\.))[a-zA-Z ]+\.[0-9 ]+\-[0-9 ]+&lt;br /&gt;
*Numero IP d'un ordinador de la versió 4.&lt;br /&gt;
** sol: ^((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]?)\.)((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]|[0-9])\.){2}((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9][0-9]|[0-9]))$&lt;br /&gt;
 ^(?:\d{1,3}\.){3}\d{1,3}$&lt;br /&gt;
*Numero Mac d'un ordinador separats per ':'&lt;br /&gt;
*URL (amb http, https, www, etc)&lt;br /&gt;
**sol:(www\.|http:\/\/|https:\/\/)\S*\.(com|es|org))&lt;br /&gt;
*Data: Ex: DD/MM/AAAA&lt;br /&gt;
**sol: ^\d{1,2}\/\d{1,2}\/\d{2,4}$ &lt;br /&gt;
         ^([3][0-1]|[0-2][0-9])\/[0-1]?[0-2]\/[1-2]\d{3}$  coge hasta el día 31 y el mes 12 &lt;br /&gt;
*Hora: 23:55:55&lt;br /&gt;
**sol: ^(0[1-9]|1\d|2[0-3]):([0-5]\d):([0-5]\d)$ &lt;br /&gt;
*Email&lt;br /&gt;
**sol: /^[\w]+@{1}[\w]+\.[a-z]{2,3}$/&lt;br /&gt;
**sol: ^[\\w-]+(\\.[\\w-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$ &lt;br /&gt;
*Comprobar un nombre propio&lt;br /&gt;
**sol: /^([A-Z]{1}[a-zñáéíóú]+[\s]*)+$/ &lt;br /&gt;
*Targeta de crèdit&lt;br /&gt;
**sol:  ^((67\d{2})|(4\d{3})|(5[1-5]\d{2})|(6011))(-?\s?\d{4}){3}|(3[4,7])\ d{2}-?\s?\d{6}-?\s?\d{5}$&lt;br /&gt;
&lt;br /&gt;
= Formularis =&lt;br /&gt;
JavaScript disposa de nombroses propietats i funcions que faciliten la programació d'aplicacions que manegen formularis. En primer lloc, quan es carrega una pàgina web, el navegador crea automàticament una matriu anomenat forms i que conté la referència a tots els formularis de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Per accedir al array forms , s'utilitza l'objecte document , de manera que document.forms és la matriu que conté tots els formularis de la pàgina. Com es tracta d'un array, l'accés a cada formulari es realitza amb la mateixa sintaxi dels arrays. La següent instrucció accedeix al primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més de l'array de formularis, el navegador crea automàticament una matriu anomenat ''elements'' per cadascun dels formularis de la pàgina. Cada array elements conté la referència a tots els elements (quadres de text, botons, llistes desplegables, etc.) d'aquest formulari. Utilitzant la sintaxi dels arrays, la següent instrucció obté el primer element del primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]. elements [0]; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La sintaxi dels arrays no sempre és tan concisa. El següent exemple mostra com obtenir directament l'últim element del primer formulari de la pàgina:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  document. forms [0]. elements [document. forms [0]. elements. length - 1];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Encara que aquesta forma d'accedir als formularis és ràpida i senzilla, té un inconvenient molt greu. Què passa si canvia el disseny de la pàgina i en el codi HTML es canvia l'ordre dels formularis originals o s'afegeixen nous formularis? El problema és que &amp;quot;el primer formulari de la pàgina&amp;quot; ara podria ser un altre formulari diferent al que espera l'aplicació.&lt;br /&gt;
&lt;br /&gt;
En un entorn tan canviant com el disseny web, és molt difícil confiar que l'ordre dels formularis es mantingui estable en una pàgina web. Per aquest motiu, sempre s'hauria d'evitar l'accés als formularis d'una pàgina mitjançant l'array ''document.forms''.&lt;br /&gt;
&lt;br /&gt;
Una forma d'evitar els problemes del mètode anterior consisteix a accedir als formularis d'una pàgina a través del seu nom (atribut '''name''') o a través del seu atribut '''id''' . L'objecte document permet accedir directament a qualsevol formulari mitjançant la seva atribut '''name''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var formularioPrincipal = document. formulari;&lt;br /&gt;
 var formularioSecundario = document. otro_formulario;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/ Form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;otro_formulario&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Accedint d'aquesta forma als formularis de la pàgina, l'script funciona correctament encara que es reordenin els formularis o s'afegeixin nous formularis a la pàgina. Els elements dels formularis també es poden accedir directament mitjançant el seu atribut '''name''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  var formularioPrincipal = document. formulari;&lt;br /&gt;
 var primerElemento = document. formulari. element;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;Input type = &amp;quot;text&amp;quot; name = &amp;quot;element&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Òbviament, també es pot accedir als formularis i als seus elements utilitzant les funcions DOM d'accés directe als nodes. El següent exemple utilitza l'habitual funció '''document.getElementById()''' per accedir de forma directa a un formulari i un dels seus elements:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var formularioPrincipal = document. getElementById (&amp;quot;formulari&amp;quot;);&lt;br /&gt;
 var primerElemento = document. getElementById (&amp;quot;element&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Form name = &amp;quot;formulari&amp;quot; id = &amp;quot;formulari&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;Input type = &amp;quot;text&amp;quot; name = &amp;quot;element&amp;quot; id = &amp;quot;element&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/ Form&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Independentment del mètode utilitzat per obtenir la referència a un element de formulari, cada element disposa de les següents propietats útils per al desenvolupament de les aplicacions:&lt;br /&gt;
*''type'' : indica el tipus d'element que es tracta. Per als elements de tipus &amp;lt;input&amp;gt; ( text , button , checkbox , etc.) coincideix amb el valor del seu atribut '''type''' . Per a les llistes desplegables normals (element &amp;lt;select&amp;gt; ) el seu valor és '''select-one''' , el que permet diferenciar-les de les llistes que permeten seleccionar diversos elements alhora i el tipus és '''select-multiple'''. Finalment, en els elements de tipus &amp;lt;textarea&amp;gt; , el valor de type és '''textarea''' .&lt;br /&gt;
*''form'' : és una referència directa al formulari al qual pertany l'element. Així, per accedir al formulari d'un element, es pot utilitzar document.getElementById(&amp;quot;id_del_elemento&amp;quot;).form&lt;br /&gt;
*''name'' : obté el valor de l'atribut name de XHTML. Només es pot llegir el seu valor, per la qual cosa no es pot modificar.&lt;br /&gt;
*''value'' : permet llegir i modificar el valor de l'atribut value de XHTML. Per als camps de text ( &amp;lt;input type=&amp;quot;text&amp;quot;&amp;gt; i &amp;lt;textarea&amp;gt; ) obté el text que ha escrit l'usuari. Per als botons obté el text que es mostra al botó. Per als elements checkbox i radiobutton no és molt útil, com es veurà més endavant&lt;br /&gt;
&lt;br /&gt;
== Validació ==&lt;br /&gt;
&lt;br /&gt;
La principal utilitat de JavaScript en el maneig dels formularis és la validació de les dades introduïdes pels usuaris. Abans d'enviar un formulari al servidor, es recomana validar mitjançant JavaScript les dades inserides per l'usuari. D'aquesta manera, si l'usuari ha comès algun error en omplir el formulari, se li pot notificar de forma instantània, sense necessitat d'esperar la resposta del servidor.&lt;br /&gt;
&lt;br /&gt;
Notificar els errors de forma immediata mitjançant JavaScript millora la satisfacció de l'usuari amb l'aplicació (el que tècnicament es coneix com &amp;quot;millorar l'experiència d'usuari&amp;quot;) i ajuda a reduir la càrrega de processament al servidor.&lt;br /&gt;
&lt;br /&gt;
Normalment, la validació d'un formulari consisteix en cridar a una funció de validació quan l'usuari prem sobre el botó d'enviament del formulari. En aquesta funció, es comproven si els valors que ha introduït l'usuari compleixen les restriccions imposades per l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Encara que hi ha tantes possibles comprovacions com a elements de formulari diferents, algunes comprovacions són molt habituals: que ompli un camp obligatori, que se seleccioni el valor d'una llista desplegable, que l'adreça d'email indicada sigui correcta, que la data introduïda sigui lògica, que s'hagi introduït un nombre on així es requereix, etc.&lt;br /&gt;
&lt;br /&gt;
A continuació es mostra el codi JavaScript bàsic necessari per incorporar la validació a un formulari:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form name=&amp;quot;formulario&amp;quot;  onSubmit=&amp;quot;return ValidaCampos()&amp;quot;&amp;gt;&lt;br /&gt;
 Teléfono: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;telefono&amp;quot; size=&amp;quot;15&amp;quot; maxlength=&amp;quot;15&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
           &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enviar&amp;quot; name=&amp;quot;enviar&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
I l'esquema de la funció validacio() és el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function ValidaCampos() {&lt;br /&gt;
   var expresion_regular_telefono = /^[89](\d-\d.)\d{3}\.\d{3}$/;  &lt;br /&gt;
// 9 cifras numéricas.&lt;br /&gt;
// Usaremos el método &amp;quot;test&amp;quot; de las expresiones regulares:&lt;br /&gt;
      if (expresion_regular_telefono.test(formulario.telefono.value) == false) {&lt;br /&gt;
                alert('Campo TELEFONO no válido.');&lt;br /&gt;
                return false; // sale de la función y NO envía el formulario&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                alert('Gracias por rellenar nuestro formulario correctamente.');&lt;br /&gt;
                return true; // sale de la función y SÍ envía el formulario&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El funcionament d'aquesta tècnica de validació es basa en el comportament de l'esdeveniment '''onsubmit''' de JavaScript. Igual que altres esdeveniments com '''onclick''' i '''onkeypress''' , l'esdeveniment '''onsubmit''' varia el seu comportament en funció del valor que retorna.&lt;br /&gt;
&lt;br /&gt;
Així, si l'esdeveniment '''onsubmit''' torna el valor '''true''' , el formulari s'envia com ho faria normalment. No obstant això, si l'esdeveniment onsubmit torna el valor '''false''' , el formulari no s'envia. La clau d'aquesta tècnica consisteix a comprovar tots i cadascun dels elements del formulari. En tant es troba un element incorrecte, es torna el valor '''false''' . Si no es troba cap error, es torna el valor '''true'''.&lt;br /&gt;
&lt;br /&gt;
Per tant, en primer lloc es defineix l'esdeveniment '''onsubmit''' del formulari com:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  onsubmit = &amp;quot;return validacio()&amp;quot; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Com el codi JavaScript retorna el valor resultant de la funció '''validacio()''' , el formulari només s'enviarà al servidor si aquesta funció retorna '''true''' . En el cas que la funció '''validacio()''' retorni '''false''' , el formulari romandrà sense enviar.&lt;br /&gt;
&lt;br /&gt;
Dins de la funció '''validacio()''' es comproven totes les condicions imposades per l'aplicació. Quan no es compleix una condició, es retorna '''false''' i per tant el formulari no s'envia. Si s'arriba al final de la funció, totes les condicions s'han complert correctament, de manera que es retorna '''true''' i el formulari s'envia.&lt;br /&gt;
&lt;br /&gt;
La notificació dels errors comesos depèn del disseny de cada aplicació. En el codi de l'exemple anterior simplement es mostren missatges mitjançant la funció '''alert()''' indicant l'error produït. Les aplicacions web ben dissenyades mostren cada missatge d'error al costat de l'element de formulari corresponent i també solen mostrar un missatge principal indicant que el formulari conté errors.&lt;br /&gt;
&lt;br /&gt;
Un cop definit l'esquema de la funció '''validacio()''' , s'ha d'afegir a aquesta funció el codi corresponent a totes les comprovacions que es realitzen sobre els elements del formulari.&lt;br /&gt;
&lt;br /&gt;
== Validació formularis HTML5==&lt;br /&gt;
&lt;br /&gt;
[http://cybmeta.com/validacion-de-formularios-con-html5/ Validació formularis HTML5 I]&lt;br /&gt;
&lt;br /&gt;
[http://mytutorials85.blogspot.com.es/2012/04/formularios-en-html5.html?email=fdfds%40fds Validació formularis HTML5 II]&lt;br /&gt;
&lt;br /&gt;
[https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation Client-side form validation]&lt;br /&gt;
&lt;br /&gt;
== Exercicis de Validació ==&lt;br /&gt;
&lt;br /&gt;
=== Formulari de validació 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea un formulari que demani 4 camps en un textbox: nom, cognoms, email i telèfon. El formulari tindrà un botó &amp;quot;Enviar&amp;quot; que validarà el contingut dels textbox i en cas de passar les validacions s'obrirà una nova pàgina (que no cal que existeixi) amb els valors introduïts passats amb el mètode GET:&lt;br /&gt;
*tots els camps seran obligatoris&lt;br /&gt;
*el format serà el típic de cada camp&lt;br /&gt;
*mostra els missatges d'error d'un en un, per ordre i posant el focus al camp que produeix cada error&lt;br /&gt;
*usa els elements que coneixes de HTML, CSS, etc per a marcar l'error. Sigues creatiu&lt;br /&gt;
&lt;br /&gt;
=== Formulari de validació 2 ===&lt;br /&gt;
&lt;br /&gt;
Al formulari anterior afegeix els camps data de naixement, adreça, codi postal i municipi (per aquest ordre) tenint en compte:&lt;br /&gt;
*la data de naixement ha de ser vàlida, en format dd/mm/aaaa i anterior a la data actual.&lt;br /&gt;
*l'adreça estarà formada per caràcters alfanumèrics i també admetrà espais,comes i guions.&lt;br /&gt;
*el codi postal i municipi tindran el format típic d'aquests camps.&lt;br /&gt;
&lt;br /&gt;
=== solució ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.input_ok {background-color: lightcyan}&lt;br /&gt;
.input_error {background-color: rgb(255, 255, 119)}&lt;br /&gt;
.label_error {color: darkred}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body &amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Exercici 1 de Validacions&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;form name=&amp;quot;formulari&amp;quot; onSubmit=&amp;quot;return valida()&amp;quot; action=&amp;quot;ex_validacions.html&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label for=&amp;quot;nom&amp;quot;&amp;gt;Nom:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;nom&amp;quot; name=&amp;quot;nom&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_nom&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;cognoms&amp;quot;&amp;gt;Cognoms:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;cognoms&amp;quot; name=&amp;quot;cognoms&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_cognoms&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;email&amp;quot;&amp;gt;Email:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;email&amp;quot; name=&amp;quot;email&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_email&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;telefon&amp;quot;&amp;gt;Telefon:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;telefon&amp;quot; name=&amp;quot;telefon&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_telefon&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;data&amp;quot;&amp;gt;Data de naixement:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;data&amp;quot; name=&amp;quot;data&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_data&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;adreca&amp;quot;&amp;gt;Adreça:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;adreca&amp;quot; name=&amp;quot;adreca&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_adreca&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;cp&amp;quot;&amp;gt;Codi postal:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;cp&amp;quot; name=&amp;quot;cp&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_cp&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;label for=&amp;quot;municipi&amp;quot;&amp;gt;Municipi:&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;municipi&amp;quot; name=&amp;quot;municipi&amp;quot; class=&amp;quot;input_ok&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;label id=&amp;quot;er_municipi&amp;quot; class=&amp;quot;label_error&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body &amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function valida(){&lt;br /&gt;
&lt;br /&gt;
var nom=document.getElementById(&amp;quot;nom&amp;quot;).value;&lt;br /&gt;
var cognoms=document.getElementById(&amp;quot;cognoms&amp;quot;).value;&lt;br /&gt;
var email=document.getElementById(&amp;quot;email&amp;quot;).value;&lt;br /&gt;
var telefon=document.getElementById(&amp;quot;telefon&amp;quot;).value;&lt;br /&gt;
var data=document.getElementById(&amp;quot;data&amp;quot;).value;&lt;br /&gt;
var adreca=document.getElementById(&amp;quot;adreca&amp;quot;).value;&lt;br /&gt;
var cp=document.getElementById(&amp;quot;cp&amp;quot;).value;&lt;br /&gt;
var municipi=document.getElementById(&amp;quot;municipi&amp;quot;).value;&lt;br /&gt;
var patt_alfanumeric = /^[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ]+(\s[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ]+)*$/;&lt;br /&gt;
var patt_email = /^\w+@\w+\.\w+$/;&lt;br /&gt;
var patt_telefon =/^\d{9}$/;&lt;br /&gt;
var patt_data = /^\d{2}\/\d{2}\/\d{4}$/;&lt;br /&gt;
var patt_adreca = /^[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ\,\.\-]+(\s[\wñÑçÇàáèéíòóúÀÁÈÉÍÒÓÚ\,\.\-]+)*$/;&lt;br /&gt;
var patt_cp=/^\d{5}$/;&lt;br /&gt;
&lt;br /&gt;
// reset format dels textbox i missatges d'error&lt;br /&gt;
document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_ok&amp;quot;;&lt;br /&gt;
document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//validació del nom&lt;br /&gt;
if(nom==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_alfanumeric.test(nom)) {&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;nom&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_nom&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació dels cognoms&lt;br /&gt;
if(cognoms==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_alfanumeric.test(cognoms)) {&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cognoms&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cognoms&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del email&lt;br /&gt;
if(email==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_email.test(email)) {&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;email&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_email&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (ex. usuari@servidor.xx)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del telefon&lt;br /&gt;
if(telefon==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_telefon.test(telefon)) {&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;telefon&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_telefon&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (6 digits)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació de la data&lt;br /&gt;
if(data==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_data.test(data)) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (dd/mm/aaaa)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var components_data = data.split(&amp;quot;/&amp;quot;);&lt;br /&gt;
var val_data=Date.parse(components_data[2]+&amp;quot;/&amp;quot;+components_data[1]+&amp;quot;/&amp;quot;+components_data[0]);&lt;br /&gt;
&lt;br /&gt;
if(isNaN(val_data)) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;data no vàlida&amp;quot;;&lt;br /&gt;
	return false;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var today=new Date();&lt;br /&gt;
if(val_data&amp;gt;=today) {&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;data&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_data&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;la data ha de ser anterior a la data acutal&amp;quot;;&lt;br /&gt;
	return false;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//validació de l'adreça&lt;br /&gt;
if(adreca==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_adreca.test(adreca)) {&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;adreca&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_adreca&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del codi postal&lt;br /&gt;
if(cp==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_cp.test(cp)) {&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;cp&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_cp&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte (5 digits)&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//validació del municipi&lt;br /&gt;
if(municipi==&amp;quot;&amp;quot;) {&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;camp obligatori&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!patt_adreca.test(municipi)) {&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).className=&amp;quot;input_error&amp;quot;;&lt;br /&gt;
	document.getElementById(&amp;quot;municipi&amp;quot;).focus();&lt;br /&gt;
	document.getElementById(&amp;quot;er_municipi&amp;quot;).innerHTML=&amp;quot;&amp;amp;nbsp;format incorrecte&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return true;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
	&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
POSIBLE EJERCICIO&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tags = document.querySelectorAll('h1,h2,h3,h4,h5,h6,div,p');&lt;br /&gt;
for (var i = tags.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
  tags[i].style.outline = &amp;quot;1px solid green&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validar un camp de text Obligatori ===&lt;br /&gt;
Es tracta de forçar l'usuari a introduir un valor en un quadre de text o textarea en què sigui obligatori.Perquè es doni per completat un camp de text obligatori, es comprova que el valor introduït sigui vàlid, que el nombre de caràcters introduït sigui més gran que zero i que no s'hagin introduït només espais en blanc.  El text introduït tingui una longitud superior a zero caràcters, és a dir, que no sigui un text buit i per últim, el valor introduït per l'usuari no només estigui format per espais en blanc.&lt;br /&gt;
&lt;br /&gt;
:[[solució_valor_quadre_text]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un camp de text amb valors numèrics ===&lt;br /&gt;
Es tracta d'obligar l'usuari a introduir un valor numèric en un quadre de text.&lt;br /&gt;
:[[solucio_camp_text]]&lt;br /&gt;
&lt;br /&gt;
===  Validar que s'ha seleccionat una opció d'una llista ===&lt;br /&gt;
Es tracta d'obligar l'usuari a seleccionar un element d'una llista desplegable.&lt;br /&gt;
:[[solucio_llista]]&lt;br /&gt;
&lt;br /&gt;
=== Validar una adreça de correu electrònic ===&lt;br /&gt;
Es tracta d'obligar l'usuari a introduir una adreça de correu amb un format vàlid. Per tant, el que es comprova és que la direcció sembli vàlida, ja que no es comprova si es tracta d'un compte de correu electrònic real i operativa. La comprovació es realitza novament mitjançant les expressions regulars, ja que les adreces de correu electrònic vàlides poden ser molt diferents.&lt;br /&gt;
:[[solucio_correu_electronic]]&lt;br /&gt;
&lt;br /&gt;
=== Validar una data ===&lt;br /&gt;
Les dates solen ser els camps de formulari més complicats de validar per la multitud de formes diferents en què es poden introduir.&lt;br /&gt;
:[[solucio_dates]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un número de DNI ===&lt;br /&gt;
Es tracta de comprovar que el nombre proporcionat per l'usuari es correspon amb un nombre vàlid de document nacional d'identitat o DNI. Encara que per cada país o regió els requisits del document d'identitat de les persones poden variar, a continuació es mostra un exemple genèric fàcilment adaptable. La validació no només ha de comprovar que el nombre estigui format per vuit xifres i una lletra, sinó que també cal comprovar que la lletra indicada és correcta per al número introduït.&lt;br /&gt;
:[[solució_dni]]&lt;br /&gt;
&lt;br /&gt;
=== Validar un número de telèfon ===&lt;br /&gt;
Els números de telèfon poden ser indicats de formes molt diferents: amb prefix nacional, amb prefix internacional, agrupat per parells, separant els números amb guions, etc.&lt;br /&gt;
:[[solucio_telefon]]&lt;br /&gt;
&lt;br /&gt;
=== Validar que un checkbox ha estat seleccionat ===&lt;br /&gt;
*a)Es tracta de validar si un element de tipus checkbox s'ha de seleccionar de forma obligatòria. &lt;br /&gt;
*b)Es tracta de validar si tots els checkbox del formulari han estat seleccionats.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_checkbox]]&lt;br /&gt;
&lt;br /&gt;
=== Validar que un radiobutton ha estat seleccionat ===&lt;br /&gt;
Encara que es tracta d'un cas similar al dels checkbox, la validació dels radiobutton presenta una diferència important: en general, la comprovació que es realitza és que l'usuari hagi seleccionat algun radiobutton dels que formen un determinat grup.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_radiobutton]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;JavaScript RegExp Reference: https://www.w3schools.com/jsref/jsref_obj_regexp.asp&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Experiments amb Expresions Regulars: http://www.regexplanet.com/advanced/javascript/index.html &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;John Resig, Bear Bibeault, &amp;quot;Secrets of the Javascript Ninja&amp;quot;, Manning Publications, 2012. ISBN 193398869X&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[http://librosweb.es/javascript/capitulo_7.html Introducció a Javascript] &amp;lt;/p&amp;gt; &amp;lt;p&amp;gt; [https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions Expressions Regulars a Mozilla]&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcomas</name></author>	</entry>

	</feed>