Introducció. Objectes predefinits i objectes del client web

Entre els objectes predefinits per JavaScript hem de distingir entre aquells que són propis de JavaScript com a llenguatge de programació, independentment del context; i aquells que es creen quan el client web (Firefox, Chrome, IE) carrega un document HTML, és a dir, en un context de navegador web.

Els primers representen, bàsicament, cadenes de caràcters, nombres i elements matemàtics i dates, com passa a molts llenguatges de programació. A més, també n’hi ha que representen les expressions regulars, que permeten realitzar amb relativa facilitat operacions de tractament de text amb un grau de complexitat important.

Els segons estan compresos en el BOM (Browser Object Model, que pot traduir-se per Model d’Objectes del Navegador). En aquest model s’inclouen objectes que representen els diferents elements del navegador com la finestra, l’historial, l’adreça web i, sobre tot, els documents HTML que s’estan mostrant. Aquests documents presenten una complexitat important i requereixen un sistema d’objectes propi, el DOM (Document Object Model, que pot traduir-se per Model d’Objectes del Document).

Tot això suposa llargues llistes de propietats i mètodes. Caldrà estar-hi familiaritzats amb els d’ús més habitual i, també, amb la documentació que tots aquests objectes tenen associada. És bàsic ser capaç d’interpretar-la correctament per poder utilitzar fins i tot elements que no hàgiu utilitzat mai abans.

Objectes predifinits de JavaScript

Alguns dels objectes predefinits de JavaScript més utilitzats són:

  • Objecte String: per representar i operar amb cadenes de text.
  • Objecte Number i BigInt: per representar números.
  • Objecte Math: per representar constants i funcions matemàtiques.
  • Objecte Date: per representar dates.
  • Objecte RegExp: per representar expressions regulars.
  • Objectes Array, Map i Set: per treballar amb col·leccions d’elements.

Com a objectes que són, tots tenen unes propietats i uns mètodes. És difícil practicar amb totes les propietats i mètodes dels objectes. El que és important és saber cercar dins de la documentació i saber aplicar les propietats i mètodes d’aquests objectes.

Un enllaç directe on podeu trobar la referència de tots els objectes predefinits, les seves propietats i els seus mètodes és: mzl.la/3dkksJe.

L'objecte String

L’objecte String és un constructor de cadenes. De fet, no és exactament el mateix el tipus primitiu string que un objecte String.

En l’apartat d’“Activitats” del web del mòdul trobareu un exemple de com afegir un nou mètode a un objecte String.

  1. let strPrimitiva = 'IOC';
  2. let strObjecte = new String(strPrimitiva);
  3.  
  4. console.log(typeof strPrimitiva); // string
  5. console.log(typeof strObjecte); // object
  6.  
  7. console.log(strPrimitiva == strObjecte); //true
  8. console.log(strPrimitiva === strObjecte); //false

Tot i que normalment no ens n’haurem de preocupar, podem obtenir resultats sorprenents. Per exemple, si utilitzem la funció de JavaScript eval(), que avalua o executa una expressió:

  1. let str1 = '2 + 2'; //tipus primitiu de cadena
  2. let str2 = new String('2 + 2'); // objecte String
  3. console.log(eval(str1)); // retorna 4
  4. console.log(eval(str2)); // retorna la cadena "2 + 2"

Amb el mètode valueOf() podem convertir un objecte al seu tipus primitiu:

  1. console.log(eval(str2.valueOf())); //retorna 4

Una altra propietat interessant dels objectes String és length que ens retorna la mida d’una cadena:

  1. let str1="IOC";
  2. console.log(str1.length); // retorna 3

Mètodes de l'objecte String

Els principals mètodes que farem servir són els següents.

  • charAt(x): retorna el caràcter a la posició x (començant pel 0).
  • concat(str): concatena la cadena str a la cadena original.
  • startsWith(str): comprova si la cadena comença amb els caràcters o cadena especificats.
  • endsWith(str): comprova si la cadena acaba amb els caràcters o cadena especificats.
  • includes(str): comprova si la cadena conté els caràcters o cadena especificats.
  • indexOf(str): retorna la posició de la primera ocurrència de la cadena que passem com a paràmetre.
  • lastIndexOf(str): retorna la posició de l’última ocurrència de la cadena que passem com a paràmetre.
  • match(regexp): cerca dins una cadena comparant-la amb l’expressió regular regexp, i retorna les coincidències en un array.
  • repeat(x): retorna una nova cadena que és la repetició de la cadena tantes vegades com el valor del paràmetre x.
  • replace(str1, str2): cerca dins la cadena els caràcters (o expressió regular) str1, i retorna una nova cadena amb aquests valors reemplaçats pel segon paràmetre str2.
  • search(str): cerca dins de la cadena els caràcters (o expressió regular) str, i retorna la posició de la primera ocurrència.
  • slice(x,y): extreu una part d’una cadena entre els caràcters x i y, i retorna una nova cadena.
  • split(car): separa una cadena en un array de subcadenes, agafant com a llavor del separador el caràcter car.
  • substr(x, y): extreu caràcters d’una cadena, començant en la posició x, i el número de caràcters especificat per y.
  • substring(x, y): extreu caràcters d’una cadena entre els dos index especificats, x i y.
  • toLowerCase(str): converteix una cadena a minúscules.
  • toUpperCase(str): converteix una cadena a majúscules.
  • trim(): elimina els espais en blanc d’ambdós extrems de la cadena.
  • toString(): retorna el valor d’un objecte String.
  • valueOf(): retorna el tipus primitiu d’un objecte String.

Hi ha altres mètodes que només tenen sentit en el context de la web. Són els wrapper HTML methods. Per exemple, el mètode bold() retorna la mateixa cadena embolcallat amb els tags <b> i </b>, de manera que dins d’una pàgina web la cadena es veu com a negreta. Aquests mètodes no són un estàndard, poden tenir un comportament diferent en diversos navegadors i, a més, la majoria d’ells són obsolets. Els principals mètodes d’embolcall HTML són: big(), bold(), fontcolor(), fontsize(), italics(), small(), que embolcallen la cadena amb tags perquè es mostri, respectivament: amb font gran, en negreta, d’un color determinat, amb una mida determinada, en cursiva i amb font petita.

Exemple: funció per validar el DNI

En el DNI tenim 8 números i una lletra. Per a cada número només una lletra és vàlida, i la manera de calcular-la la tenim en la funció següent.

S’utilitzen diversos mètodes de String: substr(), charAt() i toUpperCase().

  1. function validarDNI(dni) {
  2. let lletres = "TRWAGMYFPDXBNJZSQVHLCKE";
  3. let numDni = dni.substr(0, dni.length - 1);
  4.  
  5. //la línia següent pot substituir-se per: var lletra_dni=dni.substr(dni.length-1,1).toUpperCase();
  6. let lletraDni = dni.charAt(dni.length - 1).toUpperCase();
  7.  
  8. if (lletres.charAt(numDni % 23) === lletraDni) {
  9. return true;
  10. }
  11.  
  12. return false;
  13. }
  14.  
  15. console.log(validarDNI("38540343T")); //false
  16. console.log(validarDNI("38540343w")); //true

Podeu veure l’exemple a: codepen.io/ioc-daw-m06/pen/jOWdjmy?editors=0012.

L'objecte Number

A JavaScript comptem amb dos tipus primitius per treballar amb nombres:

  • Number: per a nombres enters i reals.
  • BigInit: per treballar amb nombres enters grans.

En aquesta secció ens centrem en el tipus Number, que guarda els números en memòria amb una resolució de 64 bits (doble precisió) i coma flotant.

  1. let a = 20;
  2. let b = -2.718;
  3. let c = 1e4;
  4. let d = 2.23e-3

A part de la notació decimal, podem representar els números en binari, octal o hexadecimal.

  1. console.log(0b1010);
  2. console.log(0xFF);

I amb el mètode toString() podem representar els números en diferents notacions:

  1. let num = 76;
  2. console.log(`${num.toString(16)} en hexadecimal`);
  3. console.log(`${num.toString(8)} en octal`);
  4. console.log(`${num.toString(2)} en binari`);

Infinity és el valor per representar que hem sobrepassat la precisió dels números (que és fins a 15 dígits en la part entera):

  1. console.log (5/0); //retorna Infinity

Not a Number (NaN) és una paraula reservada per indicar que el valor no representa un número. Podem utilitzar la funció global isNaN() per saber si l’argument és un número:

  1. console.log(3 * "a"); //NaN. Recordeu que 3+"a" retorna "3a"
  2. console.log(isNaN(3 * 4)); //false
  3. console.log(isNaN(3 * "a")); //true

De la mateixa manera que passa amb les cadenes, a JavaScript normalment els números són tipus primitius, però també els podem crear com a objectes:

  1. let x = 25; //tipus primitiu
  2. let y = new Number(25); //objecte
  3. console.log(typeof x); //number
  4. console.log(typeof y); //object
  5.  
  6. console.log (x == y); //true
  7. console.log (x === y); //false

Podeu veure els exemples anteriors a: codepen.io/ioc-daw-m06/pen/ZEQwdrv?editors=0012.

Mètodes de l'objecte Number

Els principals mètodes de l’objecte Number són:

  • isFinite(): comprova si un valor és un número finit.
  • isInteger(): comprova si un valor és un enter.
  • isNaN(): comprova si un valor és un NaN. Alternativament es pot fer la comprovació a === Number.NaN.
  • toExponential(x): representa un número amb la seva notació exponencial. Per exemple, 20,31 a 2.031e+1, que significa 2.031 * 10^1.
  • toFixed(n): formata un número amb una precisió decimal de n dígits. Retorna una cadena que és la representació del número.
  • toPrecision(n): formata un número a una precisió de n dígits (número total de dígits, incloent la part entera i la decimal).
  • toString(): converteix un número a una cadena.
  • parseInt(): converteix un número a enter.
  • parseFloat(): converteix un número a decimal.
  • valueOf(): retorna el valor del tipus primitiu del número.

Posem alguns exemples:

  1. console.log((18).toString() + (20).toString());
  2.  
  3. let x = 234.456;
  4. console.log(typeof x); //number
  5. console.log (Number.isInteger(x)); //false
  6. console.log (x.toExponential());
  7. x = x.toFixed(2); // 234.46, arrodoneix de la forma esperada
  8. console.log(x);
  9. console.log(typeof x); //compte! x ara és un string
  10. x = parseFloat(x);
  11. console.log(typeof x); //number. Torna a ser number
  12.  
  13. x = x.toPrecision(6); //234.460
  14. console.log(x);

Podeu veure l’exemple a: codepen.io/ioc-daw-m06/pen/bGEzPKB?editors=0012.

Paràmetres i valors retornats per funcions

Aquest exemple que acabeu de veure no era trivial. Fixeu-vos que després d’utilitzar toFixed() el resultat és una cadena, i per tant no podem aplicar toPrecision(), que només s’aplica a Numbers. Per convertir a Number tampoc puc utilitzar Number.parseFloat(), que només s’aplica a Number, sinó la funció global parseFloat(x). Un cop tenim Number, ja podem aplicar el mètode toPrecision(). Aquesta manera de raonar és habitual en JavaScript i en d’altres llenguatges de programació. Així doncs, quan us trobeu amb un resultat inesperat no heu de treure conclusions precipitades, i heu d’aprendre a trobar i raonar sobre la causa del problema.

L'objecte Math

L’objecte Math permet realitzar tasques matemàtiques, com per exemple crear números aleatoris, realitzar funcions trigonomètriques, etc.

Propietats de Math

JavaScript té emmagatzemades les principals constants matemàtiques (número pi, número e, etc.), i per accedir-hi ho fem a través de les propietats corresponents de l’objecte Math. Així doncs, trobem: Math.E (número d’Euler, 2.718…), Math.LN2 (logaritme neperià de 2), Math.LN10 (logaritme natural de 10), Math.PI (número Pi), Math.SQRT2 (arrel quadrada de 2), i algunes altres més.

L’objecte Math és especial en el sentit que no té constructor. No hi ha cap mètode per crear un objecte Math. Podem fer-lo servir sense haver de crear-lo.

Per exemple,

  1. console.log (Math.PI);

Mètodes de l'objecte Math

Amb els següents mètodes de Math podem realitzar operacions matemàtiques usuals:

  • abs(x): valor absolut.
  • sin(x), cos(x), tan(x): funcions trigonomètriques de sinus, cosinus i tangent.
  • asin(x), acos(x), atan(x): retorna en radians l’arcsinus, arccosinus, arctangent.
  • round(x): arrodoneix x al valor enter més proper.
  • ceil(x), floor(x): retorna el mateix número però arrodonit a l’enter més proper cap a dalt (ceil) o cap a baix (floor).
  • truncx(x): elimina la part fraccionària d’un número (i queda només la part entera).
  • exp(x): retorna el valor .
  • max(a,b,…), min(a,b,…): retorna el valor més gran (o més petit) de la llista de números.
  • pow(x,y): retorna .
  • log(x): retorna el logaritme natural (base e) de x.
  • random(): retorna un número aleatori entre 0 (inclòs) i 1 (exclòs).
  • sqrt(x): retorna l’arrel quadrada de x.

Quan es programa, sovint és necessari obtenir números aleatoris. Per generar-los, JavaScript utilitza una llavor (seed) interna que no és accessible a l’usuari. En el següent exemple es veu un exemple típic de com es poden generar números aleatoris en diferents rangs:

  1. // Funció que retorna un número aleatori entre 0 (inclusiu) i 1 (exclusiu)
  2. function getRandom() {
  3. return Math.random();
  4. }
  5.  
  6. // Funció que retorna un número aleatori entre min (inclusiu) i max (exclusiu)
  7. function getRandomArbitrary(min, max) {
  8. return Math.random() * (max - min) + min;
  9. }
  10.  
  11. // Funció que retorna un número enter aleatori entre min (inclusiu) i max (exclusiu)
  12. function getRandomInt(min, max) {
  13. return Math.floor(Math.random() * (max - min)) + min;
  14. }
  15.  
  16. // Funció que retorna un número enter aleatori entre min (inclusiu) i max (inclusiu)
  17. function getRandomIntInclusive(min, max) {
  18. return Math.floor(Math.random() * (max - min + 1)) + min;
  19. }
  20.  
  21. console.log('\nNúmero aleatori entre 0 (inclusiu) i 1 (exclusiu)');
  22. for (let i=0; i<10; i++) {
  23. console.log(getRandom());
  24. }
  25.  
  26. console.log('\nNúmero aleatori entre 1 (inclusiu) i 5 (exclusiu)');
  27. for (let i=0; i<10; i++) {
  28. console.log(getRandomArbitrary(1,5));
  29. }
  30.  
  31. console.log('\nNúmero enter aleatori entre 1 (inclusiu) i 5 (exclusiu)');
  32. for (let i=0; i<10; i++) {
  33. console.log(getRandomInt(1,5));
  34. }
  35.  
  36. console.log('\nNúmero enter aleatori entre 1 (inclusiu) i 5 (inclusiu)');
  37. for (let i=0; i<10; i++) {
  38. console.log(getRandomIntInclusive(1,5));
  39. }

Podeu veure l’exemple a: codepen.io/ioc-daw-m06/pen/jrBeNW?editors=0012.

L'objecte Date

L’objecte Date s’utilitza per treballar amb dates i temps. Per instanciar un objecte tipus Date s’utilitza new, i admet diferents arguments:

  1. let data = new Date(); //data del sistema
  2. console.log(data);
  3. data = new Date(34885453664); //genera un data que representa els mil·lisegons que han passat des de l'1 de gener de 1970
  4. console.log(data);
  5. data = new Date('2016/05/23');
  6. console.log(data);
  7. data = new Date(2016,5,23,12,15,24,220); //any,mes,dia,hora,minuts,segons,mil·lisegons
  8. console.log(data);

Treballar amb dates no sempre és fàcil i immediat: haurem de tenir en compte el format de data i el fus horari.

Sigui quin sigui el format en què expressem les dates, aquestes es guarden internament com un número que representa els mil·lisegons que han passat des de l’1 de gener de 1970 (00:00:00). Per exemple, des de la data actual (amb precisió de mil·lisegons) fins aquesta data original han passat:

  1. let data = new Date(); //data del sistema
  2. console.log(data.getTime()); //milisegons
  3. console.log(`Des de 1970 han passat ${data.getTime()/1000/3600/24/365} anys aprox`);

Podeu veure els exemples a: codepen.io/ioc-daw-m06/pen/jOWdjXG?editors=0012.

Mètodes de l'objecte Date

Hi ha molts mètodes de l’objecte Date. En veurem alguns, en especial aquells que permeten representar les dates en el format usual (dd/mm/aaaa):

  • getDay(): retorna el dia de la setmana (0-6, començant per diumenge).
  • getFullYear(): retorna l’any (4 dígits).
  • getMonth(): retorna el mes (0-11).
  • getDate(): retorna el dia del mes (1-31).
  • getHours(): retorna l’hora (0-23).
  • getMinutes(): retorna els minuts (0-59).
  • getSeconds(): retorna els segons (0-59).
  • getMilliseconds(): retorna els mil·lisegons (0-999).
  • getUTCDate(): retorna el dia del mes (1-31), d’acord amb l’horari UTC universal.
  • getUTCDay(): retorna el dia de la setmana (0-6, començant per diumenge), d’acord amb l’horari UTC universal.
  • getUTCFullYear(): retorna l’any (4 dígits), d’acord amb l’horari UTC universal.
  • getUTCMonth(): retorna el mes (0-11), d’acord amb l’horari UTC universal.
  • getUTCHours(): retorna l’hora (0-23), d’acord amb l’horari UTC universal.
  • getUTCMinutes(): retorna els minuts (0-59), d’acord amb l’horari UTC universal.
  • getUTCSeconds(): retorna els segons (0-59), d’acord amb l’horari UTC universal.
  • getUTCMilliseconds(): retorna els mil·lisegons (0-999), d’acord amb l’horari UTC universal.
  • getTime(): retorna el nombre de mil·lisegons que han transcorregut des de la data fins l’1 de gener de 1970.
  • now(): retorna el nombre de mil·lisegons que han transcorregut des de la data del sistema fins l’1 de gener de 1970.
  • parse(): transforma una cadena de text (representant una data), i retorna el nombre de mil·lisegons transcorreguts des de la data fins l’1 de gener de 1970.
  • setFullYear(): especifica el dia de l’any.
  • setMonth(): especifica el mes.
  • setDate(): especifica el dia del mes.
  • setHours(): especifica l’hora.
  • setMinutes(): especifica els minuts.
  • setSeconds(): especifica els segons.
  • setMilliseconds(): especifica els mil·lisegons.
  • setTime(): especifica una data a partir del nombre de mil·lisegons abans o després de l’1 de gener de 1970.
  • setUTCFullYear(): especifica l’any, d’acord amb l’horari UTC universal.
  • setUTCMonth(): especifica el mes, d’acord amb l’horari UTC universal.
  • setUTCDate(): especifica el dia del mes, d’acord amb l’horari UTC universal.
  • setUTCHours(): especifica l’hora, d’acord amb l’horari UTC universal.
  • setUTCMinutes(): especifica els minuts, d’acord amb l’horari UTC universal.
  • setUTCSeconds(): especifica els segons, d’acord amb l’horari UTC universal.
  • setUTCMilliseconds(): especifica els mil·lisegons, d’acord amb l’horari UTC universal.
  • toDateString(): converteix la part de la data en una cadena llegible.
  • toLocaleDateString(): converteix la part de la data en una cadena llegible, utilitzant les convencions locals.
  • toISOString(): converteix la data a cadena, utilitzant la convenció ISO.
  • toJSON(): converteix la data a cadena amb format JSON.
  • toTimeString(): converteix la part del timestamp de l’objecte Date a cadena.
  • toLocaleTimeString(): converteix la part del timestamp de l’objecte Date, utilitzant les convencions locals.
  • toString(): converteix l’objecte Date a cadena.
  • toLocaleString(): converteix l’objecte Date a cadena, utilitzant les convencions locals.

Diferents exemples per mostrar com s’utilitzen aquests mètodes són:

  1. let data = new Date();
  2. let arrayMesos = ['gener', 'febrer', 'març', 'abril', 'maig', 'juny', 'juliol', 'agost', 'setembre', 'octubre', 'novembre', 'desembre'];
  3. var arrayDiesSetmana = ['diumenge', 'dilluns', 'dimarts', 'dimecres', 'dijous', 'divendres', 'dissabte'];
  4. console.log(`Avui és ${arrayDiesSetmana[data.getDay()]}, ${data.getDate()} de ${arrayMesos[data.getMonth()]} de ${data.getFullYear()}`);
  1. //Per veure el nombre de mil·lisegons des de l'origen dels temps (1 de gener de 1970 00:00:00):
  2. let data = new Date();
  3. console.log(data.getTime());
  4. // i també:
  5. console.log(Date.now());
  1. let d1 = Date.parse("23 March 2016"); //parse sap interpretar diferents formats de data, però en anglès.
  2. let d2 = Date.parse("28 May 2016");
  3. console.log(d1);
  4. console.log(d2);
  5. console.log(d1 > d2); //Podem comparar les dates per saber quina és la més gran

Per veure la diferència entre utilitzar UTC o no, hem de pensar que aquí a Catalunya estem en el fus horari UTC/GMT +1 hora, però hem de tenir en compte si estem en horari d’estiu o d’hivern. Quan estem a l’estiu s’ha de compensar el fus horari i aleshores és UTC/GMT +2 hora. Per tant, podem veure la diferència entre l’hora local i l’hora absoluta internacional:

  1. let data = new Date();
  2. console.log(data.getHours()); //per ex, 14, hora real d'un rellotge local.
  3. console.log(data.getUTCHours()); //per ex, 12, hora UTC

Vegeu la diferència entre utilitzar les convencions locals o no:

  1. let d = new Date();
  2. //Dia del Treball
  3. d.setDate(1);
  4. d.setMonth(4); //Representa el mes de maig
  5. d.setFullYear(2016);
  6. console.log(d);
  7. console.log(d.toDateString()); //Sun May 01 2016
  8. console.log(d.toLocaleDateString()); //1/5/2016
  9.  
  10. //Com que toLocaleDateString() retorna una cadena, ja puc utilitzar les funcions de cadena:
  11. let arrayData = d.toLocaleDateString().split('/');
  12. console.log(arrayData[0]); //dia
  13. console.log(arrayData[1]); //mes
  14. console.log(arrayData[2]); //any

Utilitzant les convencions locals:

  1. let d = new Date();
  2. console.log(d.toLocaleString()); // 2/5/2016, 14:44:37
  3. console.log(d.toLocaleDateString()); // 2/5/2016
  4. console.log(d.toLocaleTimeString()); // 14:44:37

Podeu veure els exemples a: codepen.io/ioc-daw-m06/pen/LYGqKoK?editors=0012.

L'objecte RegExp

Les expressions regulars són objectes de JavaScript que s’utilitzen per descriure un patró de caràcters. Aplicades a les cadenes de text, amb les expressions regulars podem esbrinar si una cadena de text compleix un patró, i realitzar funcions de cerca i reemplaçament.

Les expressions regulars estan explicades amb deteniment en la unitat “Esdeveniments. Manejament de formularis”.

En una expressió regular distingim entre el patró i els modificadors: /pattern/modificadors;.

  1. var patro = /IOC/i

En aquest cas, la i és un modificador que significa que farem una cerca sense tenir en compte majúscules/minúscules. Hi ha altres modificadors que pots consultar, entre d’altres llocs, al tutorial de la Fundació Mozilla mzl.la/3atdqA2.

Per veure el funcionament bàsic de les expressions regulars veurem els mètodes test() i match():

  • test(): mètode que retorna true o false si la cadena de text compleix el patró.
  • match(): mètode de l’objecte String que fa una cerca de la cadena contra un patró, i retorna un array amb els resultats trobats, o el valor primitiu null en cas que no en trobi cap.
  1. let patro1 = /ioc/i
  2. let patro2 = /ioc/
  3. let cad="Curs de JavaScript de l'IOC";
  4.  
  5. console.log(patro1.test(cad));
  6. console.log(patro2.test(cad));
  7.  
  8. let res = cad.match(patro1);
  9. console.log(res.length); //1, una sola ocurrència
  10. console.log(res[0]); //IOC

Dins una expressió regular podem utilitzar brackets per expressar un rang de caràcters, i metacaràcters, que tenen un significat especial. Per exemple, anem a veure una expressió regular per comprovar si una cadena compleix amb el format de data dd/mm/aaaa:

  1. regexp = /^(3[01]|[12][0-9]|0?[1-9])\/(1[0-2]|0?[1-9])\/([0-9]{2})?[0-9]{2}$/;
  2. console.log(regexp.test("01/01/2016")); //true
  3. console.log(regexp.test("2016/01/01")); //false
  4. console.log(regexp.test("01/01/16")); //true
  5. console.log(regexp.test("1/1/16")); //true
  6. console.log(regexp.test("IOC")); //false
  • Amb el circumflex (^) estem indicant com ha de començar l’expressió.
  • Amb el dòlar ($) estem indicant com ha d’acabar l’expressió.
  • Utilitzem la contrabarra (\) per indicar que la barra (/) no és un metacaràcter, sinó un caràcter a tenir en compte.
  • El dia del mes pot ser: 30 o 31; del 10 al 29; o també del 1 al 9, ficant o no un 0 al davant.
  • El mes pot ser 1-12, ficant o no un zero al davant.
  • L’any pot ser de 2 o 4 dígits.

Un altre exemple, en aquest cas per validar un número de targeta de crèdit:

  1. regexp = /^[0-9]{4}(-|\s)[0-9]{4}(-|\s)[0-9]{4}(-|\s)[0-9]{4}$/;
  2. console.log(regexp.test("3782-8224-6310-0067")); //true
  3. console.log(regexp.test("3782 8224 6310 0067")); //true
  4. console.log(regexp.test("3782*8224*6310*0067")); //false
  5. console.log(regexp.test("37828224630006")); //false

Podeu veure els exemples a: codepen.io/ioc-daw-m06/pen/XWXOLvy?editors=0012.

BOM (Browser Object Model)

L’objectiu del BOM no és només canviar el contingut del document HTML, sinó també realitzar altres manipulacions relacionades amb el navegador i les seves finestres. Per exemple, és possible redimensionar i moure una finestra del navegador, modificar la informació que es mostra a la barra d’estat, moure’s per l’historial d’URLs en les quals navegador ha accedit, gestionar les cookies (galetes), etc.

El DOM (Document Object Model) està explicat amb més detall a la unitat “Model d’objectes del document”.

Quan un client web (el navegador web: Firefox, Chrome, IE) carrega un document HTML, crea uns objectes associats al document, al seu contingut, i altra informació útil. Aquests objectes guarden una jerarquia en què l’objecte window és l’arrel, i d’aquí pengen els altres objectes que podem referenciar (vegeu la figura).

Figura Jerarquia d’objectes del BOM

Com es veu a la figura, cada document HTML crea els següents objectes:

  • window: representa l’arrel de l’arbre del BOM. Una finestra pot tenir subfinestres (per exemple, pop-ups), que seran fills en aquest arbre que representa l’estructura.
  • location: conté les propietats de la direcció URL del document.
  • history:conté la informació de les direccions URL que s’han visitat en la sessió actual.
  • document: conté informació sobre el document actual, com ara el títol, imatges, links, taules, formularis que conté, etc. Per accedir a tota aquesta informació tenim el DOM. Les propietats de l’objecte document poden ser alhora altres objectes (com ara l’objecte cookies).

A més de propietats i mètodes, també hi tenim events associats. És a dir, aquests objectes poden respondre a events disparats per les accions de l’usuari.

L'objecte Window. Jerarquia d'objectes associats al navegador

En l’arrel de la jerarquia trobem l’objecte window, que representa una finestra oberta en el navegador. En la figura figura es pot veure la jerarquia d’objectes que pengen de window.

En aquesta jerarquia, els descendents d’un objecte es representen mitjançant propietats de l’objecte. Per exemple, una imatge img1 és un objecte però també és una propietat de l’objecte document, i serà referenciat com a document.img1. Per referenciar una propietat s’han de precisar els seus ascendents. De fet, seria window.document.img1, però window, que és l’arrel, es pot ometre. Alhora aquesta imatge, com a objecte que és, té les seves propietats (típicament width i heigh): document.img1.width.

Com que una imatge forma part del contingut del document HTML més que no pas de les propietats del navegador, s’estudia amb més profunditat en la unitat “Model d’objectes del document”.

Un altre exemple: utilitzant la jerarquia podem saber la URL actual de la pàgina que estem visitant: window.location.href (o location.href).

El codi HTML per poder provar els anteriors exemples és:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="content-type" content="text/html; charset=utf-8">
  5. <title>Objecte window</title>
  6. </head>
  7. <body>
  8. <img src="./muntanya.jpg" name="img1" />
  9. <script>
  10. console.log(window.document.img1.width);
  11. console.log(document.img1.height);
  12. console.log(window.location.href);
  13. console.log(location.protocol);
  14. </script>
  15. </body>
  16. </html>

Evidentment, l’usuari haurà de tenim una imatge muntanya.jpg en la mateixa carpeta que el document HTML.

Propietats de window

Les propietats de window són:

  • defaultStatus: és el missatge que es visualitza en la barra d’estat del navegador.
  • frames: és la matriu de la col·lecció de frames que conté una finestra. Per exemple, si volem fer referència al primer frame de la finestra: window.frames[0]. frames.length és el número de frames que conté una finestra.
  • parent: ascendent d’una finestra.
  • self: fa referència a la finestra actual.
  • status: missatge que mostra l’estat del client web.
  • top: fa referència a l’arrel de la jerarquia d’objectes.
  • window: fa referència a la finestra actual.
  • innerWidth, innerHeight: amplada i altura interiors de la finestra.
  • closed: retorna un boolean indicant si la finestra s’ha tancat o no.
  • screenX, screenY: coordenades de la finestra en relació a la pantalla. Vàlid per als navegadors Google Chrome i IE (per a Firefox utilitzar screenLeft i screenTop).
  • opener: retorna una referència a la finestra que ha creat la finestra.
  • localStorage: retorna una referència a l’objecte localStorage que s’utilitza per emmagatzemar dades. Al contrari que les galetes, no té data d’expiració.
  • document, history, location, navigator, screen: són propietats de window que fan referència als objectes document, history, location, navigator, screen. Recordeu que formen part d’una estructura jeràrquica.
  • sessionStorage: retorna un objecte storage per emmagatzemar dades en una sessió web.

Les propietats més clares les podem veure en aquest exemple:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="content-type" content="text/html; charset=utf-8">
  5. <title>Objecte window</title>
  6. </head>
  7. <body>
  8. <script>
  9. console.log(window.innerWidth + '-' + window.innerHeight); //Pots redimensionar la finestra per veure com canvia aquest valor
  10. console.log(window.screenX + '-' + window.screenY); //Si mous la finestra de posició per veure com canvia aquest valor
  11. window.defaultStatus = "informació a la barra d'estat";
  12. console.log(window.defaultStatus);
  13. console.log(window.closed);
  14. </script>
  15. </body>
  16. </html>

Podeu veure l’exemple a: codepen.io/ioc-daw-m06/pen/JKWmdv.

Mètodes de window

Els principals mètodes de l’objecte window són:

  • alert(missatge): crea una finestra de diàleg on es mostra el missatge.
  • confirm(missatge): crea una finestra de confirmació (OK/Cancel) on es mostra el missatge. Retorna true o false.
  • prompt(missatge, text): crea una finestra de diàleg on es mostra el missatge i permet l’edició. El paràmetre text és el valor predeterminat. Igual que confirm(), conté Acceptar i Cancelar. Si acceptem, el mètode retorna el valor inserit (o el valor per defecte). Si cancelem, retorna null.
  • close(): només es poden tancar les finestres que també s’han creat amb un script.
  • stop(): atura la càrrega de la finestra.
  • setTimeout(expressió, msec): executa l’expressió que es passa com a argument, un cop han passat msec mil·lisegons. S’utilitza per prorrogar l’execució de l’expressió.
  • clearTimeout(timeoutID): restaura el compte enrere iniciat per setTimeout().
  • setInterval(expressió, msec): executa l’expressió passada com a argument cada msec mil·lisegons. S’utilitza per executar l’expressió a intervals regulars de temps.
  • open(url, windowName, params): crea una finestra nova, li associa el nom windowName, i accedeix a la URL que li hem passat. Li passem un conjunt de paràmetres que descriuen les propietats de la finestra. Entre d’altres: toolbar, width, height, left, top, fullscreen, resizable, location, status, scrollbars, menubar.

En el següent exemple utilitzem alguns d’aquests mètodes:

Cal tenir en compte que el nom de la finestra no és el títol i, per consegüent, no es mostra a la nova finestra.

  1. <html>
  2.  
  3. <head>
  4. <meta http-equiv="content-type" content="text/html; charset=utf-8">
  5. <title>Creació d´una finestra</title>
  6. </head>
  7.  
  8. <body>
  9. <script>
  10. let finestra = window.open("http://ioc.xtec.cat", "", "width=300,height=300, left=300, top=300, resizable=1");
  11. setTimeout(function() {
  12. finestra.close();
  13. }, 2000);
  14.  
  15. setTimeout(function() {
  16. let nom = prompt("Posa el nom de la finestra:", "Nom");
  17. crearFinestra(nom);
  18. }, 2000);
  19.  
  20. function crearFinestra(nom) {
  21. let opcions = "toolbar=0, location=0, directories=0, status=0,";
  22. opcions += "menubar=0, scrollbars=0, resizable=0, copyhistory=0,";
  23. opcions += "width=100,height=100";
  24. window.open("", nom, opcions);
  25. }
  26. </script>
  27. </body>
  28.  
  29. </html>

Podeu veure l’exemple a: codepen.io/ioc-daw-m06/pen/ezvPgG?editors=1002. Us recomanem, però, que proveu l’exercici amb un fitxer propi, ja que és posible que el prompt i les noves finestres siguin bloquejades.

L'objecte document

Quan un document HTML es carrega en un navegador web, obtenim un objecte document. L’objecte document és el node arrel d’un document HTML, i d’ell pengen tots els altres nodes: nodes d’elements, de text, d’atributs, de comentaris.

Recordeu que el document és part de l’objecte window i, per tant, s’hi pot accedir amb window.document.

Propietats de document

Les propietats de document són:

La programació amb cookies es detalla a l’apartat “Programació amb galetes, finestres i marcs” d’aquesta unitat.

  • location: conté la URL del document.
  • title: títol del document HTML.
  • lastModified: data de l’última modificació.
  • cookie: cadena de caràcters que conté la cookie associada al recurs representat per l’objecte.
  • Les propietats anchors, forms, images, links retornen un objecte amb el qual podem accedir a cadascun dels elements (àncores, formularis, imatges, enllaços) presents en el document.

El següent exemple utilitza algunes d’aquestes propietats:

Les propietats anchors, forms, images i links es veuran amb més detall a la unitat “Model d’objectes del document”.

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="content-type" content="text/html; charset=utf-8">
  5. <title>Objecte document. Propietats</title>
  6. </head>
  7. <body>
  8. <a href="http://ioc.xtec.cat">IOC</a><br />
  9. <img src="http://ioc.xtec.cat/educacio/templates/ioc/images/ioc_logo.png" /img>
  10. <script>
  11. console.log(`location: ${document.location}`);
  12. console.log(`títol: ${document.title}`);
  13. console.log(`lastModified: ${document.lastModified}`);
  14. console.log(document.links[0].href);
  15. console.log(document.links.item(0).href);
  16. console.log(document.images[0].src);
  17. </script>
  18. </body>
  19. </html>

Podeu veure l’exemple a: codepen.io/ioc-daw-m06/pen/yLeZmRw?editors=1011.

Mètodes de document

Els mètodes més importants de l’objecte document són:

  • write(): escriu codi HTML en el document.
  • writeln(): idèntic a write(), però inserta un retorn de carro al final.
  • open(tipus MIME): obre un buffer per recollir el que retorna els mètodes write() i writeln(). Els tipus MIME que es poden utilitzar són: text/html, text/plain, text/jpeg, etc.
  • close(): tanca el buffer.
  • clear():esborra el contingut del document.
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="content-type" content="text/html; charset=utf-8">
  5. <title>Objecte document. Mètodes</title>
  6. <script type="text/javascript">
  7. function ReemplacarContingut () {
  8. document.open ("text/html");
  9. document.write ("<a href=\"http://web.gencat.cat/ca/inici/\">gencat.cat</a><br />");
  10. document.write ("<img src=\"http://web.gencat.cat/web/.content/Imatge/marca_home/NG_logo_generalitat_home.png_602392567.png\" /img>");
  11. document.close ();
  12. }
  13. </script>
  14. </head>
  15. <body>
  16. <a href="http://ioc.xtec.cat">IOC</a><br />
  17. <img src="http://ioc.xtec.cat/educacio/templates/ioc/images/ioc_logo.png" /img><br />
  18. <button onclick="ReemplacarContingut();">Reemplaçar el contingut del document</button>
  19. </body>
  20. </html>

Podeu veure l’exemple a: codepen.io/ioc-daw-m06/pen/pbeYEK?editors=1000.

L'objecte location

L’objecte location conté informació sobre l’actual URL, conté les propietats de la direcció URL del document.

L’objecte location és part de l’objecte window i, per tant, s’hi pot accedir a través de la propietat window.location.

Propietats de Location

Les propietats de l’objecte location són:

  • hash: retorna la part de la URL que representa l’àncora (#). Per ex, url#IOC.
  • host: retorna el hostname i el número de port de la URL.
  • hostname: retorna el hostname de la URL.
  • href: retorna la URL sencera.
  • origin: retorna el protocol, hostname i port de la URL.
  • pathname: retorna el path de la URL.
  • port: retorna el número de port de la URL.
  • protocol: retorna el protocol de la URL.
  • search: retorna la part de querystring de la URL. Per ex, url?search=IOC.

Mètodes de location

Els mètodes més importants de l’objecte location són:

  • assign(): carrega un nou document.
  • reload(): recarrega el document actual.
  • replace(): reemplaça el document actual per un de nou.

Un exemple per veure la major part d’aquestes propietats i mètodes:

Si proveu l’anterior exemple com a fitxer HTML obtindreu location.protocol: file. Si el proveu com a pàgina web que ens serveix un servidor web obtindreu location.protocol: http.

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="content-type" content="text/html; charset=utf-8">
  5. <title>Objecte location. Propietats i Mètodes</title>
  6. <script type="text/javascript">
  7. function assignUrl () {
  8. document.location.assign('http://www.gencat.cat');
  9. }
  10. function reloadUrl () {
  11. document.location.reload();
  12. }
  13. function replaceUrl () {
  14. document.location.replace('http://www.gencat.cat'); // fixeu-vos que no tenim l'històric de tirar enrere
  15. }
  16. console.log(`location.hash: ${location.hash}`);
  17. console.log(`location.hostname: ${location.hostname}`);
  18. console.log(`location.href: ${location.href}`);
  19. console.log(`location.origin: ${location.origin}`);
  20.  
  21. console.log(`location.pathname: ${location.pathname}`);
  22. console.log(`location.port: ${location.port}`);
  23. console.log(`location.protocol: ${location.protocol}`);
  24. console.log(`location.search: ${location.search}`);
  25. </script>
  26. </head>
  27. <body>
  28. <a href="http://ioc.xtec.cat">IOC</a><br />
  29. <img src="http://ioc.xtec.cat/educacio/templates/ioc/images/ioc_logo.png" /img><br />
  30. <button onclick="assignUrl();">Mètode location.assign</button>
  31. <button onclick="reloadUrl();">Mètode location.reload</button>
  32. <button onclick="replaceUrl();">Mètode location.replace</button>
  33. </body>
  34. </html>

Podeu veure aquest exemple en el següent enllaç, però tingueu en compte que a la web de Codepen els botons no funcionaran: codepen.io/ioc-daw-m06/pen/ZEQwgaP?editors=1111.

L'objecte history

L’objecte history conté les URLs visitades per l’usuari (en el marc d’una finestra del navegador). L’objecte history és part de l’objecte window, i s’hi pot accedir a través de la propietat window.history.

Propietats d'history

La propietat més important de l’objecte history és:

  • length: retorna el nombre d’URL a la llista de l’històric de navegació.

Mètodes de history

Els mètodes més importants de l’objecte history són:

  • back(): carrega la URL prèvia en la llista de l’històric de navegació.
  • forward(): carrega la següent URL en la llista de l’històric de navegació.
  • go(): carrega una URL específica en la llista de l’històric de navegació.

Com a exemple, i sempre dins de la mateixa finestra, podeu navegar per les següents URLs, i finalment introduir la URL del codi que es proposa.

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="content-type" content="text/html; charset=utf-8">
  5. <title>Objecte history. Propietats i Mètodes</title>
  6. </head>
  7. <body>
  8. <button onclick="console.log(`Nombre elements: ${history.length}`);">Nombre d'elements a la llista</button>
  9. <button onclick="history.back()">URL anterior</button>
  10. </body>
  11. </html>

L'objecte navigator

L’objecte navigator conté informació sobre el navegador web que s’està utilitzant.

Propietats de navigator

Les propietats de navigator són:

  • appCodeName: retorna el codi del navegador, per exemple, Mozilla.
  • appName: retorna el nom oficial del navegador. Per exemple, en el cas de Mozilla Firefox, retorna netscape.
  • appVersion: la versió del navegador (potser no coincideix amb la versió real del navegador).
  • cookieEnabled: retorna true si les galetes estan habilitades.
  • language: retorna l’idioma del navegador.
  • onLine: retorna true si el navegador està en línia.
  • platform: retorna en quina plataforma es va compilar el navegador.
  • product: retorna el nom del motor del navegador.
  • userAgent: retorna tota la capçalera user-agent que el navegador envia al servidor en el protocol HTTP. Aquest valor l’utilitza el servidor per identificar el client. En aquesta capçalera sí que podem veure la versió real del nostre navegador (per exemple, Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:22.0) Gecko/20100101 Firefox/22.0).

En el següent exemple s’utilitzen les principals propietats de l’objecte navigator:

  1. console.log(`appCodeName: ${navigator.appCodeName}`);
  2. console.log(`appName: ${navigator.appName}`);
  3. console.log(`appVersion: ${navigator.appVersion}`);
  4. console.log(`cookieEnabled: ${navigator.cookieEnabled}`);
  5. console.log(`language: ${navigator.language}`);
  6. console.log(`onLine: ${navigator.onLine}`);
  7. console.log(`platform: ${navigator.platform}`);
  8. console.log(`product: ${navigator.product}`);
  9. console.log(`userAgent: ${navigator.userAgent}`);

Podeu veure l’exemple a: codepen.io/ioc-daw-m06/pen/wWJOJr?editors=1012.

L'objecte screen

L’objecte screen conté informació sobre la pantalla on està obert el navegador del client. Aquesta informació s’extreu a partir de les propietats descrites més avall. En canvi, no té mètodes. No s’ha de confondre l’objecte screen amb l’objecte window, que representa la finestra del navegador.

Propietats d'Screen

Les propietats d‘screen són:

Als dissenyadors web sempre els ha preocupat saber quina és la resolució del navegador del client per tal que les pàgines web es vegin bé en els diferents formats de pantalla. Avui en dia, gràcies a frameworks com bootstrap, l’adaptació de la web a diferents formats de pantalla és molt més fàcil.

  • availHeight: retorna l’altura de la pantalla.
  • height: retorna l’altura total de la pantalla. La diferència amb availHeight és l’altura de la barra de tasques (depèn del sistema operatiu).
  • availWidth: retorna l’amplada de la pantalla.
  • width: retorna l’amplada total de la pantalla.
  • colorDepth: retorna la resolució de la paleta de colors (en número de bits). Per exemple: 8 significa 256 colors; 24 significa 16 milions de colors.
  • pixelDepth:retorna la resolució de color (en bits per píxel) de la pantalla.

En el següent exemple s’utilitzen les principals propietats de l’objecte screen que acabem de veure:

  1. console.log(`availHeight: ${screen.availHeight}`);
  2. console.log(`height: ${screen.height}`);
  3. console.log(`availWidth: ${screen.availWidth}`);
  4. console.log(`width: ${screen.width}`);
  5. console.log(`colorDepth: ${screen.colorDepth}`);
  6. console.log(`pixelDepth: ${screen.pixelDepth}`);

Podeu veure l’exemple a: codepen.io/ioc-daw-m06/pen/NWxoQzz?editors=0012.

Anar a la pàgina anterior:
Exercicis d'autoavaluació
Anar a la pàgina següent:
Activitats