<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Formulari_i_events._T%C3%A8cniques_avan%C3%A7ades</id>
	<title>Formulari i events. Tècniques avançades - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Formulari_i_events._T%C3%A8cniques_avan%C3%A7ades"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Formulari_i_events._T%C3%A8cniques_avan%C3%A7ades&amp;action=history"/>
	<updated>2026-08-30T02:22:44Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=Formulari_i_events._T%C3%A8cniques_avan%C3%A7ades&amp;diff=257770&amp;oldid=prev</id>
		<title>Joan: /* Ftixers */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Formulari_i_events._T%C3%A8cniques_avan%C3%A7ades&amp;diff=257770&amp;oldid=prev"/>
		<updated>2018-09-20T15:29:39Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Ftixers&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Introducció=&lt;br /&gt;
Veurem una tècnica avançada de com podem associar events als camps d'un formulari. Amb aquesta tècnica aconseguim un codi net, doncs estem separant la part de contingut del formulari de la part de comportament del formulari (el disseny també està separat doncs s'utilitzen fulls d'estil). Aquesta tècnica s'utiltiza per exemple a http://langtrainer.joanillo.org.&lt;br /&gt;
=Referències=&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/DOM/element.addEventListener&lt;br /&gt;
*https://sites.google.com/site/jiansenjavascripttutorial/chapter9-5-example-addeventlistener&lt;br /&gt;
*http://help.dottoro.com/ljeuqqoq.php&lt;br /&gt;
Llibreria '''validate.js''': (mirar!)&lt;br /&gt;
*http://rickharrison.github.io/validate.js/&lt;br /&gt;
&lt;br /&gt;
=Teoria1. 3 tècniques per fer events=&lt;br /&gt;
fitxer ''events_3_tecniques.html'':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;es-ES&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Events d'un formulari: tres tècniques, de pitjor a millor&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;meta name=&amp;quot;description&amp;quot; content=&amp;quot;Comptar elements&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;funcions.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body onload=&amp;quot;afegir_events()&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Events dun formulari: tres tècniques, de pitjor a millor&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
nom1: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nom1&amp;quot; onchange=&amp;quot;num_min_car(this.value,5)&amp;quot; &amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
nom2: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nom2&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
nom3: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nom3&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
fitxer ''funcions.js'':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function num_min_car(value,vnum_min_car) {&lt;br /&gt;
	//alert(value);&lt;br /&gt;
	if (value.length &amp;lt; vnum_min_car) {&lt;br /&gt;
		alert('com a mínim ' + vnum_min_car + ' caràcters');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function num_min_car_v2(elem,vnum_min_car) {&lt;br /&gt;
	var value=elem.value;&lt;br /&gt;
	//alert(value);&lt;br /&gt;
	if (value.length &amp;lt; vnum_min_car) {&lt;br /&gt;
		alert('com a mínim ' + vnum_min_car + ' caràcters');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function afegir_events() {&lt;br /&gt;
document.forms[0].elements[1].setAttribute(&amp;quot;onChange&amp;quot;,&amp;quot;num_min_car(this.value,5)&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener&lt;br /&gt;
//If you want to pass parameters to the listener function, you may use an anonymous function&lt;br /&gt;
var elem = document.forms[0].elements[2];&lt;br /&gt;
elem.addEventListener(&amp;quot;change&amp;quot;, function(){num_min_car_v2(elem, 5)}, false);&lt;br /&gt;
//No funciona doncs per passar paràmetres s'ha d'utilitzar una funció anònima&lt;br /&gt;
//elem.addEventListener(&amp;quot;change&amp;quot;, num_min_car_v2(elem, 5));&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=Teoria2=&lt;br /&gt;
Fitxers que es necessiten:&lt;br /&gt;
*us_users.php (http://langtrainer.joanillo.org/us_users.php): és una pàgina típica amb un formulari de registre (a part de la funció d'afegir usuari té altres funcions com ara cercar, editar, esborrar).&lt;br /&gt;
*js_forms.js: és la llibreria de les funcions de Javascript que s'utilitzen, i concretament també les funcions '''nou_event0''', etc que comentarem. És un script que és comú per a tota l'aplicació&lt;br /&gt;
*js_form_us.js: són les instruccions de Javascript que incorporen els events al formulari.&lt;br /&gt;
&lt;br /&gt;
Anem a veure pas per pas aquests tres fitxers.&lt;br /&gt;
&lt;br /&gt;
==Fitxer us_users.php==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php include( &amp;quot;inc_head.php&amp;quot; ); ?&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;?php include( &amp;quot;inc_cap_esq_dreta.php&amp;quot; ); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ##### Zona principal ########################################################## --&amp;gt;&lt;br /&gt;
        &amp;lt;script src=&amp;quot;js_aux.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script src=&amp;quot;js_users.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;zona_ppal&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
	&amp;lt;div class=&amp;quot;required&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;label class=&amp;quot;w80&amp;quot; for=&amp;quot;mail&amp;quot;&amp;gt;mail:&amp;lt;/label&amp;gt;&lt;br /&gt;
	&amp;lt;input id=&amp;quot;txt&amp;quot; name=&amp;quot;mail&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
    &amp;lt;/div&amp;gt; &amp;lt;!-- fi zona_ppal--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php include( &amp;quot;inc_peu.php&amp;quot; ); ?&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;js_forms.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;js_form_us.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Veiem com utilizem els ''include'' per incorporar tot el codi referent a la capçalera, les barres esquerra i dreta, i el peu de pàgina. Els scripts ''js_aux.js'' i ''js_users.js'' no tenen rellevància referent al que anem a explicar. Tenen a veure amb les funcions AJAX per afegir, editar, esborrar els usuaris.&lt;br /&gt;
&lt;br /&gt;
Hem ficat com a exemple un sol element del formulari, el que fa referència al correu electrònic. Fixem-nos bé que aquest camp del formulari no té associat cap event per tal de validar que el mail sigui correcte.&lt;br /&gt;
&lt;br /&gt;
El que sí que ens importa són els scripts ''js_forms.js'' i ''js_form_us.js''. Fixem-nos bé que aquests scripts estan al final de tot, un cop s'han carregat els elements del formulari (el input del mail i els altres elements).&lt;br /&gt;
==Fitxer js_forms.js==&lt;br /&gt;
Aquest script és la llibreria de les funcions Javascript que utiltizarem. Concretament conté la funció que el mail estigui ben formatat. Per simplicitat la única cosa que fa és que contingui un punt i una arroba. A classe ja hem vist que amb l'ús de les expressions regulars es pot aconseguir de forma bastant simple una validació de mail molt més ben feta:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function EsMail(element){&lt;br /&gt;
        /*de moment, comprova que hi ha . i @*/&lt;br /&gt;
        var bIsValidMail;&lt;br /&gt;
        bIsValidMail = element.value.indexOf(&amp;quot;@&amp;quot;)&amp;gt;-1 &amp;amp;&amp;amp; element.value.indexOf(&amp;quot;.&amp;quot;)&amp;gt;-1;&lt;br /&gt;
        if (!bIsValidMail){&lt;br /&gt;
                alert(&amp;quot;no valid mail&amp;quot;); /*tr*/&lt;br /&gt;
                element.value=&amp;quot;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        return bIsValidMail;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
function textCounter(element,maxlimit){&lt;br /&gt;
        if (element.value.length &amp;gt; maxlimit) /* if too long...trim it!*/&lt;br /&gt;
        element.value = element.value.substring(0, maxlimit);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
A més a més, aquest script conté les següent funcions que explicarem més avall&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function nou_event0(element, event, funcio) {&lt;br /&gt;
      if (element.addEventListener) {&lt;br /&gt;
            element.addEventListener(event, funcio, false); /*Mozilla*/&lt;br /&gt;
      } else {&lt;br /&gt;
            element.attachEvent(&amp;quot;on&amp;quot;+event, funcio); /*IE*/&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function nou_event1(element, event, funcio, param1) {&lt;br /&gt;
      if (element.addEventListener) {&lt;br /&gt;
            element.addEventListener(event, function(){funcio(param1)}, false);&lt;br /&gt;
      } else {&lt;br /&gt;
            element.attachEvent(&amp;quot;on&amp;quot;+event, function(){funcio(param1)});&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function nou_event2(element, event, funcio, param1,param2) {&lt;br /&gt;
      if (element.addEventListener) {&lt;br /&gt;
            element.addEventListener(event, function(){funcio(param1,param2)}, false);&lt;br /&gt;
      } else {&lt;br /&gt;
            element.attachEvent(&amp;quot;on&amp;quot;+event, function(){funcio(param1,param2)});&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
amb el mètode '''addEventListener''' estem afegint de forma dinàmica events a diferents elements, events que es comportaran executant unes funcions que poden incloure paràmetres. En aquest cas definim diferents funcions per distingir el cas de què no volem passar paràmetres, o bé 1, 2, ... paràmetres.&lt;br /&gt;
&lt;br /&gt;
==js_form_us.js==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (window.location.toString().indexOf(&amp;quot;us_users.php&amp;quot;)&amp;gt;0) {&lt;br /&gt;
&lt;br /&gt;
        //on som&lt;br /&gt;
        var oDiv=document.getElementById(&amp;quot;barra&amp;quot;);&lt;br /&gt;
        oDiv.innerHTML=&amp;quot;&amp;lt;a href='us_welcome.php'&amp;gt;LangTrainer&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;amp;#187;&amp;amp;nbsp;&amp;lt;a href='us_users.php'&amp;gt;Users&amp;lt;/a&amp;gt;&amp;quot;; /*&lt;br /&gt;
&lt;br /&gt;
        nou_event1(document.forms[0].name, &amp;quot;change&amp;quot;,checkmaj,document.forms[0].name);&lt;br /&gt;
        nou_event2(document.forms[0].name, &amp;quot;keyup&amp;quot;,textCounter,document.forms[0].name,30);&lt;br /&gt;
        nou_event2(document.forms[0].login, &amp;quot;keyup&amp;quot;,textCounter,document.forms[0].login,10);&lt;br /&gt;
        nou_event2(document.forms[0].pwd1, &amp;quot;keyup&amp;quot;,textCounter,document.forms[0].pwd1,10); /*20*3=60*/&lt;br /&gt;
        nou_event2(document.forms[0].pwd2, &amp;quot;keyup&amp;quot;,textCounter,document.forms[0].pwd2,10);&lt;br /&gt;
        nou_event2(document.forms[0].mail, &amp;quot;keyup&amp;quot;,textCounter,document.forms[0].mail,30);&lt;br /&gt;
        nou_event1(document.forms[0].mail, &amp;quot;change&amp;quot;,EsMail,document.forms[0].mail);&lt;br /&gt;
        nou_event3(document.getElementById(&amp;quot;infopng&amp;quot;), &amp;quot;mouseover&amp;quot;,displayInfoFor,'infopng','info',30); /*30 em (amplad&lt;br /&gt;
        nou_event2(document.getElementById(&amp;quot;infopng&amp;quot;), &amp;quot;mouseout&amp;quot;,hideInfoFor,'infopng','info');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En aquest cas veiem com, després de què s'hagi carregat el formulari, afegim tots els events associats al formulari. Concretament, per al mail afegim l'event ''keyup'' que executarà la funció ''textCounter'' i que limita el número de caràcters a 30; i afegim l'event ''change'' que executa la funció ''EsMail'' i que fa una comprovació bàsica del mail.&lt;br /&gt;
&lt;br /&gt;
'''Què aconseguim amb això?''' Fixem-nos que el nostre formulari no conté les paraules ''onchange'', ''onkeyup'',... tenim un formulari net que només ens dóna informació del ''contingut'' i no del ''comportament''. El ''comportament'' el tenim associat al fitxer ''js_form_us.js''. D'altra banda, tot el disseny el tenim associat al corresponent full d'estils. Per tant, estem en la línia del paradigma modern del disseny web: separar el contingut, del disseny i del comportament, el model vista-controlador. Altres avantatges: el dissenyador es preocupa que el formulari sigui bonic; el programador es preocupa del comportament del formulari.&lt;br /&gt;
&lt;br /&gt;
=Ftixers=&lt;br /&gt;
Pots descarregar-te els tres fitxers involucrats en aquest enllaç, i així pots estudiar més detingudament el codi:&lt;br /&gt;
*[[Fitxer:Events dinamics.zip]]&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, gener 2019&lt;br /&gt;
[[Categoria: Institut Jaume Balmes]]&lt;br /&gt;
[[Categoria: Assignatura DAW-M06-WEC]]&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>