2010-08-29 29 views
1

Je rencontre un problème lors de la création d'un objet réseau Push Server. Parce que Firefox et Chrome gèrent différemment le serveur, (Firefox obtient des événements onload, chrome utilise onprogress/broken). Pour le chrome, j'ai besoin de capturer les événements onprogress, puis de masquer les données précédentes du responseText. Je veux passer juste les nouvelles données au chrome.fonctions de chaînes (subStr) introuvables dans le gestionnaire d'événements XMLHttpRequest

Dans sendpush(), il existe deux fonctions que j'utilise pour définir le gestionnaire pair.

Je sais que cela a quelque chose à voir avec la fermeture et la portée,

Tous les ides?

function prog(evt, obj, func) { 
var r = evt.target; 
var t = typeof(r.responseText); 
var z = "test".subStr(2); 
var d = r.responseText.subString(obj.oldLen); 
var s = {}; 
s["code"] = r.status; 
s["text"] = r.statusText; 
func(s, d); 
}; 

function maRequest(url, method, multi) { 
this.method = "POST"; 
this.multi = false; 
this.url = url; 
this.self = this; 
this.oldLen = 0; 

if (method != undefined) 
    this.method = method; 

if (multi != undefined) 
    this.multi = multi; 

var req = new XMLHttpRequest(); 
this._req = req; 
req.multipart = this.multi; 

/* this._req.onreadystatechange = function(evt) {*/ 
this.send = function(data, loadcb) { 
    this._req.onload = function(evt) { 
    var r = evt.target; 
    var stat = {}; 
    stat["code"] = r.status; 
    stat["text"] = r.statusText; 
    loadcb(stat, r.responseText); 
    return false; 
    }; 
    this._req.open(this.method, this.url, true); 
    try { 
    this._req.send(data); 
    } catch (e) { 
    alert(e); 
    } 
}; 

this.setProgress = function(func) { 
    var self = this; 
    self._req.onprogress = function (evt) { 
    return prog(evt, self, func); 
    } 
}; 

this.addCallback = function(name, func) { 
    var self = this; 
    var cb = function (evt) { 
    func(evt, self); 
    } 
    switch(name) { 
    case "loadstart": 
    req.onloadstart = cb; 
    break; 
    case "progress": 
    req.onprogress = cb; 
    break; 
    case "abort": 
    req.onabort = cb; 
    break; 
    case "error": 
    req.onerror = cb; 
    break; 
    default: 
    req.addEventListener(name, function (evt) { 
    func(evt, self); 
    }, false); 
    }; 
}; 

this.abort = function() { 
    req.abort(); 
}; 
}; 

// works when passed as callback function 
function progress(evt, obj) { 
var req = evt.target; 
stat = req.status; 
alert(req.statusText+" "+req.readyState+" "+ req.responseText.substr(obj.oldLen)); 
obj.oldLen = req.responseText.length; 
return true; 
} 

function maChat() { 
this.url = "/mafw/chat.ma"; 
} 
maChat.prototype = new maRequest(this.url); 

function callback(status, data) { 
alert(status["code"]+status["text"]+" "+data); 
} 

function sendmsg() { 
var cmd = {}; 
cmd["type"] = "cmd"; 
cmd["cmd"] = "initdata"; 
cmd["me"] = 0; 

// try { 
// var conn = new maRequest("http://localhost/mafw/chat.ma"); 
// conn.send(JSON.stringify (cmd), callback); 
// } catch (e) { 
// alert (e); 
// } 
try { 
    var conn1 = new maChat(); 
    conn1.send(JSON.stringify (cmd), callback); 
} catch (e) { 
    alert (e); 
} 
}; 


function sendpush() { 
var cmd = {}; 
cmd["type"] = "cmd"; 
cmd["cmd"] = "initdata"; 
cmd["me"] = 0; 

try { 
    var conn = new maRequest("http://localhost/mafw/chat.psh", "POST", true); 
    //conn.addCallback( "progress", progress); 
    conn.setProgress(callback); 
    conn.send(JSON.stringify (cmd), callback); 
} catch (e) { 
    alert (e); 
} 
} 

Répondre

1

Il est en minuscule, utilisez substr, pas subStr. La même chose vaut pour substring, il devrait aussi être en minuscules.