Einzelnen Beitrag anzeigen
Alt 22.10.2008, 20:13  
Manko10
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.695
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

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()
        );
    });
}
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems

Geändert von Manko10 (22.10.2008 um 21:32 Uhr).
Manko10 ist offline   Mit Zitat antworten