//v.2.2 //15-09-2014 _ablia.js //13-06-2014 aggiunta direttiva async nella chiamata ajax della fetch //09-06-2014 modificato fetch: aggiunto parametro per il tipo di risposta dal server // che se non impostato è html altrimenti passare es. "json" per tipo json, ecc.. //29-03-2014 modificato per utilizzare executeProcess(postProcess,ppArgs) //18-03-2014 fetch asincrona //18-02-2014 testato fetch //07-02-2014 fetch modificata da testare il postprocess con passaggio dei parametri //hideList isListVisible e showList spostate in ajacTextBoxSearch //compatibile con abliajar Abl_16_70_26_070214 //30-10-2013 sendJQueryMessage //05-06-2013 aggiiornato immagine attesa //28-01-2011 postProcess adesso puo' essere null //06-11-2008 gestione postProcess. Utilizzabile sempre. Usato su ajaxTextBoxSerch //04-11-2008 prima versione /* 04-11-2008 gestione showList che funziona all'interno dei tab 27-10-2008 priva versione e inizio versionamento */ /** (C) HTML.IT - insieme di funzioni ed oggetti utili per interagire con ajax */ /** OGGETTI / ARRAY */ // oggetto di verifica stato var readyState = { INATTIVO: 0, INIZIALIZZATO: 1, RICHIESTA: 2, RISPOSTA: 3, COMPLETATO: 4 }; // array descrittivo dei codici restituiti dal server // [la scelta dell' array è per evitare problemi con vecchi browsers] var statusText = new Array(); statusText[100] = "Continue"; statusText[101] = "Switching Protocols"; statusText[200] = "OK"; statusText[201] = "Created"; statusText[202] = "Accepted"; statusText[203] = "Non-Authoritative Information"; statusText[204] = "No Content"; statusText[205] = "Reset Content"; statusText[206] = "Partial Content"; statusText[300] = "Multiple Choices"; statusText[301] = "Moved Permanently"; statusText[302] = "Found"; statusText[303] = "See Other"; statusText[304] = "Not Modified"; statusText[305] = "Use Proxy"; statusText[306] = "(unused, but reserved)"; statusText[307] = "Temporary Redirect"; statusText[400] = "Bad Request"; statusText[401] = "Unauthorized"; statusText[402] = "Payment Required"; statusText[403] = "Forbidden"; statusText[404] = "Not Found"; statusText[405] = "Method Not Allowed"; statusText[406] = "Not Acceptable"; statusText[407] = "Proxy Authentication Required"; statusText[408] = "Request Timeout"; statusText[409] = "Conflict"; statusText[410] = "Gone"; statusText[411] = "Length Required"; statusText[412] = "Precondition Failed"; statusText[413] = "Request Entity Too Large"; statusText[414] = "Request-URI Too Long"; statusText[415] = "Unsupported Media Type"; statusText[416] = "Requested Range Not Satisfiable"; statusText[417] = "Expectation Failed"; statusText[500] = "Internal Server Error"; statusText[501] = "Not Implemented"; statusText[502] = "Bad Gateway"; statusText[503] = "Service Unavailable"; statusText[504] = "Gateway Timeout"; statusText[505] = "HTTP Version Not Supported"; statusText[509] = "Bandwidth Limit Exceeded"; /** FUNZIONI */ // funzione per assegnare un oggetto XMLHttpRequest function assegnaXMLHttpRequest() { var XHR = null, browserUtente = navigator.userAgent.toUpperCase(); if(typeof(XMLHttpRequest) === "function" || typeof(XMLHttpRequest) === "object") XHR = new XMLHttpRequest(); else if(window.ActiveXObject && browserUtente.indexOf("MSIE 4") < 0) { if(browserUtente.indexOf("MSIE 5") < 0) XHR = new ActiveXObject("Msxml2.XMLHTTP"); else XHR = new ActiveXObject("Microsoft.XMLHTTP"); } return XHR; }; //////////////////////////////////////////////////// //////////////////////////////////////////////////// function sendAjaxGet2(svltRequest,divLista) { // variabili di funzione // assegnazione oggetto XMLHttpRequest ajax = assegnaXMLHttpRequest(), // assegnazione elemento del documento elemento = prendiElementoDaId(divLista), // risultato booleano di funzione usaLink = true; // se l'oggetto XMLHttpRequest non è nullo if(ajax) { //faccio vedere la lista if(!isListVisible(divLista)) { showList(divLista); } // il link al file non deve essere usato usaLink = false; // impostazione richiesta asincrona in GET // del file specificato ajax.open("get", svltRequest, true); // rimozione dell'header "connection" come "keep alive" ajax.setRequestHeader("connection", "close"); // impostazione controllo e stato della richiesta ajax.onreadystatechange = function() { // verifica dello stato if(ajax.readyState === readyState.COMPLETATO) { // verifica della risposta da parte del server if(statusText[ajax.status] === "OK") // operazione avvenuta con successo elemento.innerHTML = ajax.responseText; else { // errore di caricamento elemento.innerHTML = "Impossibile effettuare l'operazione richiesta.
"; elemento.innerHTML += "Errore riscontrato: " + statusText[ajax.status]; } } } // invio richiesta ajax.send(null); } return usaLink; } function sendAjaxGet(svltRequest,divLista,postProcess) { // variabili di controllo del tempo // data di inizio interazione dataChiamata = new Date(), // tempo in millisecondi dell'inizio inizioChiamata = dataChiamata.getTime(), // secondi di attesa prima di fermare l'interazione massimaAttesa = 10, // variabile cui assegnare la funzione di verifica verificaTempoTrascorso = function(){}; // variabili di funzione // assegnazione oggetto XMLHttpRequest ajax = assegnaXMLHttpRequest(), // assegnazione elemento del documento elemento = Ab.prendiElementoDaId(divLista), // risultato booleano di funzione usaLink = true; // se l'oggetto XMLHttpRequest non è nullo if(ajax) { //faccio vedere la lista { //metto la gif elemento.innerHTML="Ricerca in corso ....."; //elemento.innerHTML="Ricerca in corso ....."+"Ricerca in corso"; //Ricerca in corso } // il link al file non deve essere usato usaLink = false; // impostazione richiesta asincrona in GET // del file specificato ajax.open("get", svltRequest, true); // rimozione dell'header "connection" come "keep alive" ajax.setRequestHeader("connection", "close"); // impostazione controllo e stato della richiesta ajax.onreadystatechange = function() { // verifica dello stato if(ajax.readyState === readyState.COMPLETATO) { // annulliamo la funzione di verifica tempo verificaTempoTrascorso = function(){}; // verifica della risposta da parte del server if(statusText[ajax.status] === "OK"){ // operazione avvenuta con successo elemento.innerHTML = ajax.responseText; //post elaborazioni??? if(postProcess!=null) postProcess(); } else { // errore di caricamento elemento.innerHTML = "Impossibile effettuare l'operazione richiesta.
"; elemento.innerHTML += "Errore riscontrato: " + statusText[ajax.status]; } } // se la richiesta non è stata ancora ultimata // è possibile sfruttare la variabile massimaAttesa // per verificare se il controllo sul tempo trascorso // sia stato creato o meno. // Essendo tale valore un intero rappresentante i secondi // ma non essendo ancora stato riassegnato nel corrispettivo // in millesimi, questo else if può garantire che // il codice al suo interno verrà eseguito una sola volta else if(massimaAttesa < 1000) { // conversione di massimaAttesain millisecondi massimaAttesa= massimaAttesa * 1000; // il controllo sul tempo trascorso deve essere // asincrono a questa funzione poichè non è detto // che il cambio di stato della richiesta // venga effettuato in tempi utili. // Una funzione apposita per la verifica // è la soluzione più indicata verificaTempoTrascorso = function() { // ogni chiamata asincrona a questa funzione // dovrà verificare la durata dell'interazione // è necessario quindi ridichiarare la variabile // al fine di ottenere il nuovo oggetto Date dataChiamata = new Date(); // Se il tempo trascorso è maggiore della // massima attesa ... if((dataChiamata.getTime() - inizioChiamata) > massimaAttesa) { // ... interrompiamo la richiesta ed // informarmiamo l'utente di quanto avvenuto. // Quindi riassegnamo onreadystatechange ad una // funzione vuota, poichè quest'evento sarà // sollevato chiamando il metodo abort() ajax.onreadystatechange = function(){return;}; // è possibile a questo punto richiamare il metodo abort // ed annullare le operazioni dell'oggetto XMLHttpRequest ajax.abort(); // creiamo un elemento per avvertire l'utente // del fallimento della richiesta da aggiungere // a quello predisposto per mostrare il risultato. // Usiamo il metodo createElement() del document e // non innerHTML,che potrebbe riscrivere il link selezionato // annullando l'assegnazione del parametro fittizio. // Avendo annullato l'utilità dell'oggetto XMLHttpRequest // è possibile anche riciclare la variabile 'ajax'. ajax = document.createElement("p"); ajax.innerHTML = "Spiacente, richiesta fallita.
" + "La prego di ritentare tra qualche istante."; elemento.appendChild(ajax); } // se invece il tempo è inferiore al timeout else { // si richiama questa stessa funzione, con un tempo // che non dovrà essere ne alto ne troppo basso. setTimeout(verificaTempoTrascorso, 100); } }; // definita la funzione non resta che avviarla verificaTempoTrascorso(); }; } // invio richiesta ajax.send(null); } return usaLink; } //////////////////////////////////////////////////// // function mostraAttesa(testo) { // variabili di funzione var // totale dei puntini mostrati puntini = 0, // elemento contenente il testo // oppure il nodo testuale all'interno // dello stesso elemento testoIntrattenimento = Ab.prendiElementoDaId("testo-temporaneo"), // funzione per aggiungere puntini al testo scelto animaTesto = function() { // stringa locale contenente i vari puntini var testoAggiunto = ""; // ciclo per aggiungere i puntini for(var a = 0; a < puntini; a++) testoAggiunto += "."; // assegnazione del nuovo testo al nodo // comprensivo dei puntini testoIntrattenimento.nodeValue = testo + testoAggiunto; // controllo sul totale puntini // se inferiori a 4 if(puntini < 4) // si aggiunge un altro punto puntini++; // altrimenti si ricomincia da nessun punto else puntini = 0; // richiamo alla stessa funzione con intervallo non // inferiore ai 250 millisecondi setTimeout(animaTesto, 300); }; // verifica della precedente assegnazione // del nodo testuale all'interno dell'elemento if(testoIntrattenimento.firstChild) { // in questo caso è necesario riassegnare // la funzione al fine di eliminare l'intervallo // successivo ... animaTesto = function(){}; // ... per poi eliminare il nodo precedentemente aggiunto testoIntrattenimento.removeChild(testoIntrattenimento.firstChild); } else { // nodo inesistente, è necessario crearlo // con il testo predefinito ... testoIntrattenimento = document.createTextNode(testo); // ... ed assegnarlo all'elemento Ab.prendiElementoDaId("testo-temporaneo").appendChild(testoIntrattenimento); // per poter richiamare la funzione animaTesto(); }; }; ////////////////////////////////////////////////////// // fetch // chiama la servlet passandogli i comandi e ritorna un valore che viene inserito o nella divList // oppure passato come parametro alla funzione postProcess // DA TESTARE A FONDO... ////////////////////////////////////////////////////// function fetch(servlet, command, divList, postProcess, async, type) { //gestione chiamate asincrone if(async!= undefined && async!=null){ $("#_async").val(async); //imposto una immagine di attesa $("#"+divList).html(""); //alert('pio'); } else { $("#_async").val(""); } if (async==undefined) { async=true; } if (type==undefined) { type = "html"; } $.ajax({ type: "POST", url: servlet, data: command, dataType: type, async: async, success: function(msg) { $("#_async").val(""); if ("#"+divList!=null){ $("#"+divList).html(msg); if(postProcess!=null){ Ab.executeProcess(postProcess,msg); } } else if(postProcess!=null){ Ab.executeProcess(postProcess, msg); } }, error: function() { $("#"+divList).html("Chiamata fallita, si prega di riprovare..."); //alert("Chiamata fallita, si prega di riprovare..."); $("#_async").val(""); } }); } //******************************************************** //******************************************************** // attesa sulle chiamate ajax sincrone //******************************************************** //******************************************************** $body = $("body"); $(document).on({ ajaxStart: function() { //console.log("loading partito"); if($('#_async').val()==="" || $('#_async').val()==="false"){ $body.addClass("loading"); } else { //alert('pio'); } }, ajaxStop: function() { //console.log("loading fermato"); if($('#_async').val()==="" || $('#_async').val()==="false"){ $body.removeClass("loading"); } } });