for(var i=0;i<100;i++){
if ("A" == MTreeText.tagName) {
                            if (MTreeCheck[i].parentNode && MTreeCheck[i].parentNode.tagName == "LI") {
                                AddMyEvent(MTreeCheck[i], 'click', function () {                                   
                                    selectFirst.options.add(new Option(this.innerText, this.getAttribute('treeNodeValue')));
                                });
                            }
                        }
}
问题出在AddMyEvent(MTreeCheck[i], 'click', function () {                                   
                                    selectFirst.options.add(new Option(this.innerText, this.getAttribute('treeNodeValue')));
                                });
我想象中的this应该是MTreeCheck[i]对象啊,可惜,让我失望了,不是的啊,问题一、如何让this对象指向MTreeCheck[i]对象?问题二、像这样加的事件,如果带入我想要的参数呢,全局参数不可取?

解决方案 »

  1.   

    我新手啊,请高手指教啊!我要带入N个对象,是无法把值带入事件中的,只能在事件中取当前对象了,我暂时采用的是srcElement做的,希望高手给出兼容的方法,谢谢!
      

  2.   

    没细看问题,不过一看是关于this的,就可以告诉你了,去查一下跟this有关的call,apply.
    琢磨一下下面的代码:
    apply call (对象冒充)
    apply 应用某一对象的一个方法,用另一个对象替换当前对象。
    call 调用一个对象的一个方法,以另一个对象替换当前对象。
    其它没有太多差别,除了传递参数的不同,下面提供一个例子:
    function f(args1, args2){
    alert(this.name)
    alert(arguments.length)
    }
    var o1 = {
    name : 'lisq'
    }
    f.apply(o1)var o2 = {
    name : 'lufang'
    }
    f.apply(o2, [1, 2])
    f.call(o2, "hello")
      

  3.   

    无法测试 我不能确定就是对的.............MyEvent(MTreeCheck[i], 'click',(function (oThis) {
    return function(){
    selectFirst.options.add(new Option(oThis.innerText, oThis.getAttribute('treeNodeValue')));
    }
    )}(this););//-----------------------------------------------------------------orvar oThis = this;
    AddMyEvent(MTreeCheck[i], 'click', function () {                                   
    selectFirst.options.add(new Option(oThis.innerText, oThis.getAttribute('treeNodeValue')));
    });
      

  4.   

    应该是你的addmyevent函数没有绑定要执行函数的this,导致this指向了其他的地方,你如果仅仅是要this指向MTreeCheck[x]的话,可以直接MTreeCheck[x].onclick = function(){......}这样的形式来定义
      

  5.   


    我目前正是这样做的,我主要是搞不清这个this居然不同的写法,指向了不同的对象!
      

  6.   

    这个应该是ie的bug,在firefox下通过addEventListener绑定的话不存在这个问题,this指向绑定的对象。简单参考以下代码修改一下你的绑定event的方法。function bindEvent(elem,type,fn){
        if(elem.attachEvent){
            elem.attachEvent("on"+type,function(){
                fn.apply(elem,arguments);
            });
        }else{
            elem.addEventListener(type,fn,false);
        }
    }主要是ie6/7下面的ele.onclick=function(){...}这种匿名绑定太不靠谱了,一不小心就循环引用,然后就内存泄漏,少用为妙。
      

  7.   


    for(var i=0;i<100;i++){
    if ("A" == MTreeText.tagName) {
    if (MTreeCheck[i].parentNode && MTreeCheck[i].parentNode.tagName == "LI") {
    AddMyEvent(MTreeCheck[i], 'click', function () {
    var self = this;
    selectFirst.options.add(new Option(self.innerText, self.getAttribute('treeNodeValue')));
    });
    }
    }
    }
      

  8.   

    for(var i=0;i<100;i++){
    if ("A" == MTreeText.tagName) {
                                if (MTreeCheck[i].parentNode && MTreeCheck[i].parentNode.tagName == "LI") {
                                    AddMyEvent(MTreeCheck[i], 'click', (function (obj) {
    return function(){
    selectFirst.options.add(new Option(obj.innerText, obj.getAttribute('treeNodeValue')));
    }
                                    })(MTreeCheck[i]));
                                }
                            }
    }
      

  9.   


    不好意思,也有几天没来CSDN了,你发的代码,我懂,刚入门的时候就是看的那代码,等下我把帖结了,全部都试试,不懂的再发帖问下,谢谢大家的帮忙!