Newsgroup: it.comp.lang.javascript
Titolo: Option dinamiche con IE5 -NS6

Prendendo spunto dal codice di atipower, ho fatto delle prove ma sono
sorti dei problemi con IE5.0; NS6 funziona correttamente.
In pratica prima di ripopolare una select con i nuovi dati cancello i
nodi presenti.
Nel caso di  numero di option diverse tra la lista nuova e la precedente
il comportamento di IE e':
precedente inferiore di numero: visualizza un numero di nuove option
eguale al numero di option precedenti
precedente superiore : visualizza le nuove option + tante righe vuote
fino al numero di option precedente, poi si blocca e si chiude.
Ci sono errori nel codice? (di seguito)
Avete gia' riscontrato questo problema?
Esiste anche con IE5.5?
Saluti, Paolo
---------------
<script language="javascript">
Lombardia= new Array("* scegli *","Sondrio","Milano","Lodi","Varese");
Emilia=new Array("* scegli *","Rimini","Parma");
function crea(zz){
if(document.getElementById){
 if(zz !=""){
  hh=eval(zz);
  pp=hh.length;
  if(!document.getElementById('nuovo')){
   var newElem =document.createElement("select");
   newElem.id="nuovo";
   document.getElementById('form1').appendChild(newElem)
  } else {
    ss=document.getElementById('nuovo').childNodes.length;
   for (i=0;i<ss;i++) {
    se=document.getElementById('nuovo').childNodes
    document.getElementById('nuovo').removeChild(se[0])
   }
  }
  for(i=0; i<pp; i++){
   var newElem1= document.createElement("option");
   newElem1.setAttribute('value',hh[i]);
   var newText1 = document.createTextNode(hh[i]);
   newElem1.appendChild(newText1) ;
   document.getElementById('nuovo').appendChild(newElem1)
  }
  document.getElementById('nuovo').style.display="inline";
 } else{
  document.getElementById('nuovo').style.display="none"
 }
}
}
</script>
</head>
<body>
<form method="POST" id="form1">
  <p><select size="1" name="D1"
onChange="crea(this.options[this.selectedIndex].value)">
    <option selected value="">SCEGLI REGIONE</option>
    <option value="Lombardia">Lombardia</option>
    <option value="Emilia">Emilia</option>
  </select></p>
</form>
</body>
</html>

Con IE 5.5 funziona perfettamente!
andreotta fabiano
 WebMªster ATI POWER s.n.c.
 
andr...@atipower.it
 
http://www.atipower.it
 
http://www.aticommerce.com
 
http://www.afdsoftware.freeweb.org
 
http://www.jsdir.com
 
http://www.javascript.3000.it



Siete venuti a capo di questo problema?
oltre all'ovvia distruzione totale di 'nuovo' ogni volta modificando
l' istruzione 
if(document.getElementById('nuovo')){aa=document.getElementById('nuovo');document.body.document.getElementById('form1').removeChild(aa)}
/*togliendo l'else successivo e creando quindi ogni volta 'nuovo'*/ 
  var newElem =document.createElement("select");
   newElem.id="nuovo";
   document.getElementById('form1').appendChild(newElem)
et cetera
Nell' ipotesi pero' che la costruzione delle option avvenga in modo
piu' complesso e che non sia opportuna  la distruzione totale
si potrebbe forse partire dalla considerazione che il Dom anche in IE5
viene costruito correttamente, (almeno a me cosi' risulterebbe
applicando l' ottimo script di Pippopd relativo alla descrizione del
Dom. (e' uno strumento ben utile!)).
Secondo una mia prova che metto di seguito, clonando il select post
costruzione e sostituendolo a se stesso, non mi sembra dia piu'
errore.
<HTML>
<HEAD>
<script language="javascript">
Lombardia= new Array("* scegli *","Sondrio","Milano","Lodi","Varese");
Emilia=new Array("* scegli *","Rimini","Parma");
function crea(zz){
if(document.getElementById){
 if(zz !=""){
  hh=eval(zz);
  pp=hh.length;
  if(!document.getElementById('nuovo')){
   var newElem =document.createElement("select");
   newElem.id="nuovo";
   document.getElementById('form1').appendChild(newElem)
  } else {
    ss=document.getElementById('nuovo').childNodes.length;
   for (i=0;i<ss;i++) {
    se=document.getElementById('nuovo').childNodes
    document.getElementById('nuovo').removeChild(se[0])
   }
  }
  for(i=0; i<pp; i++){
   var newElem1= document.createElement("option");
   newElem1.setAttribute('value',hh[i]);
   var newText1 = document.createTextNode(hh[i]);
   newElem1.appendChild(newText1) ;
   document.getElementById('nuovo').appendChild(newElem1)
 }
/*********************************
creazione del clone
****************/
 var
mettiapostoperIE=document.getElementById('nuovo').cloneNode(true)/*true
assicura la copia dei sottonodi*/
/*sostituzione a se stesso*/
document.getElementById('nuovo').parentNode.replaceChild(mettiapostoperIE,document.getElementById('nuovo'))
/********************* il tanto bistrattato NN6 non ne avrebbe bisogno
ma non essendo disturbato dalla manovra mi sembra inutile
discriminare********/
  document.getElementById('nuovo').style.display="inline";
 } else{
  document.getElementById('nuovo').style.display="none"
 }
}
}
</script>
</head>
<body>
<form method="POST" id="form1">
  <p><select size="1" name="D1"
onChange="crea(this.options[this.selectedIndex].value)">
    <option selected value="">SCEGLI REGIONE</option>
    <option value="Lombardia">Lombardia</option>
    <option value="Emilia">Emilia</option>
  </select></p>
</form>
</body>
</html>
considerazioni?
Ciao

 considerazioni?
Sembra funzionare perfettamente.
Complimenti per la fantasia! Non avrei mai provato a cercare una
soluzione del genere.
Rimane il buio sulle cause del malfunzionamento; come hai rilevato la
gerarchia sembra perfetta ma permane un causa di disturbo che, da
profano, direi legata all'area di memoria che gestisce la
visualizzazione dell'oggetto e l'evento collegato (la discesa della
lista).
Un altra questione, NS6 sembra che nel caso di input singolo, premendo
il tasto *invio* faccia prima il submit e solo successivamente elabori
un eventuale onKey...
La cosa e' nata dal cercare di bloccare l'invio di un form alla
pressione del tasto *invio*.
Forse il problema e' gia' stato discusso e mi sono perso i messaggi,
oppure sbaglio qualcosa di banale.
Saluti, Paolo

oppure sbaglio qualcosa di banale.
Non posso esser molto utile, tratto poco  i form  non gestendo nulla
(smanettone ero e rimango)
Noto che se aggiungo al form un addEventListener
<script language="javascript">
document.getElementById('nomeform').addEventListener('keypress',fai,true)
function fai(evt)
{alert(evt.which);return false}
</script>
quanto meno ottengo che l' alert si presenti _prima_ della finestra di
avviso di default di sicurezza relativo all' invio (provato con metodo
GET) con false dopo.
Ma comunque io faccia l' invio non si blocca.
E del resto alcuni script di validazione di form che avevo tenuto da
parte (non si sa mai cosa possa servire...) scatenano i loro bravi
alert ma non mi paiono neanche loro fermare il submit con NN6
Poi una cosa che non mi aspettavo: il codice del tasto invio non
dovrebbe essere 13?
cosě mi dice 0
Invoco l'ora tarda e insonne  a mia discolpa o qualcosa non quadra?
Spiacente di non potere dire nulla di utile, in attesa di leggere
anche  un parere di Fabiano,
saluto
Ciao e buon Natale 

 così mi dice 0
sì , se cerchi il "keyCode" IE ti da 13 NN6 ti dà 0 , proca ad usare
"charCode" per NN6 che ti darà 13 !!....
commenti??


commenti??
no pero' ascolto molto :D 
hai provato se le validazioni dei form funzionano a dovere con NN6?
Non so dirti se effettivamente partono, ma la finestrella di
avvertenza relativo ai form mi si attiva comunque
un bachetto?
Ciao