Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: [AJAX] ritorno di un valore

  1. #1
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,422

    [AJAX] ritorno di un valore

    Confesso di avere le idee un po' confuse sull'oggetto XMLHttpRequest & parenti e affini.

    Ho questo codice:
    codice:
    function processBarcode(bc) {
                        var e = document.getElementById("ddlconti");
                        var conto = e.options[e.selectedIndex].value;
                        
                        var verificato = (controlla(conto, bc) == 'True');
                     
                        if (verificato) {
                            //mostro labels
                            document.getElementById("matri").display = "block";
                            document.getElementById("scans").innerHTML += "<div>" + bc + "</div>";
                            document.getElementById("bottoni").style.display = "block";
                        } else {
                            alert('MATRICOLA NON ACCETTATA!');
                        }
                    }
    
                   
                    //la funzione seguente restituisce una stringa con true o false se la matricola appartiene al conto indicato
                    function controlla(c, m) {
                        var httpRequest = new XMLHttpRequest();
                        httpRequest.open('POST', "maincheck.ashx?c="+c+"&m="+m);
                        httpRequest.send();
                        //httpRequest.responseType = 'text'
                        return httpRequest.responseText;
                    }
    La funzione processbarcode lancia la function controlla che, via XMLHttpRequest , interroga la pagina maincheck.ashx passandole due parametri in querystring.
    A seconda dell'esito della maincheck (che fa un response.write("True") oppure no) poi deve fare delle altre cose oppure mostrarmi l'alert MATRICOLA NON ACCETTATA!
    Ecco, mi ritorna sempre quell'alert anche se ho verificato che la maincheck con i parametri che le passo mi scriverebbe un bel 'True'...

    Penso di sbagliare qualcosa ma non so cosa.
    Ho ipotizzato che il problema sia che la XMLHttpRequest è asincrona e questo manda in cacca il resto della processbarcode: potrei metterla sincrona ma ho letto che è da delinquenti... e allora come ne esco?
    C'è un paziente mentore che mi indichi la via?
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  2. #2
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    28,379
    Premesso che non sviluppo più XLMHttpRequest da diversi anni (almeno 4/5) e sono molto arrugginito. Ti consiglio di usare jQuery per questo tipi di operazioni.
    Credo che il problema nel tuo codice si la chiamata Ajax esterna alla funzione processBarcode la variabile “verificato” richiama la funzione controlla e non aspetti la risposta Ajax pertanto la variabile “verificato” sarà sempre nulla (a conferma controlla la console del browser).
    La soluzione più rapida e inserire la chiamata Ajax dentro la funzione processBarcode ed eseguire il controllo al response.


    P.S. Se usi l’invio POST appendi le variabili al send() oppure usi il metodo GET e le appendi alla url
    Ultima modifica di cavicchiandrea; 04-10-2018 a 21:13
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  3. #3
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,422
    Su JQuery sono ancora meno sciolto che col resto, se mi mostri come si fa faccio un test.

    Se ho capito bene la via veloce che mi suggerisci fa così:
    codice:
    function processBarcode(bc) {
            var e = document.getElementById("ddlconti");
            var conto = e.options[e.selectedIndex].value;
            
            var httpRequest = new XMLHttpRequest();
            httpRequest.open('GET', "maincheck.ashx?c="+conto+"&m="+bc);
            httpRequest.send();
            //httpRequest.responseType = 'text'
                    
            var verificato = (httpRequest.responseText == 'True');
         
            if (verificato) {
                //mostro labels
                document.getElementById("matri").display = "block";
                document.getElementById("scans").innerHTML += "<div>" + bc + "</div>";
                document.getElementById("bottoni").style.display = "block";
            } else {
                alert('MATRICOLA NON ACCETTATA!');
            }
        }
    ...ora provo.
    (ma potrei anche non aver capito una mazza )
    Ultima modifica di supermac; 05-10-2018 a 09:37
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  4. #4
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,422
    Son riuscito a farlo andare ma solo usandolo in modalità sincrona
    codice:
    httpRequest.open('GET', "maincheck.ashx?c="+conto+"&m="+bc, false);
    è tanto brutto?
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  5. #5
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    28,379
    codice:
    function processBarcode(bc) {
            var e = document.getElementById("ddlconti");
            var conto = e.options[e.selectedIndex].value;
            
            var httpRequest = new XMLHttpRequest();
            httpRequest.open('GET', "maincheck.ashx?c="+conto+"&m="+bc);
            httpRequest.send();
            
            if (httpRequest.responseText == True) {
                //mostro labels
                document.getElementById("matri").display = "block";
                document.getElementById("scans").innerHTML += "<div>" + bc + "</div>";
                document.getElementById("bottoni").style.display = "block";
            } else {
                alert('MATRICOLA NON ACCETTATA!');
            }
        }
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  6. #6
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,422
    none
    a parte che il responseText dell'httprequest è una stringa e quindi non posso fare il confronto con " == True " (ma quello non è un problema, ho già corretto), il fatto è che con la chiamata asincrona mi ritorna ancora sempre "False"... devo metterla sincrona perchè vada
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  7. #7
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    28,379
    Quote Originariamente inviata da supermac Visualizza il messaggio
    none
    a parte che il responseText dell'httprequest è una stringa e quindi non posso fare il confronto con " == True " (ma quello non è un problema, ho già corretto), il fatto è che con la chiamata asincrona mi ritorna ancora sempre "False"... devo metterla sincrona perchè vada
    La differenza tra asincrona e sincrona è che la prima invia i dati al server e non blocca il browser in attesa della risposta la seconda blocca il browser fin quando il server non gli restituisce la risposta. Ed è per questo motivo che è sconsigliata in caso di server lento o bloccato impalla anche il browser. Secondo me il problema è lato server, poi fai come credi.
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  8. #8
    Utente di HTML.it L'avatar di vic53
    Registrato dal
    Oct 2010
    residenza
    Fonte Nuova (Roma)
    Messaggi
    493
    Quote Originariamente inviata da cavicchiandrea Visualizza il messaggio
    La differenza tra asincrona e sincrona è che la prima invia i dati al server e non blocca il browser in attesa della risposta la seconda blocca il browser fin quando il server non gli restituisce la risposta. Ed è per questo motivo che è sconsigliata in caso di server lento o bloccato impalla anche il browser. Secondo me il problema è lato server, poi fai come credi.
    devi usare i codici di ritorno di readyState per avere la risposta e ..
    ti posso postare un pezzo di codice da uno dei miei file cosi lo studi e lo adatti?
    qui eseguo il file salvando i dati sul server e metto il messaggio di ritorno sul campo messaggio a video...
    txt contiene i campi del form nella struttura "?campo=valore&campo1_=valore..." pelevati dal form
    codice:
    ...
     var xhttp = new XMLHttpRequest();
      xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
          document.getElementById("msg").value=this.responseText;
        }
      };
      xhttp.open("POST", "SalvaSchedaCliente.php"+txt, true);
      xhttp.send();
    ...
    se ti è utile...
    Vic53

  9. #9
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,422
    Grazie vic
    quindi adattando il mio codice a quanto mi suggerisci, secondo te questa in asincrono dovrebbe andare? (sempre se A) ho capito bene, B) l'ho scritta giusta... secondo quel che dice Andrea tu hai usato il POST ma andava usato GET)
    codice:
    function processBarcode(bc) {
            var e = document.getElementById("ddlconti");
            var conto = e.options[e.selectedIndex].value;
            
            var httpRequest = new XMLHttpRequest();
            httpRequest.onreadystatechange = function() {
               if (this.readyState == 4 && this.status == 200) {
                  var risposta =this.responseText;
                  if (risposta == 'True') {
                     //mostro labels
                     document.getElementById("matri").display = "block";
                     document.getElementById("scans").innerHTML += "<div>" + bc + "</div>";
                     document.getElementById("bottoni").style.display = "block";
                  } else {
                     alert('MATRICOLA NON ACCETTATA!');
                  }
               }
            };
    
            httpRequest.open('GET', "maincheck.ashx?c="+conto+"&m="+bc, true);
            httpRequest.send();
        }
    Ultima modifica di supermac; 15-10-2018 a 15:26
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  10. #10
    Utente di HTML.it L'avatar di vic53
    Registrato dal
    Oct 2010
    residenza
    Fonte Nuova (Roma)
    Messaggi
    493

    differenze tra GET e POST

    Quote Originariamente inviata da supermac Visualizza il messaggio
    Grazie vic
    quindi adattando il mio codice a quanto mi suggerisci, secondo te questa in asincrono dovrebbe andare? (sempre se A) ho capito bene, B) l'ho scritta giusta... secondo quel che dice Andrea tu hai usato il POST ma andava usato GET)
    codice:
    function processBarcode(bc) {
            var e = document.getElementById("ddlconti");
            var conto = e.options[e.selectedIndex].value;
            
            var httpRequest = new XMLHttpRequest();
            httpRequest.onreadystatechange = function() {
               if (this.readyState == 4 && this.status == 200) {
                  var risposta =this.responseText;
                  if (risposta == 'True') {
                     //mostro labels
                     document.getElementById("matri").display = "block";
                     document.getElementById("scans").innerHTML += "<div>" + bc + "</div>";
                     document.getElementById("bottoni").style.display = "block";
                  } else {
                     alert('MATRICOLA NON ACCETTATA!');
                  }
               }
            };
    
            httpRequest.open('GET', "maincheck.ashx?c="+conto+"&m="+bc, true);
            httpRequest.send();
        }
    naturalmente tu come dice Andrea puoi usare GET, nel mio caso uso POSt perchè la molde di dati è diversa e se ti serve inviare molti dati è meglio usare POST di cui il limite è alto come n. di byte che puoi trasmettere... poi con la GET tu devi passare tramite Querystring i dati in chiaro invece in POST
    puoi mandare i dati dinamici del form anche se sono molti comunque vedi tu quale usare al meglio per te
    ciao
    Vic53

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