Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di kluster
    Registrato dal
    Jul 2003
    Messaggi
    1,288

    Scalable Ajax: caricare contenuto in singolo layer anche con js disabilitato

    Ho fatto un piccolo esempio ajax di caricamento pagina all'interno di layer, funzionante anche con js disabilitato.

    Scalable Ajax

    una spiegazione l'ho buttata sul forum di imente.org.

    L'esempio è da utilizzare per casistiche semplici in cui caricate il nuovo testo in un singolo layer per volta, per casi + complicati il sistema si complica e forse non è applicabile.

    A livello server-side ho utilizzato Asp, ma l'importante è capire il sistema, cosi poi potete riadattarlo a php etc.
    Spero che possa essere utile a qualcuno

  2. #2
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    sicuramente e' uno spunto x chi non ha idea su come far degradare ajax,
    se riportassi qui anche la spiegazione che hai linkato sarebbe + comodo

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Non ho ancora guardato le spiegazioni perchè ho il computer impegnato.
    Ma mi interessa se ho capito.
    In pratica, nel link, se javascript funziona esegue la chiamata ajax, altrimenti ricarica la pagina asp per intero.
    Il funzionamento della pagina asp è comandato dai parametri ricevuti.

    Sbaglio?

    Ciao
    Pietro

  4. #4
    Utente di HTML.it L'avatar di kluster
    Registrato dal
    Jul 2003
    Messaggi
    1,288
    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:
    codice:
    Carica Pagina
    
    <div id="mioLayer"> </div>
    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:
    codice:
    [/COLOR]&LoadLayer=mioLayer" onclick="CaricaPagina('miapagina.asp?mioparametro=1','mioLayer');return false">Carica Pagina
    <div id="myLayer"><%=IIF(Request("LoadLayer")="myLayer",GetUrl(Request("page"),"")%></div>
    
    .... eventualmente lo stesso procedimento lo fate su tutti gli altri layer che intendete utilizzare lato client:
    <div id="myResult"><%=IIF(Request("LoadLayer")="myResult",GetUrl(Request("page"),"")%></div>
    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

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Interessante e molto chiaro

    Anche se siamo in html e non siamo tenuti a conoscere asp, php o altro, è meglio, secondo me, mandare pure il codice server

    Pietro

  6. #6
    Utente di HTML.it L'avatar di kluster
    Registrato dal
    Jul 2003
    Messaggi
    1,288
    in php il codice server-side si semplicifa molto:


    Codice PHP:

    <? $file = isset($_GET['page'])? "http://www.miosito.com/" $_GET['page'] : "" ?>
    [url="?page=<? echo(urlencode('test.php?mioparametro=1')); ?>&LoadLayer=myLayer"]Carica Pagina[/url]



    Disabilita il javascript e riprova l'esempio




    <div id="myLayer">
        <? if (isset($_GET['LoadLayer'])) {if ($_GET['LoadLayer'] == "myLayer") { include $file;} }?>
    </div>


    <div id="myResult">
        <? if (isset($_GET['LoadLayer'])){if ($_GET['LoadLayer'] == "myResult") { include $file;} } ?>
    </div>

  7. #7
    molto interessante, l'ho provato ma non funziona..

    ho usato php con js attivato..

  8. #8
    Utente di HTML.it L'avatar di kluster
    Registrato dal
    Jul 2003
    Messaggi
    1,288
    Forse hai un nome del layer diverso o hai lasciato http://www.miosito.com/ o il nome della pagina test.php?

  9. #9
    Interessante lo spunto, anche se personalmente preferisco la soluzione con iframe; oltre a non dover ricaricare tutta la pagina si può implementare in modo molto più semplice senza l'uso di codice lato server.

  10. #10
    kluster... tre puntini di sospensione...



    cmq, ho trovato un sistema che usa almeno la metà di righe di codice, funziona con o senza JS, fa il preload e carica qualsiasi cosa in qualsiasi DIV all'interno di una pagina.

    ho risolto in pratica

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.