Sorry, dass ich diesen Thread nochmal ausgrabe, aber Chriz hat noch gefragt, wie das mit der Aufrechtherhaltung des Kontexts geht.
Nun, im Rahmen eines Feedreaders bin ich auf folgende Lösung gekommen und will sie einfach einmal allen zur Verfügung stellen, die über dasselbe Problem stolpern.
Hier der Code (noch weites gehend undokumentiert):
Code:
function CFeedMate()
{
}
CFeedMate.prototype.CAjax = function()
{
var method = 'GET';
var params = new Object();
var headers = new Object();
this.load = function(url, readyStateAction)
{
var xmlHttp = new XMLHttpRequest();
xmlHttp.open(method, url);
// generate POST parameters querystring
if (method == 'POST') {
var queryString = '';
for (var i in params) {
queryString += encodeURIComponent(i) + '=' + encodeURIComponent(params[i]) + '&';
}
if (queryString == '') {
queryString = null;
}
}
// send headers
for (var i in headers) {
xmlHttp.setRequestHeader(i, headers[i]);
}
if (method == 'POST') {
xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
}
var reqObj = new this.CRequest();
reqObj.setReadyStateAction(readyStateAction);
reqObj.setQueryString(queryString);
reqObj.doRequest(xmlHttp);
}
this.setMethod = function(m)
{
method = m.toUpperCase();
if (method != 'POST' && method != 'GET') {
method = 'GET';
}
}
this.setParam = function(name, value)
{
params[name] = value;
}
this.setHeader = function(name, value)
{
headers[name] = value;
}
}
CFeedMate.prototype.CAjax.prototype.CRequest = function()
{
var reqObj = null;
var queryString = null;
var readyStateAction = null;
var requestDone = false;
this.doRequest = function(obj)
{
reqObj = obj;
reqObj.onreadystatechange = this.performReadyStateAction;
reqObj.sender = this;
reqObj.send(queryString);
}
this.setQueryString = function(string)
{
queryString = string;
}
this.setReadyStateAction = function(action)
{
readyStateAction = action;
}
/**
* NOTE: here 'this' is not in context of this object, it's in
* context of the XMLHttpRequest object!
* this.sender contains the actually object.
*/
this.performReadyStateAction = function()
{
if (this.readyState == 4) {
this.sender.afterRequest();
}
}
this.afterRequest = function()
{
requestDone = true;
this.readyStateAction = readyStateAction;
this.readyStateAction();
}
this.getStatus = function()
{
if (requestDone) {
return reqObj.status;
}
return false;
}
this.getResponseText = function()
{
if (requestDone) {
return reqObj.responseText;
}
return false;
}
this.getResponseXML = function()
{
if (requestDone) {
return reqObj.responseXML;
}
return false;
}
}
// ---
window.onload = function()
{
var FeedMate = new CFeedMate();
var req = new FeedMate.CAjax();
req.setMethod('post');
req.setParam('test', 'abc');
req.load('test.php', function()
{
alert(
'Status: ' + this.getStatus() + '\n' +
'ResponseText: ' + this.getResponseText()
);
});
}