var oo = this;//先定义这个//再修改成这个
onComplete: function(){ oo.callback.call(oo) })

解决方案 »

  1.   

    onComplete: function(){ oo.callback.apply(oo,arguments) }
      

  2.   

    没有效果,想用匿名函数取代this的指代 initialize: function(pid, d, serv){
    var selfobj=this;               //<----新定义
    this.curSelect = pid;
    this.curSelValue = -1;
    this.data = d;
    this.servlet = serv; this.init();
    this.selectOnEvent();
    },
    init: function(){
    alert(selfobj.servlet);  //<----  检测selfobj的有效性,意外的是js异常提示 selfobj未定义
    var url = this.servlet;
    var pars = $H(this.data);
    var myAjax = new Ajax.Request(url,{
    method: 'post',
    parameters: pars,
    onComplete: function(){selfobj.callback.apply(selfobj)} //<---- 楼上的写法
    //onComplete: this.callback.apply(this,arguments)
    });
    }, callback: function(callbackdata){
    alert(callbackdata);
    var pE=$(this.curSelect);
    alert(pE);
    var info=eval(callbackdata.responseText);
    this.selectinit(pE);
    for(var i=0;i<info.length;i=i+1)
    {
    var e=this.dooption(info[i].nrmc,info[i].nrid);
    pE.appendChild(e);
    }
    },用普通的类构造方法试验下看
      

  3.   

    写init里,还是原来的异常,alert(callbackdata);报告undefined以下是没有问题的另一种类构造版本,注意所有类的内部方法中对该实例对象的引用都使用了selfobj
    这样的写法怎么就能运行呢?而且不需要apply绑定
    prototype的类构造方式使用apply为核心构造返回的,所以它的内部函数就不能在使用apply了?
    谁能解释下function Despair(pid, d, serv)
    {
    var selfobj=this;
    this.curSelect = pid;
    this.curSelValue = -1;
    this.data = d;
    this.servlet = serv;

    this.init=function()
    {
    var url = this.servlet;
    var pars = $H(selfobj.data);
    var myAjax = new Ajax.Request(url,{
    method: 'post',
    parameters: pars,
    //onComplete: function(){selfobj.callback.apply(selfobj)}
    onComplete: selfobj.callback
    });
    }
    this.callback=function(callbackdata)
    {
    alert(callbackdata);
    var pE=$(selfobj.curSelect);
    alert(pE);
    var info=eval(callbackdata.responseText);
    selfobj.selectinit(pE);
    for(var i=0;i<info.length;i=i+1)
    {
    var e=selfobj.dooption(info[i].nrmc,info[i].nrid);
    pE.appendChild(e);
    }
    }        ......
            ...... this.init();
    this.selectOnEvent();
    }
      

  4.   

    onComplete: function(aa){ oo.callback.call(oo,aa) }这样呢
      

  5.   

    可以了~
    aa 参数应该是ajax回调数据的入口,
    这个onComplete 回调函数的注册不仅要用匿名函数包装,还要使用实例对象引用
    虽然从底层prototype看不懂原因,不过问题解决的,有时间研究下高人,多谢
      

  6.   

    用匿名函数是为了用call
    调用匿名函数的不是Despair所以在匿名函数内的this不是想当然的那个this