2009-05-29 3 views
1

Ich führe eine Funktion aus, wo ich zuerst den Cursor in den Wartezustand (Sanduhr) bringe und dann eine synchronisierte AJAX-Anfrage sende. Nachdem ich die Antwort erhalten habe, mache ich den Cursor zum Standardzustand.Warum funktioniert HourGlass nicht mit synchroner AJAX-Anfrage in Google Chrome?

der eigentliche Code ist dies ..

// die SMTP-Einstellungen Funktion TestSettings() { var buttonparams = new Object() prüft;

buttonparams.IsCommandButton = true; 
buttonparams.ButtonId = "testsettings"; 
buttonparams.ButtonText = "Sending Test Mail..."; 
buttonparams.ButtonOrigText = "Test Settings"; 

if(buttonparams.IsCommandButton == true) 
    HandleButtonStatus(true, buttonparams); 

var request = function() 
{ 
    var ret = SendForm(buttonparams); 

    alert(ret); 

} 
window.setTimeout(request, 0); 

}

Funktion SendForm (pButtonParams) { var http; var formdata;

http = yXMLHttpRequest(); 

http.open("POST", "./", false); 
http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
http.setRequestHeader("Req-Type", "ajax"); 
formdata = xEncodePair("_object", "PrefMgr")+ "&"; 
formdata += xEncodePair("_action", "SmtpTest")+ "&"; 
formdata += GetEncodedFormData(); 

http.send(formdata); 

if(http.status == 200) 
{ 
    if(pButtonParams.IsCommandButton == true) 
     HandleButtonStatus(false, pButtonParams); 

    return (http.responseText); 
} 
else 
{ 

    return ("Error " + http.status + ": " + http.statusText); 
} 

}

Funktion HandleButtonStatus (pIsButtonStatusChange, pButtonParams) { var button = yById (pButtonParams.ButtonId);

if(pIsButtonStatusChange) 
{ 
     document.body.style.cursor = "wait"; 
    button.value = pButtonParams.ButtonText; 
    button.disabled = true; 

} 
else 
{ 
    document.body.style.cursor = "default"; 
    button.disabled = false; 
    button.value = pButtonParams.ButtonOrigText; 
} 

}

+0

Bitte verwenden Sie keine synchronen AJAX-Anfragen. Sie werden den Browser sperren, bis die Anfrage abgeschlossen ist. – PatrikAkerstrand

Antwort

1

Try zuweisen:

var st = document.body.style; 

und dann zu st in beiden Funktionen beziehen. Dies könnte ein Einschränkungsproblem in der AJAX-Rückruffunktion sein.

EDIT: Verwenden Sie die Callback-Funktion, um die Cursorform wiederherzustellen. Vergessen Sie nicht, dasselbe zu tun, falls der AJAX-Aufruf fehlschlägt.

+0

ya..now es funktioniert gut..aber noch ein Problem .. Ich erstelle ein Objekt, bevor Sie den Cursor warten auf meinen Anwendungszweck. Wenn ich es erstelle, funktioniert HourGlass in Google Chrome nicht mehr. Ich habe die create object Anweisung kommentiert, dann arbeitet Sanduhr. Warum? Ich werde den angegebenen Code aktualisieren. –

+0

Ich denke, Sie sollten den vollständigen Code oder diese Funktion bereitstellen. Es gibt etwas, das mit anderen Dingen zusammenhängt. – Thevs

+0

Jetzt habe ich es. Die Anforderungsfunktion ist ein klassischer Abschluss. Wenn Sie var obj erstellen, erstellen Sie einen globalen Kontext, in dem der Funktionszeiger "request" nicht freigegeben wird. Hier ist, wie es funktioniert: Wenn 'Anfrage 'Funktion zuerst aufgerufen wird - funktioniert es wie erwartet, Senden AJAX-Anfrage. Bei der AJAX-Vervollständigung ist der Kontext der 'request'-Funktion nicht mehr vorhanden, es sei denn, Sie behalten ihn bei, indem Sie' obj' im äußeren Bereich definieren und so eine Schließung erzeugen. Auch synchrone AJAX-Aufrufe funktionieren asynchron über Callback-Funktionen. Sie sollten den Cursor besser in die Callback-Funktion setzen (mit onstatechange) und nicht in "request". – Thevs