Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    13

    [JS + Ajax] request sincrone

    Ciao a tutti, vorrei proporvi un problema già esplorato altrove (XMLHttpRequest asincrone e sincrone), ma di cui non ho trovato soluzioni adatte al mio caso.

    Premetto che sono un principiante pressochè assoluto e ho iniziato da poco ad esplorare parallelamente Javascript e Ajax: pertanto forse sono qui a chiedervi dei suggerimenti riguardanti un corretto approccio al problema, piuttosto che accortezze da coder esperti.
    Cerco quindi di ripercorrere la logica che ho seguito.

    Il mio problema è la creazione di un form contenente un certo numero di menù a tendina (i tag <select> di HTML), collegati fra loro in diverse catene.
    Esempio pratico: selezione di una località, diviso quindi in un menù per la nazione, uno per la provincia, uno per il comune ed uno per la frazione.
    Risulta semplice realizzare un meccanismo in Ajax secondo il quale ciascun menù viene popolato in maniera asincrona a partire dalla selezione effettuata sul menù precedente.
    Esempio: avendo selezionato "Italia" dal primo menù ("nazione"), nel secondo apparirà l'elenco di tutte le province italiane, e così via a cascata per comuni e frazioni (Il comportamento server-side è fornito da uno o più moduli PHP che ricercano i dati su un db).

    Il problema riguarda gli elementi iniziali delle catene, ovvero nel mio esempio il menù "nazione": l'elenco per essi va caricato dinamicamente al caricamento della pagina, al fine di essere subito selezionabile.

    La soluzione più economica (qui forse sta il problema di approccio) mi è sembrata riutilizzare il meccanismo di popolazione degli altri menù tramite Ajax, richiamandolo al caricamento della pagina: nella fattispecie, usando l'evento OnLoad dentro il tag <BODY>.
    Esempio: <body onLoad="caricaNazionePadre(); caricaNazioneMadre(); ">

    Le due funzioni dell'esempio effettuano una chiamata asincrona del tipo "request.open("GET", url, TRUE); request.send(null);" per ciascun elemento iniziale delle catene.

    Il problema si colloca in questo punto: il meccanismo non funziona, in quanto (mia supposizione) le richieste asincrone si accavallano e si sovrascrivono.

    Risolvo forzando la sincronicità delle richieste ponendo "request.open("GET",url, FALSE)": il "trucco" funziona perfettamente su Internet Explorer ma non su FireFox.

    Cercando sui vari forum, scopro che ciò è dovuto a questioni di sicurezza ed efficienza, e che comunque è sconsigliabile usare richieste sincrone in questi casi, anche quando fossero permesse. Tuttavia non so come uscirne.

    Potete aiutarmi?

    Grazie mille!

    Alan

  2. #2
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    scusa ma alidila' della procedura asincrona non e' previsto un funzionamento con normale ri-caricamento del documento?
    quello e' il tuo punto di partenza: nessuna richiesta asincrona, quindi normale inclusione lato server che restituisce output gia' formattato da includere nel documento

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    13
    Vale a dire non effettuare chiamate tramite Javascript, bensì chiamare direttamente il codice server (PHP nel mio caso) che mi crei i form iniziali? In tal caso si rende necessaria mutare l'estensione della pagina in .php (vorrei evitarlo, se possibile)?

    Risulta palese la mia scarsa esperienza, abbiate pazienza...
    Grazie!

    Alan

  4. #4
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,133
    Perché eseguire due chiamate onload asincrone, è proprio necessario? Non potresti eseguire chiamate a cascata? Forse un pagina demo pubblica potrebbe far capire meglio il problema e trovare un'altra soluzione.
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    13
    Grazie per il suggerimento delle chiamate a cascata, ho articolato il caricamento in funzioni in cui una chiamata viene effettuata solo se sono terminate le operazioni relative alla precedente (ovvero request.readyState == 4, request.status == 200, popolamento del menù eseguito), vale a dire che ciascuna viene attivata dall'evento "request.onreadystatechange" della precedente.
    Ora funziona tutto.

    Tuttavia ho comunque adoperato le chiamate asincrone, sicchè ho semplicemente aggirato il problema usando il poco che so.
    Infatti, come dite entrambi, trattandosi del caricamento iniziale della pagina, non è necessario che le chiamate siano asincrone: tuttavia FireFox non ammette chiamate via XMLHttpRequest sincrone (e del resto siamo d'accordo che questa, concettualmente, è una forzatura).
    Quindi, stringi stringi, il mio problema è: popolare dinamicamente (= estraendo i dati da un db) un certo numero di menù a tendina (o, a questo punto, un qualsiasi oggetto) al momento del caricamento del form html. Le limitazioni sono che non vorrei una pagina php che crea tutto il codice html, bensì mantenere il form in una pagina html. Questo per motivi di linearità e chiarezza.

    Stando quindi che in un modo o nell'altro il mio problema è stato risolto, accetto suggerimenti per rendere la soluzione più sensata, partendo sempre dal fatto che è probabile che mi manchino nozioni basilari di web developing...

    Nel frattempo vi ringrazio e mi impegno a postare un link ad una demo pubblica non appena il codice sarà presentabile.

    Ciao!

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 © 2026 vBulletin Solutions, Inc. All rights reserved.