Ciao a tutti ho un problema e non riesco a venirne a capo con AJAX e Asp.
Il problema è di sicuro a livello Ajax perchè la stessa identica pagina su firefox e su chrome funziona perfettamente, mentre su explorer no.
Io ho 5 select che si compongono automaticamente sfruttando l'ajax e ogni select per comporsi deve ricordarsi i valori delle select precedentemente selezionate.
La prima select è diciamo "finta" perchè ha sempre lo stesso valore, la seconda select è fissa perchè si compone prendendo il valore del primo livello (che ovviamente è sempre lo stesso), quando seleziono un valore dalla seconda select ecco che parte l'ajax...
questo è il codice della pagina ricette.asp per le prime due select (il recordset select_liv2 è formato da una query sulla prima select sempre uguale):
codice:
...
<script type="text/javascript" src="/javascript/select-ajax.js"></script>
...
...
...
<p class="text-admin">Cerca ricette per LIVELLO</p>
<ul>
<li class="li-select">Livello 1<select name="liv1" id="liv1">
<option value="300" selected>Ricette</option>
</select>
<li class="li-select">Livello 2<select name="liv2" id="liv2" onchange="getCombo(this, 2)">
<option value="999" selected>Tutte</option>
<%
While (NOT select_liv2.EOF)
If trim(select_liv2.Fields.Item("Livello2").Value) <> "" then
%>
<option value="<%=(select_liv2.Fields.Item("livello2").Value)%>"><%=(select_liv2.Fields.Item("desliv2").Value)%></option>
<%
end if
select_liv2.MoveNext()
Wend
If (select_liv2.CursorType > 0) Then
select_liv2.MoveFirst
Else
select_liv2.Requery
End If
%>
</select>
<span id="livello3"></span>
<span id="livello4"></span>
<span id="livello5"></span>
questo invece il codice del file select-ajax.js:
codice:
function getCombo(sel, liv) {
var value = sel.options[sel.selectedIndex].value;
Richiesta(value, liv);
}
var XMLHTTP;
function Richiesta(Iniziale, liv)
{
if (liv == 2)
{
var url = "/include/select-ajax.asp?liv2=" + Iniziale;
XMLHTTP = RicavaBrowser(CambioStato2);
}
else if (liv == 3)
{
var url = "/include/select-ajax.asp?liv3=" + Iniziale;
XMLHTTP = RicavaBrowser(CambioStato3);
}
else if (liv == 4)
{
var url = "/include/select-ajax.asp?liv4=" + Iniziale;
XMLHTTP = RicavaBrowser(CambioStato4);
}
else if (liv == 5)
{
var url = "/include/select-ajax.asp?liv5=" + Iniziale;
}
XMLHTTP.open("GET", url, true);
XMLHTTP.send(null);
}
function CambioStato2()
{
if (XMLHTTP.readyState == 4)
{
var A = document.getElementById("livello3");
A.innerHTML = XMLHTTP.responseText;
var B = document.getElementById("livello4");
B.innerHTML = "";
var C = document.getElementById("livello5");
C.innerHTML = "";
}
}
function CambioStato3()
{
if (XMLHTTP.readyState == 4)
{
var F = document.getElementById("livello4");
F.innerHTML = XMLHTTP.responseText;
var G = document.getElementById("livello5");
G.innerHTML = "";
}
}
function CambioStato4()
{
if (XMLHTTP.readyState == 4)
{
var L = document.getElementById("livello5");
L.innerHTML = XMLHTTP.responseText;
}
}
function RicavaBrowser(QualeBrowser)
{
if (navigator.userAgent.indexOf("MSIE") != (-1))
{
var Classe = "Msxml2.XMLHTTP";
if (navigator.appVersion.indexOf("MSIE 5.5") != (-1));
{
Classe = "Microsoft.XMLHTTP";
}
try
{
OggettoXMLHTTP = new ActiveXObject(Classe);
OggettoXMLHTTP.onreadystatechange = QualeBrowser;
return OggettoXMLHTTP;
}
catch(e)
{
alert("Errore: l'ActiveX non verrà eseguito!");
}
}
else if (navigator.userAgent.indexOf("Mozilla") != (-1))
{
OggettoXMLHTTP = new XMLHttpRequest();
OggettoXMLHTTP.onload = QualeBrowser;
OggettoXMLHTTP.onerror = QualeBrowser;
return OggettoXMLHTTP;
}
else
{
alert("L'esempio non funziona con altri browser!");
}
}
questo invece il codice della pagina select-ajax.asp:
codice:
stringa_da_controllare = lcase(right(trim(request.QueryString()), 8))
' controllo il liv passato, imposto la query e il livello
If Instr(stringa_da_controllare, "liv2") > 0 Then 'la prima query è particolare perchè è una sorta di reset della variabile di sessione
query = "SELECT DISTINCT Livello3, DesLiv3 FROM RICETTE WHERE Livello2 = '" & trim(right(stringa_da_controllare, 3)) & "'"
livello = "liv3"
nr_livello = "3"
Session("query_annidata") = "Livello2 = '" & trim(request.QueryString("liv2")) & "'"
ElseIf Instr(stringa_da_controllare, "liv3") > 0 Then
If Instr(Session("query_annidata"), "Livello3") > 0 Then 'controllo se nella sessione query è già presente il livello, se è già presente sostituisco il suo valore e azzero perche vuol dire sono tornato indietro
posizione_livello = Instr(Session("query_annidata"), "Livello3 = '") + 11
annidato_uno = Left(Session("query_annidata"), posizione_livello)
Session("query_annidata") = annidato_uno & trim(request.QueryString("liv3")) & "'"
else 'altrimenti imposto la sessione query con il valore
Session("query_annidata") = Session("query_annidata") & " AND Livello3 = '" & trim(right(stringa_da_controllare, 3)) & "'"
end if 'fine controllo se nella sessione query è già presente il livello
query = "SELECT DISTINCT Livello4, DesLiv4 FROM RICETTE WHERE " & Session("query_annidata")
livello = "liv4"
nr_livello = "4"
ElseIf Instr(stringa_da_controllare, "liv4") > 0 Then
If Instr(Session("query_annidata"), "Livello4") > 0 Then 'controllo se nella sessione query è già presente il livello, se è già presente sostituisco il suo valore e azzero perche vuol dire sono tornato indietro
posizione_livello = Instr(Session("query_annidata"), "Livello4 = '") + 11
annidato_uno = Left(Session("query_annidata"), posizione_livello)
Session("query_annidata") = annidato_uno & trim(request.QueryString("liv4")) & "'"
else 'altrimenti imposto la sessione query con il valore
Session("query_annidata") = Session("query_annidata") & " AND Livello4 = '" & trim(right(stringa_da_controllare, 3)) & "'"
end if 'fine controllo se nella sessione query è già presente il livello
query = "SELECT DISTINCT Livello5, DesLiv5 FROM RICETTE WHERE " & Session("query_annidata")
livello = "liv5"
nr_livello = "5"
End if
'creo il recordset per la select
Dim altra_select
Dim altra_select_cmd
Dim altra_select_numRows
Set altra_select_cmd = Server.CreateObject ("ADODB.Command")
altra_select_cmd.ActiveConnection = MM_conn_STRING
altra_select_cmd.CommandText = query
altra_select_cmd.Prepared = true
Set altra_select = altra_select_cmd.Execute
altra_select_numRows = 0
'creo la select con un altro ajax
Livello <%=nr_livello%>
<select name="<%=livello%>" id="<%=livello%>" <%If nr_livello <> "5" then%>onchange="getCombo(this, <%=nr_livello%>)"<%end if%>>
<option value="999">Tutte</option>
<%
While (NOT altra_select.EOF)
if trim(altra_select.Fields.Item("Livello"&nr_livello).Value) <> "" then %>
%>
<option value="<%=altra_select.Fields.Item("Livello"&nr_livello).Value%>"><%=(altra_select.Fields.Item("DesLiv"&nr_livello).Value)%></option>
<%
end if
altra_select.MoveNext()
Wend
If (altra_select.CursorType > 0) Then
altra_select.MoveFirst
Else
altra_select.Requery
End If
%>
</select>
Io sinceramente non riesco a capire ho fatto varie prove e non capisco dove sia l'errore, ripeto su tutti i browser funziona meno che su explorer, quindi non credo sia un problema Asp altrimenti nn funzionerebbe neanche sugli altri, credo sia un problema della chiamata ajax in explorer ma cosa sbaglio? cosa posso controllare?
grazie a tutti per l'aiuto che mi daranno....