Allora il purpose di questo script è permettere all'utente di poter visualizzare correttamente le pagina anche in caso di javascript disabilitato (oppure si potrebbe estendere anche ad una scelta dell'utente se usare o no ajax)
Dunque mettiamo una tipica pagina Ajax:
L'utente clicca su un link e parte la funzione che carica il nuovo testo proveniente da una pagina esterna nel layer di sua scelta
qualcosa del genere:
quindi l'utente clicca, viene caricata la pagina miapagina.asp inviata con parametro ?mioparametro=1 ed il testo risultante viene messo nel layer mioLayer
un occhiata alla funzione caricaPagina
codice:
<script type="text/javascript">
//<![CDATA[
url = "http://www.miosito.com/";
d = document;
preloadText = "Attendere, caricamento pagina in corso...";
function caricaPagina(pagina,idLayer)
{
if (typeof XMLHttpRequest != "undefined") { x = new XMLHttpRequest();}
else
{
try { x = new ActiveXObject("Msxml2.XMLHTTP");}
catch (e) { try { x = new ActiveXObject("Microsoft.XMLHTTP");} catch (e){x = null;}}
}
if (x)
{
d.getElementById(idLayer).innerHTML = preloadText;
x.onreadystatechange = function()
{
if (x.readyState == 4 && x.status == 200)
{
el=d.getElementById(idLayer);el.innerHTML = x.responseText;
}
}
x.open("GET", url + pagina, true);
x.send(null);
}
}
//]]>
</script>
Bene, ora pero' dobbiamo fare in modo che nel caso il js sia disabilitato l'utente possa visualizzare correttamente la pagina.
facciamo una modifica al collegamento che fa scaturire la funzione:
cosa è cambiato:
nel caso in cui il js sia ABILITATO: all'onclick viene lanciata la funzione ajax ed il return false garantisce che il link verso la pagina non sia attivato
nel caso in cui il js sia DISABILITATO: viene ricaricata la pagina (non specificando nessun nome di pagina <a hfre="?page=..."> viene interpretato come un link alla stessa pagina di esecuzione) e vengono passati 2 parametri:
page = che rappresenta la pagina da caricare (la stringa viene encodata tramite una funzione server-side di vbscript Server.UlrEncode, nel caso vogliate encodarla lato client dovete usare la funzione encode() js)
layer = che rappresenta il layer in cui deve apparire.
Quindi che si fa ora?
Carichiamo la pagina con XMLHttp ma lo facciamo server SIDE e butteremo l'output nel layer di destinazione specificato dalla variabile layer:
Creiamo una fuzione server side che carichi la pagina remota:
codice:
<%
Function GetUrl(Url)
arrXmlDom = Split("MSXML4.DOMDocument,MSXML3.DOMDocument,MSXML2.DOMDocument,MSXML.DOMDocument,Microsoft.XmlDom",",")
'Cerco un oggetto xmlValido tra i possibili activex istallati di default su server windows
for w=0 to ubound(arrXmlDom)
if IsComInstalled(arrXmlDom(w)) then
Set XmlDom = Server.CreateObject(arrXmlDom(w))
exit for
end if
next
if not isObject(XmlDom) then Response.Write("Impossibile inizializzare un oggetto valido Xml Document"):Response.End()
XmlDom.open "GET",domain & Url,False
XmlDom.Send()
GetUrl = XmlDom.ResponseText
Set XmlDom = Nothing
End Function
Public function IsComInstalled(class_id)
'Verifica se il componente è installato
On Error Resume Next
Dim xTestObj,IsComInstalled
IsComInstalled = False
Set xTestObj = Server.CreateObject(class_id)
IsComInstalled = (Err.Number = 0)
Set xTestObj = Nothing
Err.Clear()
End function
'Function utility per fare l'if ternario
Function IIF(bcheck,strue,sfalse)
If bcheck then IIF = strue else IIF = sfalse
End Function
%>
Ora teniamo a mente nuovamente la logica dello script.
Se è disponibile js carica via ajax altrimenti ricarica la pagina passando come parametro la pagina remota da cui caricare il testo e il layer in cui dovra' finire.
Quindi l'ottica è questa:
In questo caso ho utilizzato ASP, ma vedendo la logica dello script non è difficile riadattare il tutto ad altri linguaggi server-side
UN esempio funzionante lo trovate qui: Scalable_ajax.asp