Professional Documents
Culture Documents
Javascript Tutorial
Javascript Tutorial
A lexemple anterior, la variable elMueCotxe rep una nova instncia de lobjecte cotxe, creada amb la
paraula clau new, que s el constructor de la classe. En terminologia de la programaci orientada a
objectes diem que elMeuCotxe s una instncia de la classe cotxe, o sigui, s un exemplar de la classe
cotxe. Amb aquesta instncia ja podrem treballar, li podem canviar el valor de les seves variables,
per exemple elmeuCotxe.color=Verd, podem cridar els seus mtodes, elmeuCotxe.frenar() o fins i tot
podem programar la resposta als diferents esdeveniments del mateix.
Observeu que per treballar amb objectes fem servir la notaci punt. Consisteix en escriure el nom
de lobjecte seguit dun punt i la propietat o el mtode a que ens referim. Aix per accedir a la
propietat color de lobjecte elMeuCotxe, fem elMeuCotxe.color, si volem accedir a un mtode utilitzarem
la mateixa tcnica elMeuCotxe.frenar() la diferncia est en que el mtode sempre acaba amb un
parell de parntesis. Alguns mtodes requereixen que dins dels parntesis li passem un o ms
parmetres, que sn valors que necessita la funci associada al mtode pel seu correcte
funcionament.
A la figura 3.1 podeu veure com est estructurat el model dobjectes duna pgina web. Observeu
que hi ha elements que sn considerats objectes i hi ha daltres que sn colleccions. Com ja sabem tot
en JavaScript es considera un objecte, per dins les nostres pgines hi ha objectes que es
repeteixen ms duna vegada, per exemple les imatges, doncs acostuma ha haver-hi ms duna en
cada pgina. En aquests casos el model dobjectes agrupa aquests elements en forma de
colleccions, daquesta manera els mant organitzats i ens facilita accedir a cada element de la
collecci duna manera ms rpida. Ms endavant veurem com treballar amb colleccions.
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
-2-
Veureu que en el nivell ms alt tenim lobjecte window del que penja tota lestructura del nostre
web. Lobjecte window representa la finestra en la que est corrent el navegador.
La nostra web pot estar formada per una nica pgina, que en el DOM sidentifica per lobjecte
document. Tamb podem tenir un sistema de pgines format per frames (una collecci) en aquest
sistema, com ja sabeu, cada frame mostra la seva prpia pgina, s a dir el seu propi document.
Si seguim explorant el model dobjectes veurem que cada pgina (document) t nomes un objecte
body a banda dun component element mitjanant el que podrem accedir a qualsevol element de la
pgina. Tamb podem veure les diferents colleccions dels elements que pot contenir una pgina
web: all, anchors, applets, forms... Observeu tamb que en la collecci forms, cada formulari pot
contenir una srie delements: botons, caixes de text, camps ocults...
Tamb tenim la collecci all que engloba a tots els elements de la pgina, siguin del tipus que
siguin. Ja veurem la seva utilitat quan tractem les colleccions.
3.1.2 Objectes nadius del llenguatge.
Tret de les arrays a les que dedicarem un apartat ms endavant, a continuaci veurem els objectes
predefinits del llenguatge, que es defineixen just per sota del nivell de window. Molts daquests
objectes en realitat sn un embolcall (wrapper) dels tipus de dades nadius, que ja hem vist
(booleans, numrics i cadenes), aix vol dir que crear una instncia dun daquests objectes
equival a declarar una variable directament amb un valor. Per tant des daquetes variables que
declarem directament podem fer servir les propietats i mtodes de lobjecte embolcall.
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
-3-
Produeix la sortida de la figura 3.2. Fixeu-vos, que al constructor se li pot passar opcionalment un
valor, que ser el que determinar el valor inicial de la variable que estem creant, tenint en
compte els segents criteris: si no assignem valor inicial, o si el valor passat s 0, -0, null, "", fals,
sense definir o NaN el valor de l'objecte s'estableix en false. Per a qualsevol altre valor s'estableix
a true (fins i tot per la cadena "false")!
Aquesta seria la manera formal de declarar una variable booleana (lembolcall explicat ms
amunt), per la creaci de variables no sacostuma a fer daquesta manera, perqu ja hem vist que
hi ha una forma ms rpida de crear una variable de tipus boolean:
var bol1=true;
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
1970/01/01
-4-
Tot i que aquest exemple pretn mostrar la forma en que podem assignar una data en el moment
de crear-la, tamb ens ensenya que la informaci en que es mostra una data s bastant
complicada. Fins i tot podrem dir que inclou massa dades, per com ja hem dit, lobjecte Date
tamb ofereix molts mtodes que ens permetran separar la informaci en parts (any, mes, dia
hora..) per poder treballar amb ella duna manera ms cmoda.
MTODES DOBTENCI DE DADES DE LOBJECTE DATE
Amb els mtodes daquest grup, podrem obtenir informaci parcial sobre qualsevol data
emmagatzemada dins un objecte Date.
Mtode
Descripci
getDate()
getDay()
getFullYear()
getHours()
getMilliseconds()
getMinutes()
getMonth()
getSeconds()
getTime()
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
-5-
getUTCDay()
getUTCFullYear()
getUTCHours()
getUTCMonth()
getUTCSeconds()
getYear()
Examineu el codi i compareu-lo amb el resultat que produeix (figura 3.4). Com podeu veure, el
mtode getDay(); dna com a resultat un nmero que indica el dia de la setmana que correspon a la
data, comenant per 0 que s el diumenge. Aquest nmero lhem fet servir en una estructura switch
per seleccionar el dia de la setmana en lletres. Hi ha una manera ms fcil de fer-ho, que s fent
servir arrays, que veurem ms endavant.
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
-6-
Qu s UTC-GMT?
s el temps universal coordinat (Universal Time Coordinated). El temps de la zona horria de
referncia respecte de la qual es calculen totes les altres zones del mn. Aix tenim que, per
exemple, quan a Tarragona sn les 10 de la nit, a Nova York sn les 4 de la tarda, aix s aix
perqu la sortida i posta de sol s diferent en cada lloc de la terra i en Tarragona respecte a Nova
York tenim una diferncia de 6 hores.
Arran de la necessitat de coordinar accions de diferents indoles: econmiques, socials, militars,
aeronutiques, etc. es va acordar definir un punt de referncia horria comuna per tot el mn.
Daquesta manera es va crear la zona GMT (Greenwich Meridian Time: temps mitj de
l'Observatori de Greenwich, a Londres).
L'hora GMT es basa en la posici mitjana del Sol i va ser definida per primera vegada a partir del
migdia de Greenwich. Per l'1 de gener de 1925 es va adoptar la convenci que les 00:00
representessin la mitjanit, endarrerint aquell dia 12 hores. A partir daleshores GMT se segueix
definint segons la mitjanit de Greenwich.
Com que la rotaci de la Terra s estable per no constant i es retarda o avana de manera nfima
respecte al temps atmic, GMT pateix de certa imprecisi ja que es basa en el moviment mitj del
Sol i en la rotaci de la terra. Va ser per aix que es va definir l'hora UTC, la qual t una gran
precisi, ja que est calculada per rellotges atmics, i representa quin s el temps universal (basat
en les estrelles). A efectes prctics, pel nostre curs, considerarem que GMT i UTC s el mateix.
Tamb sha de tenir en compte la incorporaci de lhorari destiu en la gran majoria de pasos del
mn. Com veiem, JavaScript tamb ho reconeix quan treballem amb els seus mtodes. Fixeu-vos a
la primera sortida de lexemple anterior:
Avui s Tue Aug 21 2012 11:00:50 GMT+0200 (Hora de verano romance)
Lexemple est executat el dia 21 dagost de 2012 a les 11:00:05 en Tarragona. El navegador ens
informa que lhora est 2 per sobre de GMT, una per la diferncia horria entre Espanya i lhora de
Greenwich i una altra perqu estem en lhorari destiu.
Perqu tot aix funcioni correctament, el nostre ordinador ha de tenir la data i lhora configurades
correctament, ja que JavaScript sexecuta en el client i per tant les dates de referncia les agafa de
la configuraci del Sistema Operatiu del client.
A la taula de mtodes podeu veure que molts daquests estan repetits, diferenciant-se entre ells
noms perqu apareix la paraula UTC, ara ja sabeu a que es refereix. Tot seguit veiem un altre
exemple que calcula la diferncia local amb la UTC:
<SCRIPT type="text/javascript">
var data = new Date()
var dif=data.getTimezoneOffset();
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
-7-
La sortida indica -120 minuts, es a dir 2 hores (igual que abans), per, perqu s negatiu? Quan
aquest mtode mostra el resultat en forma dun nmero negatiu, indica que la nostra zona horria
es troba a lest de la zona GMT, mentre que un nmero positiu indica que ens troben a loest.
Lexemple sest executant al meu ordinador en Tarragona, el sistema operatiu t activada la
configuraci regional dEspanya. Per tant el resultat negatiu est indicant que Espanya es troba a
lest (a la dreta) de la zona GMT. Podeu tenir una referncia aproximada de les zones horries
mirant el mapa de la figura 3.6
Igual que a lexemple anterior, aquest mtode tamb t en compte si la data est afectada per
lhorari destiu o no.
Figura 3.6. Mapa de zones o fusos horaris. Els lmits no s'ajusten als meridians per adaptar-se a les fronteres internacionals o
a les diferents unitats administratives en qu es divideixen els pasos.
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
-8-
Descripci
setDate()
setFullYear()
setHours()
setMilliseconds()
setMinutes()
setMonth()
setSeconds()
setTime()
setUTCDate()
El dia del mes d'un objecte Date d'acord amb l'hora universal
setUTCFullYear()
setUTCHours()
Estableix l'hora
universal
d'un
objecte
Date
d'acord amb
l'hora
setUTCMonth()
setUTCSeconds()
setYear()
Tant el mtode setYear(), com el getYear() de lapartat anterior, estan marcats com obsolets i
desaprovats, i es recomana utilitzar els seus equivalents setFullYear() i getFullYear().
Inicialment noms existien els dos primers ( setYear() i getYear() ) que tractaven lany com a un
nmero de dos dgits. Amb larribada de lany 2000 ens vrem trobar amb un problema: lany 12,
sest referint a 1912 o a 2012? En aquest moment van haver disparitat de solucions, cada
navegador anava a la seva. Per evitar aquest problema, la ECMA International, que s lorganisme que
regula el llenguatge JavaScript (tcnicament anomenat ECMAScript) va incorporat les noves
versions daquestes instruccions ( setFullYear() i getFullYear() ), amb les quals lany es va passar a
tractar com a un nmero de 4 dgits, daquesta manera el problema va desaparixer de soca-rel.
Els navegadors encara accepten les formes obsoletes, noms per compatibilitat amb pgines
antigues, que encara les puguin incloure.
Amb aquests mtodes podem, per exemple, calcular la data de venciment duna factura a pagar en
3 mesos:
<SCRIPT type="text/javascript">
var data = new Date()
document.write("Avui s <b>"+ data +"</b><br />");
var nouMes=data.getMonth()+3;
data.setMonth(nouMes);
document.write("El venciment de la factura s el <b>"+ data +"</b><br />");
</SCRIPT>
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
-9-
Com podeu veure, hem recuperat el ms que correspon a la data davui, li hem sumat 3 i lhem
desat a la variable nouMes. A continuaci hem substitut el mes de lobjecte data pel contingut de la
variable nouMes, generant aix la nova data, s a dir a la data original li hem sumat 3 mesos.
Quan fem aquests tipus doperacions no hem de patir per si ens passem del rang. Per exemple, si
estem en octubre, que seria el mes 9 (recordeu que es numeren de 0 a 11) i diem que li sumi 3
mesos, donar el mes 9+3=12, que no existeix. JavaScript sap que estem treballant amb dates i
automticament el converteix en gener (mes 0) i li suma 1 a lany. s a dir la data resultant ser
gener de lany segent.
Aquest comportament tamb el t quan operem amb la resta de components de lobjecte Date
(dies, mesos, hores, minuts...). Si al fer una operaci ens passem del lmit perms, inicia de nou el
compte i incrementa en 1 el interval immediatament superior. Per exemple, si a 59 minuts li
sumem 20, utilitza un minut per completar una hora i la data final tindr una hora ms i els 19
minuts restants.
Si li hagussim sumat un nmero ms gran, que impliqui vries hores (per exemple sumar-li 500
minuts), el clcul es far igualment de manera correcta, incrementant les hores que calgui. s ms,
si el nmero que sumem es tan gran que implicaria canviar de dia, tamb ho far sense cap
problema.
Tampoc ens hem de preocupar de si el mes t 28, 29, 30 o 31 dies, JavaScript tamb ho sap.
Finalment, tamb se nadona si un any de trasps o no, treballant perfectament amb les dates que
els inclouen.
MTODES DE CONVERSI
Es tracta de diferents mtodes de lobjecte Date que ens permeten bsicament convertir els valors
entre strings i dates. A la taula segent els podeu veure.
Mtode
Descripci
parse()
toDateString()
toGMTString()
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 10 -
toTimeString()
toUTCString()
UTC()
valueOf()
Descripci
LN2
LN10
LOG2E
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 11 -
PI
SQRT1_2
SQRT2
Exemple:
<SCRIPT type="text/javascript">
<!-document.write("El valor de PI s " + Math.PI +"<BR />");
document.write("El nmero d'Eules s " + Math.E +"<BR />");
document.write("L'arrel quadrada de 2 s " + Math.SQRT2 +"<BR />");
document.write("Longitut d'una circunferncia de radi 5 = " + 2 * Math.PI * 5);
//-->
</SCRIPT>
Descripci
abs(x)
acos(x)
asin(x)
atan(x)
atan2(x,y)
ceil(x)
cos(x)
exp(x)
floor(x)
log(x)
random()
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 12 -
sin(x)
sqrt(x)
tan(x)
Alguns daquests mtodes gaireb no els utilitzarem mai a les nostres pgines web, s poc
probable que feu servir els mtodes dedicats a clculs trigonomtrics, daltres potser si que els
farem servir ms.
Si us fixeu a la taula, tenim un mtode per resoldre larrel quadrada (sqrt(x)), per potser trobareu
a faltar mtodes per calcular altres arrels diferents a larrel quadrada. Per exemple, com es fa una
arrel cbica? En matemtiques sabem que una arrel sempre es pot expressar en forma de
potncia. Aix tenim que larrel quadrada de 16 s el mateix que 16 elevat a .
i en general
Com que disposem del mtode pow que pot realitzar qualsevol potncia, ja tenim resolt el nostre
problema. Al segent exemple calculem larrel cbica de 27.
<script language="javascript">
<!-var resultat=Math.pow(27,1/3);
document.write ("L'arrel cbica de 27 s " + resultat);
//-->
</script>
El mtode Random cada vegada que el cridem ens proporciona un nmero aleatori diferent
comprs entre 0.0000000... i 0.999999... s a dir, pot ser 0 per no arribar mai a 1 tot i que shi
pot acostar molt. Per tant aquest mtode el podem utilitzar per fer simulacions o fins i tot
programar jocs datzar. Ara b, potser us esteu preguntant, si noms retorna nmeros entre 0 i
0.99999... com ho faig per simular un dau, per exemple? La resposta est, com abans, en la
utilitzaci de les matemtiques. Al segent exemple simulem el llanament de un dau 10 vegades.
<script language="javascript">
<!-var r;
for(x=1;x<=10;x++){
r = Math.floor((Math.random()*6))+1;
document.write ( "Tirada " + x + ", ha sortit " + r + "<BR />");
}
//-->
</script>
Repassant el codi, veureu que es tracta dun bucle for que es repetir 10 vegades, per tant ja tenim
els 10 llanament del dau. El llanament ho simulem en la lnia:
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 13 -
A la figura 3.10 podeu veure la sortida que produeix. Estudieu detingudament el codi, presteu
especial atenci a la lnia que apareix en negreta, mostra com es poden generar nmeros aleatoris
entre un rang determinat, en lexemple els lmits del rang els hem demanat a lusuari mitjanant la
instrucci prompt().
Veiem que hem fet:
Demanem el lmit inferior i el superior i els emmagatzemen en les variable inf i sup,
respectivament.
Muntem un bucle for que donar 10 voltes i generar 10 nmeros, aix podrem comprovar que el
resultat sadapta als lmits especificats. En cada volta del bucle, treien un nmero aleatori
comprs entre els lmits desats a les variables inf i sup. La instrucci amb la que ho aconseguim s:
r = Math.floor(Math.random()*(sup-inf+1)) + inf;
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 14 -
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 15 -
Proveu amb diferents valors, tant pel nmero inicial com pels decimals, fins i tot podeu provar
dentrar un numero enter i dir-li que larrodoneixi a 2 decimals, per exemple.
Si esteu realitzant clculs financers, recordeu que l'arrodoniment no necessriament s sempre
l'enfocament correcte. El total d'una cistella de la compra, per exemple, sempre sha darrodonir al
cntim ms proper. Per, en altres casos, s possible que vulgueu utilitzar Math.floor o Math.ceil (per
arrodonir cap avall o cap amunt, respectivament), en lloc de Math.round.
Descripci
MAX_VALUE
MIN_VALUE
s "+Number.MAX_VALUE+"<BR />");
Lobjecte t els segents mtodes, (tots ells retornen un valor de tipus string):
Mtode
Descripci
toExponential(x)
toFixed(x)
toPrecision(x)
toString()
valueOf()
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 16 -
Una altra cosa que hem de tenir en compta s que si volem mostrar informaci formatada, per
exemple amb dos decimals, i no tenim prou xifres per generar els dos decimals, el resultat en
forma de string afegeix zeros, mentre que si convertim a numric aquests zeros desapareixen:
var num = 185;
document.write(num.toFixed(3));//Mostra 185.000
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 17 -
toPrecision(x), s semblant a lanterior, per ara el parmetre x indica la longitud que tindr la
cadena resultant, contant tant la part entera com els decimals (el punt de separaci de
decimals no es compta). Si no passem el parmetre x, retorna el nmero sencer.
toString(), ja lhem vist en un apartat anterior, retorna el valor numric convertit en string. T
un parmetre opcional que indica la base en la que volem que ens retorni el valor. Pot de ser un
nombre enter entre 2 i 36. (2-binary, 8-octal, 16-hexadecimal, etc.). Proveu el segent exemple:
<script language="javascript">
<!-var num = 185;
var a = num.toString();
document.write(a+"<br />");
var b = num.toString(2);
document.write(b+"<br />");
var c = num.toString(8);
document.write(c+"<br />");
var d = num.toString(16);
document.write(d+"<br />");
var e = num.toString(25);
document.write(e+"<br />");
//-->
</script>
valueOf(), fa el mateix que toString() sense parmetres, retorna el nmero convertit en cadena.
3.1.2.5 Lobjecte String
Amb aquest objecte podrem manipular cadenes de text. Noms t una propietat length, que retorna
la longitud de la cadena, s a dir, el nmero de carcters que la forma.
<script language="javascript">
<!-var cadena = "Hola Manola";
document.write(cadena.length+"<br />");
//-->
</script>
El resultat daquest codi s el valor numric 11, que sn el nmero de carcters de la frase Hola
manola fixeu-vos que lespai tamb compta.
Pel que respecta als mtodes, tenim un ampli ventall, amb ells podrem manipular totes les
variables de tipus string.
Mtodes genrics de lobjecte String :
Mtode
Descripci
charAt()
charCodeAt()
concat()
lastIndexOf()
match()
replace()
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 18 -
slice()
split()
substr()
substring()
toLowerCase()
toUpperCase()
valueOf()
Estudiem-los en detall:
charAt(pos), torna el carcter que es troba en la posici marcada per l'atribut pos. Hem de
tenir en compte que l'ndex del primer carcter de la cadena s 0, per tant lltim ser el
resultat de length-1 . Si el valor de pos no s vlid (igual o major que la longitud de la cadena o
negatiu) el mtode retorna undefined. Exemple, el segent codi retorna la posici del tercer
carcter de la cadena nom:
var cadena = "HOLA MANOLA";
var C3 = cadena.charAt(2);
Retornar "L", que s el tercer carcter per l'esquerra (el seu ndex s 2).
charCodeAt(pos), Funciona igual que lanterior, per en comptes del carcter que hi ha a la
posici, aquest retorna el codi Unicode del carcter. Exemple:
var cadena = "HOLA MANOLA";
var c3 = cadena.charCodeAt(2);
Retornar 76 que s el codi Unicode de la tercera lletra (la L).
fromCharCode(codis). Crea una cadena a partir dels codis Unicode que se li passin com
parmetres. Aquest s un mtode esttic de l'objecte String, i la sintaxi s sempre
String.fromCharCode ().Per exemple:
var cadena = String.fromCharCode (65,66,67);
La variable cadena contindr "ABC", que sn els carcters corresponents als codis 65, 66 i 67.
indexOf( cad, inici), retorna la posici de la primera aparici d'un valor especificat en una
cadena. Aquest mtode retorna -1 si el valor no es troba.
Nota: El mtode indexOf () distingeix entre majscules i minscules. Admet un segon argument
inici opcional, que indica des de quina posici sha de comenar la recerca, si s'omet comena a
buscar pel primer carcter. Si donem valors negatius o majors que la longitud de la cadena al
segon argument es consideren 0. Exemple:
var cadena = "m.lara@mimail.com";
var arrova = cadena.indexOf ('@');
var punt = cadena.indexOf ('.', arrova);
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 19 -
de la posici 6 per cap enrere, el punt que ara troba s el primer, que est en la posici 1
(recordeu que es comena a numerar des de 0).
per us puc avanar que s com una llista amb tots els resultats.
replace( subcadena, cadena ) totes les cadenes que concordin amb el primer argument
subcadena seran reemplaades pel segon argument, cadena. El primer parmetre pot ser una
cadena o una expressi regular. Per exemple en la cadena "Cada paraula dita s una paraula
falsa" volem canviar paraula per frase
<script language="javascript">
<!-var cadena = new String("Cada paraula dita s una paraula falsa");
cadena = cadena.replace("paraula", "frase");
document.write(cadena);
//-->
</script>
Proveu lexemple i observeu que shan substitut totes les ocurrncies de paraula per frase. La
sortida ha estat: Cada frase dita s una frase falsa. Aquest mtode diferencia entre majscules i
minscules, mireu aquest altre exemple:
<script language="JavaScript">
<!-var cadena = new String("Joan Pera menja una pera en la sopera");
cadena = cadena.replace(/pera/g, "poma");
document.write(cadena);
//-->
</script>
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 20 -
search (), cerca en la cadena un valor especificat, o una expressi regular i retorna la posici
on lha trobat o un -1 si no es troba cap coincidncia. Majscules i minscules les considera
diferents. Exemple:
<script language="javascript">
<!-var cadena = new String("Joan Pera menja pera en la sopera ");
pos1 = cadena.search("pera");
pos2=cadena.search(/pera/i);
document.write("pos1= "+pos1+"<br />");
document.write("pos2= "+pos2);
//-->
</script>
Desprs dexecutar lexemple, pos1 valdr 16 i pos2 valdr 5, fixeu-vos que en
slice(inici,final), retorna la porci de cadena compresa entre les posicions donades pels
arguments inici i final, o el final de la cadena si s'omet el segon argument. Si final s negatiu,
s'interpreta com el final de la cadena menys el nmero negatiu.
<script language="javascript">
<!-var frase="Hola Manola";
var n=frase.slice(0);
document.write("Treballem la frase<b> "+ frase+"</b><br />");
document.write("frase.slice(0) = <b>"+n+"</b><br />");
n=frase.slice(5)
document.write("frase.slice(5) = <b>"+n+"</b><br />");
n=frase.slice(5,9)
document.write("frase.slice(5,9) = <b>"+n+"</b><br />");
n=frase.slice(1,-3)
document.write("frase.slice(1,-3) = <b>"+n+"</b><br />");
//-->
</script>
Amb el segon parmetre negatiu, n=frase.slice(1,-3), estem dient: des de la posici 1 fins 3 abans del
final. Recordeu que les posicions comencen per zero.
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 21 -
Produeix la sortida de la figura 3.13. A la frase original a anat tallant cada vegada que trobava un
espai i les porcions les ha anat desant en una matriu. Tot i que encara no hem treballat les
matrius, ja sabem que s com una llista, quan li diem que mostri el contingut de la matriu n,
mostra tots els elements de la llista separats per una coma, si li diem que mostri n[3] li estem
manant que mostri el element que es troba a la posici 3 de la llista i mostra nixer, les llistes
tamb es comencen a numerar per zero.
substr( inici, longitud), Extreu una subcadena que comena en el carcter indicat per inici, i
retorna el nombre de carcters especificat en longitud. Per extreure carcters des del final de la
cadena, doneu a inici un valor negatiu (Aquesta caracterstica no funciona en IE 8 ni anteriors).
El mtode substr() no canvia la cadena original.
<script language="javascript">
<!-var frase="Pere Calders va nixer i va morir a Barcelona entre el 1912 i el
1994";
var n=frase.substr(5,7);
document.write(n+"<br />");
n=frase.substr(-14,4)
document.write(n+"<br />");
//-->
</script>
En la primera instrucci en negreta frase.substr(5,7); li estem dient: a partir de la posici 5 agafa 7
- 22 -
Escriu a la pantalla joan gmez pea, proveu lexemple amb altres frases amb accents i
diferents tipus de carcters.
toUpperCase(), funciona igual que lanterior per retorna la cadena en majscula.
var frase="joan lvarez ocaa";
document.write(frase.toUpperCase()+"<br />");// retorna JOAN LVAREZ OCAA
Descripci
anchor()
big()
blink()
bold()
fixed()
fontcolor()
fontsize()
italics()
link()
small()
strike()
sub()
sup()
- 23 -
Descripci
appCodeName
appName
appVersion
cookieEnabled
onLine
platform
userAgent
Que produeix en Internet Explorer la sortida que podeu veure a la figura 3.14
Lobjecte navigator t com a mtodes noms dos, javaEnabled() i taintEnabled(), el primer retorna un
boolean que informa si el navegador t actiu o no Java. El segon est obsolet i saconsella no
utilitzar-lo, va desaparixer amb JavaScript 1.2, indica si est actiu o no un mtode antic denviar
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 24 -
La sentncia for-in, executa el cos del bucle per cada element duna collecci o dun array. Al
exemple for (prop in window.navigator) la collecci que fem servir s window.navigator que inclou totes les
propietats de lobjecte navigator.
Li estem diem: agafa la primera propietat de window.navigator, assigna-la a lobjecte prop i a
continuaci executa el cos del bucle, quan acabis agafa la segona propietat de window.navigator,
torna a assignar-la a prop i torna a executar el bucle. Continua aix fins hagis passat per totes les
propietats. Com podeu veure es tracta duna forma senzilla de recrrer tots els elements duna
collecci, sense ni tan sols saber quants nhi ha a la mateixa.
En el cos del bucle hem fet : document.write(prop + " = " + window.navigator[prop] + "<br />") , escrivim prop,
que s el nom de la propietat que sest avaluant, concatenada amb un igual i el valor de la
propietat, que lobtenim fent window.navigator[prop].
Descripci
availHeight
availWidth
colorDepth
height
pixelDepth
width
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 25 -
De fet, si us pareu a pensar una mica, veureu que aquesta regla ja lhem estat utilitzant en tots els
exemples en els que apareixia lordre document.write(), ja que la sintaxis complerta hauria de ser
window.document.write(), doncs document depn directament de window. Podeu provar :
window.document.write(window.document.lastModified);
Descripci
closed
document
frames
history
innerHeight
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 26 -
length
location
name
opener
outerHeight
outerWidth
pageXOffset
pageYOffset
parent
screen
screenLeft
screenTop
screenX
screenY
self
status
top
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 27 -
Descripci
alert()
blur()
confirm()
moveBy()
moveTo()
open()
print()
prompt()
resizeBy()
resizeTo()
scrollBy()
scrollTo()
setInterval()
setTimeout()
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 28 -
Analitzem el codi:
Primer que res observeu la instrucci var tempo=setInterval("rellotge()",1000); est dient que cada 1000
milisegons (1 segon) executi la funci rellotge(), i que desi en la variable tempo una referncia al
temporitzador que acaba de crear.
Tamb declarem una variable booleana funciona que la inicialitzat a true. La farem servir per marcar
lestat del rellotge (si est en marxa o aturat).
Com li hem manant que cada segon sexecuti la funci rellotge(), la funci ha dexistir sin ens
donar error. Fixeu-vos en el codi i veureu que lhe escrita una mica ms avall.
La funci rellotge() fa el segent:
Crea una variable d amb la data i hora del sistema i a partir de ella extreu la hora local i la desa en
una altra variable t. Finalment la instrucci document.getElementById("hora").innerHTML=t; cerca en tot el
document un element que estigui identificat amb la propietat id=hora, quan el trobi, li assigna a
la seva propietat innerHTML el valor de la variable t, es a dir la hora actual (aquest procs es
repeteix cada segon).
Si analitzeu el codi veure que al comenament hi ha una lnia de HTML, que diu:
<span id="hora"> </span><br />
s aquest element <span> el que trobar la instrucci getElementById, perqu est identificat
id="hora". Per la seva banda innerHTML=t li est dient que el contingut de <span>, es a dir el que hi ha
entre la etiqueta <span> i </span>, ha de mostrar el valor de t (la hora).
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 29 -
Amb aquesta instrucci aturem el temporitzador referenciat per tempo, si us recordeu agafvem
aquesta referncia en el moment de crear el temporitzador tempo=setInterval("rellotge()",1000); De la
seva banda la instrucci document.getElementById("boto").value="Engegar rellotge"; fa el mateix que hem
explicat abans, cerca el element identificat com a boto (que s el bot) i li canvia la seva propietat
value per "Engegar rellotge".
3.3.2.4. Exemple redimensionat de finestres
<!DOCTYPE html>
<html>
<head>
<script>
var finestra;
function obrir(){
finestra=window.open('','', 'width=100,height=100');
finestra.focus(); //Li assignem el focus perqu no s'amagui
}
function redi(){
finestra.resizeTo(500,500);
finestra.focus();
}
function augmenta(){
finestra.resizeBy(5,5);
finestra.focus();
}
function mou(){
finestra.moveTo(100,100);
finestra.focus();
}
function mouRel(){
finestra.moveBy(-10,-10);
finestra.focus();
}
</script>
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 30 -
onclick="obrir()">Crear window</button>
onclick="redi()">Redimensionar window</button>
onclick="augmenta()">Augmentar mida</button>
onclick="mou()">Moure a 100,100 mida</button>
onclick="mouRel()">Moure -10, -10</button>
es
tancar
passats
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 31 -
confirm(), genera un quadre de dileg amb una pregunta i dos botons (dacord i cancellar)
que ens permeten respondre afirmativament o negativament a la pregunta. Retorna true o
false segons el bot polsat. Exemple:
<script>
var r=confirm("Voleu continuar?")
if (r==true)
{
alert("Has seleccionat SI")
}
else
{
alert("Has seleccionat No")
}
</script>
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 32 -
Podeu veure que, hi ha propietats que estan en blanc, aix passa perqu estem executant la pgina
directament des de larxiu, sense la intervenci de cap servidor, (fixeu-vos que el protocol s file).
El mtode search(), retorna la cadena amb els parmetres que li passem en el moment de
cridar-la, mireu la figura 3.21 i observeu que ara hem cridat la mateixa pgina dabans, per
passant-li dos valors com a parmetres i observeu tamb el resultat del mtode search().
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 33 -
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 34 -
a la llista de l'historial.
Pel que fa als mtodes noms hi ha tres, sn els que ens permetran desplaar-nos per lhistorial.
back(), carrega la pgina immediatament anterior, s el mateix que clicar el bot anterior
del navegador o fer history.go(-1).
forward(), carrega la pgina immediatament posterior a lactual. s el mateix que clicar el
bot segent del navegador o fer history.go(1).
go(posici), carrega la URL de la llista de l'historial que ocupa la posici indicada. El
parmetre pot ser un nombre enter positiu o negatiu (positiu per pgines posteriors i
negatiu per les anteriors), tamb pot ser una cadena que representa una URL.
3.3.5 Lobjecte document.
Fa referncia al document o pgina que estem visualitzant en el navegador. Tots els elements que
formen part de la pgina (pargraf, imatges, formularis, enllaos, etc.) estan inclosos dins de
lobjecte document i per tant podem accedir a ells des del nostre codi.
Mitjanant aquest objecte podrem afegir o modificar el contingut de la nostra pgina. Potser sigui
un dels objectes ms utilitzats en la programaci en JavaScript, ja que ens dona accs a tots els
elements que conformen la pgina.
Si torneu a la figura 3.1 de la pgina 46, veureu que lobjecte document est format per una srie
de colleccions. Tots els elements dun mateix tipus que apareixen dins una pgina estan agrupats
en forma de collecci. Aix tenim que si, per exemple, a la pgina hi ha nou imatges, (creades amb
letiqueta <img>) el conjunt de totes elles formen la collecci document.images. El mateix passa amb
la resta delements de la pgina. A continuaci fem una referncia a les colleccions de la pgina:
anchors: s una collecci de tots els punts darribada dun enlla (ancores) dins la pgina.
Dit duna altra manera es tracta de tots els elements <A> de HTML que tenen definit
latribut NAME.
Embeds: tots els elements embeds de la pgina (est obsolet i desaconsellat).
forms: la collecci de tots els formularis que apareguin en el nostre document.
images: com ja hem vist, totes les imatges que apareixen a la pgina.
links: es tracta de tots els enllaos que hi ha definits a la pgina. Generalment es tracta de
tots els enllaos de tipus <A> que tenen definit latribut href:, per tamb inclou a les
etiquetes <Area> que tinguin activat latribut href: .Recordeu que letiqueta <AREA> de
HTML sutilitza amb imatges mapejades per indicar lrea o regi duna imatge associada a
un enlla: <area shape="rect" coords="0,0,80,100" href="altes.htm" />.
Totes aquestes colleccions es consideren com a un array, en el que cada element emmagatzema
una referncia al corresponent objecte de la pgina. Les referncies s'emmagatzemen en la matriu
en el mateix ordre en qu shan definit en el codi HTML.
Per tant podem accedir als seus elements de la mateixa manera en que fem amb els arrays: var
primerLink=document.liks[0]; (seria el primer link que apareix a la pgina).
Si no sabem la posici en que apareix a la pgina, tamb podem accedir a elles utilitzant el nom
que li vrem assignar en HTML en el moment de crear-les, per exemple:
var link=document.links[institut]; ens retornaria lenlla corresponent a letiqueta de HTML:
<A href=http://www.vidalibarraquer.net NAME=institut> Web de linstitut </A>
Tot i que us les he mostrat de manera allada, les colleccions de lobjecte document en realitat sn
propietats, que emmagatzemen una array dobjectes. Tot seguit veurem la resta de propietats de
document, que no sn colleccions.
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 35 -
- 36 -
Amb la primera lnia obtenim larray amb totes les referncies i en la segona accedim a un
lelement concret de la llista. Exemple:
document.getElementsByTagName("p");
document.getElementsByTagName("p")[3];
La primera lnia obt un array amb la referncia a tots els pargrafs que hi ha a la nostra pgina,
mentre que la segona, accedeix directament al quart pargraf (es comencen a numerar per 0).
Finalment, indicar que es poden combinar els mtodes vistos per seleccionar una llista d'elements
dins d'un element concret:
document.getElementById("unID").getElementsByTagName("li");
document.getElementsByTagName("div")[1].getElementsByTagName("p");
La primera lnia ens retornaria tots els elements <li> duna llista identificada
bot,
La funci mitjanant getElementById localitza un element que tingui un id=text (letiqueta <span>) i
ho assigna a la variable d, per tant ara d s letiqueta <span>. A continuaci, mostra un missatge
alert informant del text contingut en letiqueta <span> d.innerHTML i en la lnia segent el canvia per
Hola, fent: d.innerHTML="Hola";
Tot seguit podeu veure un exemple en el que fem servir getElementsByName(). Copieu-lo,
executeu-lo i mireu el resultat. Examineu detingudament el codi i intenteu comprendre el seu
funcionament.
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 37 -
Tamb podem crear una finestra en blanc amb window.open i escriure en ella tota la informaci
que volguem fent servir el mateix mtode:
finestra=window.open("","","width=300,height=200");
finestra.document.write("<h1>Finestra 1</h1>");
A banda daquest sistema, JavaScript tamb ens ofereix una srie de mtodes per afegir elements a
lestructura d'un document. Els ms bsics sn createElement, que crea un element, i
createTextNode, que crea un node de text o dit duna altra manera: el text que contindr
lelement.
createElement
Amb aquest mtode podrem crear un element especfic. La seva sintaxi s molt senzilla:
document.createElement ("elementACrear");
Aix, per crear un nou pargraf farem document.createElement ("p") presteu atenci a les cometes i a les
majscules i minscules, en HTML no importa per en JavaScript letiqueta sha dexpressar en
minscules. Amb aquesta instrucci hem creat lelement, per encara no lhem incorporat a la
posici que li correspondr dins de la pgina, per tant encara no s visible. Tingueu pacincia, una
mica ms endavant veurem com incloure'l a la seva posici.
createTextNode
Una vegada creat lelement, podem crear un text mitjanant createTextNode amb el que poblar-lo.
La seva sintaxi s:
document.createTextNode ("text");
El text a crear mitjanant aquest mtode tamb ha d'anar entre cometes. Igual que passava al
mtode anterior, fins que no ubiquem lelement el text no ser visible.
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 38 -
El nou node s'inclou immediatament desprs dels fills ja existents (si hi ha algun).
Per exemple, el segent codi incorpora a la pgina el pargraf que havem creat i dna per
finalitzat lexemple que fins ara anvem seguint:
<html>
<head>
<script>
function afegirP(){
var paragraf = document.createElement("p");
var text = document.createTextNode("He afegit un nou pargraf");
paragraf.appendChild(text);
document.body.appendChild(paragraf);
}
</script>
</head>
<body id="cos">
<h2>Benvinguts</h2>
<br />
<input type="button" onclick="afegirP()" value="afegir pargraf" />
</body>
</html>
Com hem vist, primer creem el pargraf document.createElement ("p"), desprs el text que
contindr document.createTextNode("He afegit un nou pargraf") . A continuaci fem servir dues
vegades appendChild, una per inserir el node de text dins de lelement p, i una altra per incloure el
pargraf directament dins el body del document document.body.appendChild(paragraf);. Si us en
recordeu, la forma de indicar el contenidor era: elementPare.appendChild(nouNode); fixeu-vos
que com a elementPare, he fet servir el resultat de document.body es a dir, el body de la pgina.
insertBefore
Bsicament fa el mateix que el mtode anterior, per insertBefore ens permet triar un node
(element) del document i incloure el que volem afegir per davant que ell. La seva sintaxi s:
elementPare.insertBefore (nouNode, nodeDeReferencia);
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 39 -
Quan sexecuta la funci creem un nou pargraf igual que havem fet a lapartat anterior, i li
assignem el text Nou pargraf. Una vegada que lelement est creat, ja podem accedir a les seves
propietats, tot i que encara no sigui visible, a lexemple li he dit que la lletra sigui vermella
(nouP.style.color="red";). Abans dinserir el nou pargraf a la pgina, necessitem una referncia al
element que volem fer servir com a referncia per inserir davant seu el nou pargraf (el segon
pargraf) segonP = document.getElementById("pare").getElementsByTagName("p")[1];
A continuaci inserim el nou pargraf (nouP) al davant del segon pargraf (segonP) que aparegui
dins del div pare document.getElementById("pare").insertBefore(nouP, segonP);
Tot seguit podeu veure un altre exemple en el que cada vegada que cliquem un bot afegim una
caixa de text input a un formulari. Tamb tenim un bot que informa de quants inputs tenim creats i
com podem accedir a ells. Copieu-lo, executeu-lo i mireu el resultat. Examineu detingudament el codi
i intenteu comprendre el seu funcionament.
<html>
<head>
<script type="text/javascript"><!-// crear entrades input davant del bot Submit
function afegir() {
var nouInput = document.createElement("input");
nouInput.setAttribute("type", "text");
nouInput.setAttribute("name", "num[]");
nouInput.style.display = 'block';// estil css --> display:block;
//hem creat: <input type="text" name="num[]"style="display:block" />
var referencia = document.getElementById('submit');
var pare = referencia.parentNode; //El pare de submit (de refer), o sigui form
// Afegeix l'input davant del bot submit amb insertBefore
pare.insertBefore(nouInput, referencia);
}
function quants(){
alert("Total de caixes; "+document.forms[0].elements['nume[]'].length +
"\nla primera cont " +document.forms[0].elements['nume[]'][0].value)
}
--></script>
</head>
<body>
<form action="">
<input type="text" name="num[]" /> //El name ser num[0]
<input type="submit" value="Submit" id="submit" /><br /><br />
<input type="button" value="Afegir caixa" onclick="afegir()" />
<input type="button" value="Quants porten?" onclick="quants()" />
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 40 -
Els mtodes que hem vist aqu no funcionen en versions anteriors a Internet Explorer 9.
Una altra forma de fer createTextNode
Com hem vist createTextNode, genera el text que inserirem en lelement que estem creant. A
vegades aquest text tamb pot incloure altres etiquetes que li donen format, per exemple,
imagineu que volem crear un pargraf com ara el segent:
<p>Aquest pargraf t <em>formats</em> i ms <strong> formats</strong>. </p>
Des del punt de vista del DOM tenim un node pare (p), que cont:
Crear-lo amb els dos mtodes vistos requeriria un codi bastant complicat,com ara aquest:
var elem_p = document.createElement('p');
var elem_em = document.createElement('em');
var elem_strong = document.createElement('strong');
var txt_01 = document.createTextNode(' Aquest pargraf t ');
var txt_02 = document.createTextNode('formats');
var txt_03 = document.createTextNode(' i ms ');
var txt_04 = document.createTextNode('formats');
var txt_05 = document.createTextNode('.');
elem_em.appendChild(txt_02);
elem_strong.appendChild(txt_04);
elem_p.appendChild(txt_01);
elem_p.appendChild(elem_em);
elem_p.appendChild(txt_03);
elem_p.appendChild(elem_strong);
elem_p.appendChild(txt_05);
document.body.appendChild(elem_p);//Afegim el pargraf al body
Com podeu veure s una feina bastant tediosa, tot i que aquesta s la manera correcta de crear-lo.
Per podem fer servir un altre mtode, que consisteix en usar el mtode innerHTML, quedaria:
var nouP=document.createElement('p');
nouP.innerHTML ='Aquest pargraf t
</strong>.'
<em>formats</em>
ms
<strong>formats
Atenci: La propietat innerHTML no est reconeguda per cap especificaci del W3C, encara que
es podria considerar com un estndard de consens, ja que tots els navegadors actuals el suporten.
3.5 Aplicacions prctiques dels marcs
Els marcs o frames permeten partir la pantalla del nostre navegador en dos o ms parts, de
manera que podem mostrar una pgina (un document) diferent en cada una delles
simultniament. Per comenar podem fer un petit reps a com es crea una pgina amb marcs,
observeu lexemple:
<!DOCTYPE html>
<html>
<head>
<title>Marcs</title>
</head>
<frameset cols="50%,*" border=1>
<frame name="esquerre" src="pag1.html" />
<frame name="dreta" src="pag2.htm " />
</frameset>
</html>
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 41 -
Fixeu-vos que s una pgina HTML que no inclou JavaScript, mostra dues llistes de selecci
<select> que ens permeten triar un color i un dels marcs al que assignar-li lesmentat color.
Pel que fa a pag2.html, que mostrarem en el frame dret:
<html>
<head>
<title>Dreta</title>
<script type="text/javascript">
function canviar(){
var co = parent.frames[0].document.getElementById("colorF");
var nouColor = co.options[co.selectedIndex].value;
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 42 -
Hem programat lesdeveniment onload de body, o sigui cada vegada que es carregui la pgina
sexecutar el codi.
Bsicament s fa una pregunta: if(top.location!=this.location), la URL de la pgina principal (top.location)
s diferent de la URL daquesta pgina (this.location)? Si la resposta s vertadera, significa que estan
intentant inclourem en un frame i ho impedeixo top.location=this.location.
Lobjecte this, representa al propi frame des del que estem donant lordre. En comptes de this,
tamb podrem haver fet servir self, que s una propietat de lobjecte window i fa referncia a la
prpia finestra. Recordeu que cada frame en realitat s un objecte window, per tant, tcnicament
self es referix al frame en el que est contingut. Lodre podria haver estat:
<body
onload="
if(top.location!=self.location)
top.location=self.location;">
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 43 -
En aquest programa hem donat entrada per primera vegada a un concepte nou, al que dedicarem
tot un apartat per ell sols ms endavant. Es tracta del concepte de funci definida per lusuari.
Una funci s una porci de codi que escriurem generalment en la secci <HEAD> de la pgina, la
identifiquem amb la paraula clau function seguida dun nom pel que la volem identificar, uns
parntesis i finalment el codi que la conforma, delimitat per claus { i }:
function salutacio()
{
Alert("Hola com estas?");
}
Aquest codi no sexecuta immediatament, sin que resta a lespera de ser cridat perqu sexecuti.
Lavantatge s que el podem cridar/executar tantes vegades com necessitem des de una mateixa
pgina, de manera directa des del nostre codi, o com a resposta a una acci de lusuari, tal com
hem fet a lexemple:
<input type="button" value="Obrir finestra Vidal" onclick="obrir()">.
Com veieu, he creat un bot i l estic dient que quan el polsin (onclick) busqui una funci que es
diu obrir() i que lexecuti.
Anlisis del codi:
Primer de tot, fixeu-vos que he declarat una variable finestra al comenament del codi, fora de
qualsevol funci i de qualsevol estructura de codi. Es tracta duna variable global que mantindr
el seu valor durant tota lexecuci de la pgina (veieu lapartat 2.1.3).
A continuaci hem creat 3 funcions, que com hem dit resten a lespera de ser cridades per entrar
en escena.
Finalment dins la secci BODY de HTML, hem creat 3 botons, cadascun dells cridar a la funci
corresponent cada vegada que el cliquem.
La funci obrir()
function obrir(){
finestra=window.open("","","width=300,height=200");
finestra.document.write("<h1>Finestra 2</h1>");
}
La primera instrucci window.open s la que sencarrega dobrir una finestra nova, fixeu-vos que
el resultat lassignem a la variable finestra, el que fa aquesta assignaci s desar una referncia
de la nova finestra a la variable/objecte finestra. Podem dir que finestra representa la finestra
que acabem de crear.
Qu fa la lnia finestra.document.write("<h1>Finestra 2</h1>");?
Ja hem vist que la instrucci document.write(), escriu en el document actual, amb aquesta instrucci
per, li diem
finestra.document.write("<h1>Finestra 2</h1>"). Li estem dient que la instrucci
document.write sha de realitzar sobre lobjecte finestra, que s la que acabem de crear i lhem
associat al noma finestra.
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 44 -
Aquesta funci s mol senzilla, primer de tot mirem si finestra t valor, if(finestra) si encara no sha
obert la finestra aquesta variable est declarada per encara no se li ha assignat res per tant cont
el valor undefined i la instrucci if retorna false. En cas contrari la variable cont un objecte window,
que representa la finestra que acabem dobrir i la instrucci if retorna true, que vol dir que la
finestra existeix, amb la qual cosa la tanquem amb finestra,close().
La funci estat()
function estat(){
if (!finestra){
alert ("La finestra no ha estat mai oberta")}
else{
if (finestra.closed){
alert("La finestra ja ha est tancada");}
else
{alert("La finestra est oberta")
}
}
Daquesta manera li estem diem que mostri un bot amb el rtol Obrir finestra, aix no t cap
dificultat ja que s HTML, normal i corrent, la novetat est en la part marcada en negreta. Li estem
dient que controli lesdeveniment onclik del bot i que quan es produeixi que executi la funci
obrir(). Ms endavant ja tractarem ms detingudament els esdeveniments i veurem que hi ha
gran varietat dells segons lobjecte al que saplica (botons, imatges, enllaos, caixes de text...).
La sintaxis del mtode window.open()
Abans dacabar el comentari de lexemple voldria aprofitar per explicar la sintaxis de
window.open(), t la forma segent:
window.open(URL,nom,opcions,reemplaar).
URL, s una cadena on sespecifica l'adrea URL de la pgina que es mostrar en la finestra que
acabem de crear. Si no s'especifica una URL (si es passa una cadena buida "" ), la nova finestra
mostra about: blank.
nom, s una cadena que especifica el nom que li volem posar a la finestra, es pot ometre passant
una cadena buida "".
Opcions, Una cadena que cont una llista delements separada per comes que indica el
comportament o laparena que tindr la nova finestra. Podem especificar les segents opcions:
Modificador
Descripci
directories=yes|no|1|0
fullscreen=yes|no|1|0
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 45 -
height=pixels
left=pixels
top=pixels
location=yes|no|1|0
menubar=yes|no|1|0
resizable=yes|no|1|0
scrollbars=yes|no|1|0
status=yes|no|1|0
titlebar=yes|no|1|0
toolbar=yes|no|1|0
A la taula anterior yes o 1 vol dir que volem activar el modificador mentre que no o 0 indica
que no el volem.
Atenci: Els navegadors moderns tenen la tendncia al minimalisme, treballant amb pestanyes i
procurant deixar el mxim despai per visualitzar la pgina. Per aconseguir-ho oculten la majoria
delements dels que hem parlat aqu (menubar, directories, toolbar, status...). Quan nosaltres
obrim una finestra des de codi, malgrat que li diguem que mostri qualsevol daquests elements, si
el navegador est configurat per no mostrar-los la nova finestra no els mostrar.
Per tant, si voleu provar aquestes opcions haure dactivar prviament la visualitzaci daquests
elements al vostre navegador. Veiem el segent exemple:
finestra=window.open("","","width=300, height=200, menubar=1, toolbar=1,
El meu navegador Internet Explorer 9, per defecte noms mostra location (el lloc on escrivim
ladrea a la que volem navegar), tot i que jo li estic demanant que la finestra nova mostri tots els
elements, fixeu-vos que passa (figura 3.22).
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 46 -
Tornem a provar el programa amb la qual cosa obtenim el resultat de la figura 3.23.
Fixeu-vos en la finestra de sota, com tenim visibles tots els elements (mens, barra destat,
location,...), quan cliquem el bot sobre la finestra2, on podeu veure que tamb t visibles tots els
elements tret de location i status, que els hem marcat amb un 0 en la instrucci window.open.
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 47 -
Hem creat una finestra i hem desat una referncia a ella en la variable nova, posteriorment la fem
servir per afegir contingut a la finestra que acabem de crear, Un cas especial s la lnia:
nova.document.write('<input type="button" value="pulsame" onclick='+
"\"opener.document.f1.nom.value='hola';\" />")
s a dir, un bot que quan el polsem (onclick), escriu hola dins la caixa de text nom que pertany
al formulari f1, del document de la finestra pare: opener.document.f1.nom.value='hola' fixeu-vos que lhe
interpretat al revs comenant pel final, de vegades aquesta sintaxi per treballar amb objectes
sentn millor daquesta manera.
3.8 Galetes (cookies)
Les galetes sn una petita pea d'informaci enviada per un lloc web, sn emmagatzemades al
navegador de l'usuari, d'aquesta manera el lloc web pot consultar aquesta informaci per
controlar l'activitat prvia de l'usuari.
Per exemple, podem portar el control d'usuaris: Quan un usuari introdueix el seu nom d'usuari i
contrasenya, aquestes es poden emmagatzemar en una cookie perqu no lhagi de tornar a
introduir en cada pgina del servidor. No obstant aix, la galeta no identifica una persona, sin a
una combinaci ordinador-navegador-usuari.
Originalment, noms podien ser emmagatzemades per petici des del servidor, per Netscape va
donar al llenguatge Javascript la capacitat d'introduir-les directament des del client. Les galetes
poden ser esborrades, acceptades o bloquejades segons es desitgi, per fer-ho, noms sha de
configurar convenientment el navegador web.
3.8.1 Estructura duna galeta
Es pot emmagatzemar gran varietat d'informaci fent servir galetes. Aquesta informaci s una
cadena de text en la forma variable = valor. Heu de tenir en compte que totes aquestes variables van
en una sola cadena de no ms de 4KB i que podem tenir ms duna parella variable=valor
separant-les de la segent per un punt i coma (;).
La informaci mnima obligatria que ha de tenir una cookie ha de ser una parella variable/valor,
formada per un nom de variable i el valor corresponent que volem assignar, aquest valor no pot
contenir els carcters punt, espai en blanc ni punt i coma. Si no tenim ms remei que fer servir un
daquests carcters abans els haurem de codificar. Entre els mtodes que podem utilitzar tenim
encodeURIComponent() per codificar i decodeURIComponent() per descodificar. Tamb ho podem fer amb
escape() i unescape().
Aquestes funcions reemplacem els carcters especials pel seu valor UNICODE en la forma
%ValorHex, per exemple:
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 48 -
Quan acabem despecificar les parelles variable=valor podem especificar una srie de camps
opcionals que afectaran al comportament de la galeta:
max-age, per defecte totes les galetes tenen una vida til igual a la sessi del navegador, s
a dir, quan tanquem el navegador la galeta desapareix. Lopci max-age pot alterar aquest
comportament per defecte i fer que sigui vlida durant ms o menys temps. Per especificar
el temps de vida simplement li hem de donar a la variable max-age el nombre de segons
desitjat. Per exemple, si volem que la galeta sigui vlida per 30 dies posarem:
"idioma=cat; max-age=2592000
expires, fa el mateix que lanterior, per indicant la data de caducitat de la galeta, aquesta
data ha destar expressada en format GMT, per tant podem fer servir el mtode toGMString de
lobjecte Date. Atenci: Aquest sistema est obsolet i desaconsellat, es mant per
compatibilitat, es recomana fer servir max-age.
Exemple imagineu que volem enviar una galeta amb el valor idioma=catal i que caduqui
en 30 dies, la cadena que formar la cookie la generem de la segent forma (encara no lhem
enviat):
var galeta
var avui=new Date();
avui.setDate(avui.getDate() + 30);//li sumen 30 dies a avui
galeta="idioma="+escape("catal") + "; expires="+avui.toUTCString();
alert (galeta)
path, Tota galeta, per defecte, noms s vlida per les pgines de la carpeta de la pgina
actual i inferiors. s a dir, si la pgina http://domini.com/seccio-1/article4.html envia una galeta,
aquesta ser vlida tamb per a totes les pgines sota http://domini.com/seccio-1/ i per pgines
inferiors com per exemple http://domini.com/seccio-1/categoria-3/article8.html per no per
http://domini.com o http://domini.com/seccio-2.
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 49 -
Produeix la sortida:
idioma=catal%E0; expires=Sun, 07 Oct 2012 16:48:24 GMT;secure
Totes aquestes opcions que acabem de veure sn noms reservats que tenen un significat per la
cookie, per tant no els podem fer servir com a nom en una parella nom=valor.
3.8.2 Com enviar una galeta en JavaScript
Enviar una galeta s bastant simple, noms necessitem assignar-li a la propietat document.cookie el
valor duna cadena de text amb lestructura correcta duna galeta, es a dir, que contingui les
variables de la nostra galeta i els modificadors que creiem convenients:
var galeta
var avui=new Date();
avui.setDate(avui.getDate() + 30);//li sumen 30 dies a avui
galeta="idioma="+escape("catal") + "; expires="+avui.toUTCString();
document.cookie=galeta;
Si volem afegir altres galetes a la mateixa pgina, amb informaci diferent (dades, caducitat...),
noms haurem de repetir el procs: generar la nova galeta i assignar-la a document.cookie. :
Document.cookie=novaGaleta;
Amb qualsevol altra propietat o variable, al assignar-li un valor esborra el contingut anterior i el
substitueix pel nou. Per la propietat cookie t un comportament especial, quan es troba una
assignaci no esborra el contingut anterior, sin que el nou lincorpora a una collecci que
contindr totes les galetes de la pgina (atenci no existeix cap collecci cookies en plural-).
3.8.3 Com llegir una galeta
En aquest punt ja hem enviat una galeta, per no ens servir de res si no la podem recuperar quan
l'usuari torni a visitar la nostra pgina.
Per llegir una galeta, el primer ser comprovar si la galeta existeix, o sigui, si l'hem enviada i
roman guardada en el navegador.
if (document.cookie.length != 0)
La propietat length ens retorna el nombre de galetes que tenim, per tant, si sacompleix la
condici existeixen galetes.
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 50 -
Hem creat dues galetes idioma=catal i nom=pepe, cadascuna delles amb la seva corresponen data de
caducitat. Amb la instrucci alert li diem que ens mostri el contingut de les galetes i fixeu-vos que
ha mostrat: idioma=catal%E0;nom=pepe, est mostrant el conjunt de parelles nom=valor, la resta de la
informaci de la galeta (en el nostre cas la data de caducitat) tamb la t controlada el navegador,
per no la mostra en cap cas.
Mireu tamb que catal surt codificat catal%E0, aix passa perqu quan vrem crear la galeta
vam utilitzar lordre escape("catal"). Aquests casos shan de tenir en compte quan recuperem el
valor de la galeta, per recuperar el valor original, fent unescape(valorRecuperat).
Per localitzar la galeta que ens interessa haurem de fer una mica de programaci:
var inici,fi,valor;
var galeta="idioma=" //volem llegir la galeta idioma
var dc = document.cookie; // Recuperem la cadena amb totes les galetes
if (dc.length > 0)//Si la cadena no est buida, hi ha galetes
{
inici = dc.indexOf(galeta); //cerquem la galeta a la cadena
if (inici != -1)
{
//l'hem trobada
inici += galeta.length;
fi = dc.indexOf(";", inici);
if (fi == -1) fi = dc.length;
valor= unescape(dc.substring(inici, fi));
alert(valor);
}
else
{
alert("no trobada");
}
}
Aquest codi est lligat a que prviament, shagin generat les galetes idioma i nom, com hem fet a
lexemple anterior.
Podeu estudiar el codi i mirar dentendre-ho, si no lenteneu no patiu, a classe ho explicar
detingudament. Canvieu la segona lnia var galeta="idioma=" per var galeta="nom=", Observeu el
resultat.
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 51 -
Recordeu que new.Date, retorna la data i la hora (hora:minuts:segon:milisegons) actuals, per tant
la galeta nom caducar un milisegon desprs dexecutar-se lordre.
Una altra forma en que ho podrem haver fet s amb lopci max-age:
document.cookie = "nom=joan;max-age=0;
Li estem dient que el temps de vida de la galeta nom s de 0 segons, es a dir: ja ha caducat.
Miquel Lara Pea -Professor dAplicacions i Sistemes InformticsInstitut Vidal i Barraquer Tarragona
- 52 -