Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    AJAX: chiamata asincrona che funziona in Firefox e (quasi) mai in IE

    Ciao a tutti:
    sto implementando una funzione AJAX piuttosto semplice e basilare: ho un form piuttosto grande, e un suo relativo file asp di aggiornamento dei dati nel database: l'idea è di inserire un autosave (come quello di excel o word) che, ad intervalli regolari, chiami in background il file di aggiornamento e salvi i dati nel database.
    Cercando anche degli script in rete ho messo assieme una serie di funzioni che, se eseguite in firefox (3 e ora anche 4), funzionano a meraviglia; se eseguite in IE8 ottengo dei comportamenti strani: in alcuni, rarissimi casi, fa l'aggiornamento (mai più di una volta per sessione, comunque, e se lo fa è alla prima chiamata), per il resto, appena il ReadyState arriva a 4, ottengo come status un surreale 12015 che, cercando in rete (e non senza fatica) ho reperito come un errore di "Login failure". Ma login a cosa???

    Il codice ajax è questo:

    codice:
    <script type="text/javascript">
    function getHTTPObject() {
    	var http = false;
    	if(typeof ActiveXObject != 'undefined') {
    		try {http = new ActiveXObject("Msxml2.XMLHTTP");}
    		catch (e) {
    			try {http = new ActiveXObject("Microsoft.XMLHTTP");}
    			catch (E) {http = false;}
    		}
    	} else if (XMLHttpRequest) {
    		try {http = new XMLHttpRequest();}
    		catch (e) {http = false;}
    	}
    	return http;
    }
    
    var oXHR = getHTTPObject();
    
    function starttimer()
    	{
    	t = setTimeout("AutoSave()", 10000);
    	}
    
    function RetrieveArguments()
    	{
    	var form = document.getElementById('Form<%=paginacorrente%>');
    	var tosend = ""
    	for(var i=0;i<form.length;i++)
    		{
    		if(form.elements[i].type=='radio' || form.elements[i].type=='checkbox')
    			{
    			if(form.elements[i].checked==true)
    				{
    				tosend = tosend + form.elements[i].name + '=' + form.elements[i].value + '&';
    				}
    			}
    		else
    			{
    			tosend = tosend + form.elements[i].name + '=' + form.elements[i].value + '&';
    			}
    		}
    	tosend = tosend + 'TipoInvio=0';
    	return tosend;
    	}
    
    function Miohandler()
    	{
    	if(oXHR.readyState == 4)
    		{
    		switch (oXHR.status)
    			{
    			case 200:
    				document.getElementById('StatoSalvataggio').innerHTML = "Ultimo salvataggio effettuato il " + getCalendarDate() + " " + getClockTime();
    				break;
    			default:
    				document.getElementById('StatoSalvataggio').innerHTML = "Errore nel salvataggio automatio (codice=" + oXHR.status + ")";
    				break;
    			}
    		starttimer();
    		}
    	else
    		{
    		document.getElementById('StatoSalvataggio').innerHTML = "Salvataggio in corso..."
    		}
    	}
    
    function AutoSave()
    	{
    	var parameters = RetrieveArguments();
    	oXHR.open("POST", "<%=Application("rootdir")%>Agg<%=paginacorrente%>.asp", true)
    	oXHR.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
    	oXHR.setRequestHeader("Content-length", parameters.length);
    	oXHR.setRequestHeader("Connection", "close");
    	oXHR.onreadystatechange = Miohandler;
    	oXHR.send(parameters);
    	}
    </script>
    Il tutto viene avviato onload con una chiamata a starttimer()
    Non capisco cosa non piaccia a IE... a qualcuno è mai capitata una cosa simile?

  2. #2
    Dopo svariate prove, non ho trovato una soluzione, ma una possibile causa (la posto in quanto potrebbe tornare utile ad altri): lo script che ho riportato funziona correttamente, MA:
    la directory nella quale lavoro (e della quale fanno parte tutti i file coinvolti) è settata in IIS sotto permission NT (no anonymous login, windows integrated authentication): se porto tutto fuori in una cartella libera, non ho problemi. Quando, invece, sono in questa directory, IE (e solo IE) esegue i comandi correttamente solo la prima volta che in una sessione chiama lo script. Dalla seconda in poi ritorna l'errore, come se le credenziali di accesso non venissero più riconosciute (da qui, immagino, l'errore di "Login failure")
    Anche se vado lievemente off-topic: come è possibile che explorer non sappia gestire la windows authentication in ajax, mentre qualsiasi browser con tecnologia mozilla si?
    In rete non riesco a trovare nulla in proposito, ma mi sembra piuttosto limitante...

  3. #3
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,131
    Ma visto che la prima chiamata l'esegue, poi va in errore potrebbe essere per l'effetto cache che sofre ie per le chiamate ajax, prova cosi:
    Appendi un numero random ai parametri
    var casuale = "&rand="+Math.floor(99999*Math.random())
    tosend = tosend + 'TipoInvio=0'+ casuale;
    e togli questa riga che potrebbe dare problemi
    oXHR.setRequestHeader("Connection", "close");
    Se anche cosi non dovesse funzionare, prendi in considerazione l'utilizzo di jquery che risolve molte problematiche legate ai browser
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  4. #4
    Fantastico! Funziona senza intoppi già solo togliendo il connection close! Il parametro random l'ho aggiunto lo stesso per sicurezza, mai fidarsi di IE...

    Grazie mille!

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