【问题标题】:string functions (subStr) not found in XMLHttpRequest event handler在 XMLHttpRequest 事件处理程序中找不到字符串函数 (subStr)
【发布时间】:2011-04-05 09:07:05
【问题描述】:

我在创建服务器推送网络对象时遇到问题。因为 Firefox 和 chrome 处理服务器推送的方式不同,(Firefox 获取 onload 事件,chrome 使用 onprogress /broken )。对于 chrome,我需要捕获 onprogress 事件,然后从 responseText 中屏蔽掉之前的数据。我只想将新数据传递给 chrome。

在 sendpush() 中有两个函数用于设置偶数处理程序。

我知道这与闭包和作用域有关,

有什么办法吗?

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);
 }
}

【问题讨论】:

    标签: javascript scope xmlhttprequest closures event-handling


    【解决方案1】:

    它是小写的,使用substr,而不是subStrsubstring 也一样,也应该小写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-31
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多