Il problema è noto ed è dovuto ad un bug di IE (vedi Microsoft KB nr. 276228 - http://support.microsoft.com/kb/276228/) usando innerHTML per caricare l'elenco di option nella select (che imho non è cmq. molto DOM-oriented...)

Lo stesso articolo della KB spiega una possibile soluzione; vedi anche questo articolo e la relativa demo per maggiori dettagli.

Matteo Casati
GURU4.net
83 messaggi dal 23 agosto 2005
Grazie della dritta ma leggendo gli articoli non parla di IE7, quindi deduco che dal 2003 non hanno ancora risolto questo bug?!?

PEr quale motivo non sarebbe molto DOM-oriented usare l'innerHTML per popolare la mia select? Se hai letto il mio problema mi sembra un modo valido per ottenere dinamicamente i valori, altrimenti cosa suggeriresti?
Ho provato con il tag DIV ma non funziona lo stesso.. come la maggior parte delle soluzioni fornite da MS anche questa sembrerebbe inutile...

Grazie,
Luigi.
igio80 ha scritto:
Grazie della dritta ma leggendo gli articoli non parla di IE7, quindi deduco che dal 2003 non hanno ancora risolto questo bug?!?


Probabilmente è così.

Per quale motivo non sarebbe molto DOM-oriented usare l'innerHTML per popolare la mia select? Se hai letto il mio problema mi sembra un modo valido per ottenere dinamicamente i valori, altrimenti cosa suggeriresti?


Perché non usi completamente l'object model: tratti le options come una stringa html e non come una collection di oggetti, fatti di proprietà, metodi ed eventi.

L'esempio che ti avevo linkato all'inizio (la demo #10 del JavaScript SOAP Client) modifica in modo molto più object oriented il contenuto della select (ad esempio con: var o = document.createElement("OPTION"), ...options.add(o);, ecc.)

Tra l'altro lo dice anche l'articolo della KB che ti ho segnalato: "si dovrebbe utilizzare idealmente l'insieme di opzioni per aggiungere le opzioni di un elemento SELECT."

Altra considerazione: il tuo "servizio" lato server produce direttamente del codice html (per quanto semplice esso sia) ed è quindi un po' troppo verticale per essere considerato un servizio vero e proprio.
Se ad esempio hai bisogno di cambiare lo stile delle option? O se quei valori non ti servissero per popolare una select ma una tabella? Cosa fai? Duplichi il servizio? Non il massimo... Sempre nella demo citata prima noterai che lato server vengono inviati solo i dati veri e propri, senza alcun riferimento alla rappresentazione degli stessi nella pagina.

Ho provato con il tag DIV ma non funziona lo stesso..


Strano: io ho copiato e incollato l'esempio della KB e... funziona benissimo!
Non è che hai sbagliato qualcosa tu?

come la maggior parte delle soluzioni fornite da MS anche questa sembrerebbe inutile...


Mi sa che abbiamo avuto esperienza diverse con Microsoft: io ho sempre trovato la documentazione e gli esempi più che esaustivi!
La tua affermazione suona un po' come l'eterna (sterile) polemica contro MS...

Matteo Casati
GURU4.net
83 messaggi dal 23 agosto 2005
Non volevo essere polemico.. forse sono soltanto sfortunato quando mi "imbatto" nel mondo MS.
Essendo una pagina web molto semplice non ho pensato ad un servizio vero e proprio (avrei dovuto in effetti ma non è da molto che utilizzo il DOM e allora ho preferito rimandare alla prossima :-) )

Vorrei capire però più in dettaglio come ottenere un servizio modificando il mio codice e soprattutto capire a questo punto perchè con l'utilizzo del tag DIV a me non funziona.
Ti spiego meglio la mia struttura:

1) nella pagina default.asp ho le mie select (la prima racchiude le macro aree mentre le altre sono figlie e così via..):

<select id="LuogoLiv1" name="LuogoLiv1" onchange="setLuogo('LuogoLiv',<% =i%>, <% =Livello%>);">
<option selected="selected" value="0">Seleziona un luogo</option>
<%
Do While Not RsLuogo.EOF
%>
<option value="<%=RsLuogo("ID")%>"><%=RsLuogo("Descrizione")%>
</option>
<%
RsLuogo.Movenext
Loop
RsLuogo.Close
Set RsLuogo = Nothing
%>
</select>
...
...
<!-- poi in base a quante SELECT nidificate ci sono nel db cariche le select figlie---
...
<%
For i = 2 To Livello
%>
<tr>
<td align="right">&nbsp;</td>
<td>
<!--QUI C'ERA IL DIV COME VISTO NEL TUO ESEMPIO: <div id="myDiv<% =i%>"> -->
<select id="LuogoLiv<% =i%>" name="LuogoLiv<% =i%>" onchange="setLuogo('LuogoLiv',<% =i%>,<% =Livello%>);">
</select>
<!--</div>-->
</td>
</tr>
<%
Next
%>

2) questa invece è la funzione javascript che richiamo su ogni onchange della select:


// La funzione di partenza, viene chiamata quando è caricata la pagina
function setLuogo(nomeSelect, id, levelNested)
{
ID = document.getElementById(SelectNameID).value;//memorizzo l'id passato
//Se il livello di annidamento passato è quello massimo allora non ho più select //figlie: per fare questo controllo mi basta confrontare il livello massimo //passato con l'id della select passata
if (LivAnnidamento != IDSelect)
{
document.getElementById("LuogoLiv" + IDSelectNested).style.visibility = "visible";
}
//controllo se è stato selezionato un luogo nella combo
if (ID != 0)
{
xmlHttp = getXmlHttpObject();//creo l'oggetto xmlHttpRequest
if(xmlHttp == null)
{
alert("Browser does not support HTTP Request object");
return;
}
xmlHttp.onreadystatechange = stateChanged; //funzione da richiamare quando cambia lo stato dell'oggetto
xmlHttp.open("GET", url + "?idpadre=" + ID, true); //inizializzo la richiesta alla pagina asp per ottenere le option della select //figlia
xmlHttp.send(null); //invio della GET con body vuoto
}
else
{
//devo resettare tutte le select tranne quella di livello primo:
for (j=(LivAnnidamento-1);j<=LivAnnidamento;j++)
{
var x=document.getElementById(SelectName + j);
for (i=0;i<=x.length;i++)
{
x.remove(x.options[i]);//rimuovo tutte le options della select
x.options[x.selectedIndex].text = "";//setto a stringa vuota il valore di //default della select
document.getElementById("LuogoLiv" + j).style.visibility = "hidden";
}
}
}
}
// funzione che ricava l'oggetto in base al browser dell'utente
function getXmlHttpObject()
{
var objXmlHttp = null;
// code for Mozilla, etc.
if(window.XMLHttpRequest)
{
objXmlHttp = new XMLHttpRequest()
}
else if(window.ActiveXObject)
{
objXmlHttp = new ActiveXObject("Microsoft.XMLHTTP")
}
return objXmlHttp;
}
// funzione da eseguire quando cambia lo stato dell'oggetto
function stateChanged()
{
//Dobbiamo eseguire quando è stata ricevuta la risposta dal server e tutto è OK
if (xmlHttp.readyState == 4)
{
if(xmlHttp.status == 200)
{
//devo visualizzare solo la select figlia di quella selezionata dall'utente:
//se il livello di annidamento è uguale a 3 e si clicca sulla select uno devo //nascondere la select numero 3
for (z=(IDSelect+2);z<=LivAnnidamento;z++)
{
document.getElementById("LuogoLiv" + z).style.visibility = "hidden";
}
//se l'id della select passata è uguale al massimo livello di annidamento //significa che non ho più select figlie
if (LivAnnidamento != IDSelect)
{
IDSelect = (IDSelect + 1);//incremento il valore i-esimo della select per //popolare la select-figlio
SelectName = (SelectName + IDSelect);//ricavo il nome della select-figlio
//visualizzo il risultato del file aperto con l'oggetto xmlHttp
document.getElementById(SelectName).innerHTML = xmlHttp.responseText;

//qui avevo provato a gestire la reponse con le DIV
//document.getElementById(divName).innerHTML = xmlHttp.responseText;

}
}
else
{
alert('Problema nel recupero del file xml: ' + xmlHttp.status + " : " + xmlHttp.statusText);
}
}
}


3) il file .asp che mi stampa le option è questo:
..

SQL = "SELECT ID, Descrizione FROM ..."
Set Rs = DBLuoghi.Execute (SQL)
Do While Not Rs.EOF
Response.Write "<option value=""" & Rs("ID") & """>" & Rs("Descrizione") & "</option>" & VbCrLf
Rs.Movenext
Loop
Forse non ho visto o capito bene io, però mi sembra che nel tentativo fatto con il div tu imposti l'innerHTML del div con l'elenco delle option e non con la struttura completa che deve comprendere anche il tag SELECT. Sbaglio?

Matteo Casati
GURU4.net
83 messaggi dal 23 agosto 2005
Si hai ragione.. c'ho sbattuto un pò la testa ma alla fine ce l'ho fatta.
Grazie infinite.. certo che è strano però che in IE7 ci sia questo baco non trovi?
Grazie ancora. Luigi.
igio80 ha scritto:
Si hai ragione.. c'ho sbattuto un pò la testa ma alla fine ce l'ho fatta.
Grazie infinite..


 Prego!

certo che è strano però che in IE7 ci sia questo baco non trovi?
Grazie ancora. Luigi.


Sì, e soprattutto il fatto che se lo portino dietro ormai da anni.
Personalmente non l'ho mai vissuto come un forte problema, dato che comunque, come ti dicevo, cerco di evitare l'uso di innerHTML a favore dell'uso dell'object model.

Alla prossima.

Matteo Casati
GURU4.net

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.