Newsgroup: it.comp.lang.javascript
Titolo: Aiuto !! Problema con la gestione degli eventi in NS !!

Ho provato a scrivere anche su comp.lang.javascript, spero
di avere maggior fortuna qui.
Il problema: ho diverse pagine html con forms contenenti varie
text boxes, ognuna delle quali ha associato il proprio codice
di validazione all'evento onblur. Navigando nella pagina con il
tab o premendo il bottone utilizzato per il submit gli script
funzionano perfettamente (sia su NS che IE). A questo punto 
il mio desiderio e' che quando viene premuto il tasto Enter in
un qualunque punto del form questo venga inviato se e solo se
tutti i campi sono validi. Ovviamente il codice deve funzionare
su entrambi i browser. Lo script che ho fatto per ora funziona 
solo su IE anche se non capisco il perche'.
Procediamo per gradi. Per intercettare l'invio su entrambi i 
browser ho utilizzato del codice che ho trovato su Internet:
   if (document.layers) 
      document.captureEvents(Event.KEYDOWN);
   document.onkeydown = handleDown;
la funzione handleDown testa il codice del tasto premuto ed
esegue altre funzioni solo se questi e' pari a 13
   var KeyP = evt ? (evt.which ? evt.which : evt.keyCode) :
event.keyCode;
   if (KeyP == 13)
   {
	....
   }
Poiche' ogni elemento del form ha il proprio codice di validazione
e lo scopo di questo script e' di essere utilizzato su varie pagine
senza doverle riscrivere, ho creato una funzione ValidateAll che
scorre l'array degli elementi del form e se l'elemento e' di tipo
text o textarea scatena gli eventi focus e blur in sequenza.
   num_el = myform.elements.length;
   for (i=0; i<num_el; i++)
   {
      if( (myform.elements[i].type=="text")||
          (myform.elements[i].type=="textarea") )
      {
          myform.elements[i].focus();
          myform.elements[i].blur();
      }
   }
Ho inoltre una variabile globale che viene valorizzata solo in caso
di errore con il nome del primo campo errato.
Tutto questo funziona perfettamente in IE (e fino alla ValidateAll 
anche in NS) ma pare che NS non riesca a scatenare gli eventi focus
e blur (almeno fino a quando non esce dalla funzione).
Sapete dirmi se sbaglio qualcosa ? Oppure come fare a scatenare 
immediatamente gli eventi sugli elementi del form ? Da tutto quello
che ho letto esiste il modo di intercettare gli eventi ad un livello
piu' alto (window, document) senza che vengano scatenati subito, ma
questo non e' decisamente il mio caso.
Luca Barbaresi


A me sembra tutto ok , bisognerebbe vedere lo script , comunque ti posto uno
script , non è mio c'è il nome dell'autore che utilizza ValidateAll e
l'evento onBlur per controllare il form e funziona sia con NN che con IE ,
magari ci puoi adattare il tasto Enter....... fammi sapere
<script language="JavaScript">
   <!--
   function ValidateAll()
   {
           if(CheckName(document.dForm.visitorname.value) == false) return
false;
           if(CheckEmail(document.dForm.visitoremail.value) == false) return
false;
           return true;
   }
   function StripSpacesFromEnds(s)
   {
           // developed by 
willmaster.com
           while((s.indexOf(' ',0) == 0) && (s.length > 1))
           {
                   s = s.substring(1,s.length);
           }
           while((s.lastIndexOf(' ') == (s.length - 1) && (s.length > 1)))
           {
                   s = s.substring(0,(s.length - 1));
           }
           if((s.indexOf(' ',0) == 0) && (s.length == 1)) s = '';
           return s;
   }
   function IsItPresent(s,explanation)
   {
           // developed by 
willmaster.com
           s = StripSpacesFromEnds(s);
           if(s.length) return s;
           alert('Please enter ' + explanation + '.');
           return '';
   }
   function CheckName(s_name)
   {
           // developed by 
willmaster.com
           s_name = IsItPresent(s_name,'your name');
           if(! s_name) return false;
           var i = s_name.indexOf('  ',0);
           while(i > -1)
           {
                   s_name = s_name.substring(0,(i + 1)) +
                           s_name.substring((i + 2),s_name.length);
                   i = s_name.indexOf('  ',0);
           }
           s_name = s_name.toLowerCase();
           var s = new String(s_name.substring(0,1));
           s = s.toUpperCase();
           s_name = s + s_name.substring(1,s_name.length);
           i = s_name.indexOf(' ',0);
           if(i == (s_name.length - 1)) i = -1;
           var ts = new String("");
           var j = 0;
           while(i > -1)
           {
                   i++;
                   j = i + 1;
                   s = s_name.substring(i,j);
                   s = s.toUpperCase();
                   ts = '';
                   if(i > 0) ts = s_name.substring(0,i);
                   s_name = ts + s + s_name.substring(j,s_name.length);
                   i = s_name.indexOf(' ',j);
                   if(i == (s_name.length - 1)) i = -1;
           }
           document.dForm.visitorname.value = s_name;
           return true;
   }
   function CheckEmail(s_email)
   {
           // developed by 
willmaster.com
           s_email = IsItPresent(s_email,'your email address');
           if(! s_email) return false;
           var i = s_email.indexOf(' ',0);
           while(i > -1)
           {
                   s_email = s_email.substring(0,i) +
                           s_email.substring((i + 1),s_email.length);
                   i = s_email.indexOf(' ',0);
           }
           document.dForm.visitoremail.value = s_email;
           if((s_email.length < 6) ||
              (s_email.indexOf('@',0) < 1) ||
              (s_email.lastIndexOf('@') != s_email.indexOf('@',0)) ||
              (s_email.lastIndexOf('@') > (s_email.length - 5)) ||
              (s_email.lastIndexOf('.') > (s_email.length - 3)) ||
              (s_email.lastIndexOf('.') < (s_email.length - 4)) ||
              (s_email.indexOf('..',0) > -1) ||
              (s_email.indexOf('@.',0) > -1) ||
              (s_email.indexOf('.@',0) > -1) ||
              (s_email.indexOf(',',0) > -1))
           {
                   alert('The email address "' + s_email + '" is not
valid.');
                   return false;
           }
           return true;
   }
   // -->
   </script>
<form name="dForm" method="POST" action="script.cgi">
   Your Name:
   <input onBlur="CheckName(document.dForm.visitorname.value)"
name="visitorname" type="text">
   Your Email Address:
   <input onBlur="CheckEmail(document.dForm.visitoremail.value)"
name="visitoremail" type="text">
   <input onClick="return ValidateAll()" type="submit" value="Send">
   </form>
____________________
andreotta fabiano
WebMªster ATI POWER s.n.c.
andr...@atipower.it
http://www.atipower.it
http://www.afdsoftware.freeweb.org
____________________

   }
Probabilmente non mi sono spiegato bene. Il mio problema e' che non so
quali sono le funzioni di validazione collegate ad ogni text box (e
non lo voglio sapere). In pratica, ogni text box ha un evento onblur
di questo tipo:
<table>
    <td>Format Dat.</td>
    <td><input type="text" name="Data" size="20" maxlength="20"
tabindex="3" onFocus="this.select()"
onblur="datform(this,'GMA')"></td>
</table>
In questo esempio contiene una data che deve essere formattata come
giorno/mese/anno, ma io nella mia ValidateAll non lo so ! A me non
interessano i parametri di ogni singola funzione di validazione
(creare una ValidateAll con tutte le funzioni con i vari parametri per
tutte le mie pagine e' abbastanza improponibile). E' per questo che
volevo semplicemente scatenare l'evento onblur e aspettare che la
variabile-flag mi dica se e' andato tutto bene o no.
Sono disposto anche a cambiare la logica della validateAll purche' non
cambi quella delle singole funzioni di validazione.
Grazie comunque per l'interessamento. 
Luca Barbaresi