如何使用“this”获取事件处理程序中的类变量

时间:2012-03-26 23:09:24

标签: javascript

以下是一些代码:

var class = function(elem,div){

    this.elem= elem;
    this.div = div;

    this.init = function(){
        this.div.bind('keyup',this.handler);
    }

    this.handler= function(event){
        //HOW DO I GET "this.elem" ???
        //here, this = div
    }

    this.init();
}

我想从我的“处理程序”函数中获取变量“elem”,但每次调用this.elem时,“this”指的是绑定到事件处理程序的元素!!。

4 个答案:

答案 0 :(得分:1)

好吧,你可以参考elem

或者您可以在处理程序之外声明var that = this;,然后引用that.elem

答案 1 :(得分:1)

我怀疑您正在注册this.handler作为事件处理程序本身。在这种情况下,该方法不在对象的上下文中执行;它像任何其他事件处理程序一样被执行。

尝试编写一个简单的处理程序,在类的实例上调用handler方法。

var instance = new class(...); // populate args that make sense 
document.yourElement.onclick = function(){
   instance.handler();
}

另外,你真的应该使用prototype来定义实例方法。按照你的方式去做是非常低效的。

var class = function(elem,div){

    this.elem= elem;
    this.div = div;

    this.init();
}


class.prototype.init = function(){
        this.div.bind('keyup',this.handler);
    }

class.prototype.handler= function(event){
        //HOW DO I GET "this.elem" ???
        //here, this = div
    }

答案 2 :(得分:1)

如果您使用ES5时感觉很酷,则可能需要调用Function.prototype.bind方法。像

this.handler= function(event){
    //HOW DO I GET "this.elem" ???
    //here, this = div
}.bind(this)

这种方法还有很多垫片可以优雅地支持旧的浏览器。上面的代码会导致this.handler中存储的函数在永久调用this方法时绑定到new class();的值。

答案 3 :(得分:0)

elem在闭包中捕获,只需将其引用为elem

this.handler= function (event) {
     //HOW DO I GET "this.elem" ???
     //here,

     elem; // elem from the constructor.

     this = div
} 

另外

  1. javascript中没有类。

  2. class 是保留字,不应将其用作标识符名称。

  3. 我想从你的名字和你使用它们的方式来看, elem 是一个DOM元素而 div 是一个DIV元素。如果是这样,他们没有 bind 方法。如果要分配监听器,则:

    this.onkeyup = this.handler;
    
  4. 但必须在定义this.handler之后放置。