[removed] how adding event handler inside a class with a class-method as the callback?

后端 未结 2 1641
有刺的猬
有刺的猬 2020-12-05 08:20

How do i add an event handler inside a class with a class-method as the callback ???

move over here
相关标签:
2条回答
  • 2020-12-05 08:41

    The this inside the event listener callback will be the element that fired the event. If you want the this to be the instance of your class, then either:

    Bind the function to the class instance:

    Using Function.prototype.bind, will create a new function that its this value will always be what you specify it to be (the class instance):

    r.addEventListener('mouseover', this.OnEvent.bind(this));
    //                                          ^^^^^^^^^^^
    

    Wrap the function inside an anounimous function:

    var that = this;
    r.addEventListener('mouseover', function(ev) { that.OnEvent(ev); });
    //                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

    or use an arrow function (so no need for that):

    r.addEventListener('mouseover', ev => this.OnEvent(ev));
    //                              ^^^^^^^^^^^^^^^^^^^^^^
    

    Note: As mentioned in a comment bellow, both of the above methods pass a different function to addEventListener (the one with bind create a new function, and the anounimous function is obviously !== this.OnEvent). If you are going to remove the event listener later, you'll have to store a reference to the function:

    var reference;
    r.addEventListener('mouseover', reference = this.OnEvent.bind(this));
    //                              ^^^^^^^^^^^^
    

    or:

    var reference;
    var that = this;
    r.addEventListener('mouseover', reference = function(ev) { that.OnEvent(ev); });
    //                              ^^^^^^^^^^^^
    

    then you can remove the event listener like:

    r.removeEventListener('mouseover', reference);
    
    0 讨论(0)
  • 2020-12-05 08:42

    You can actually return the object as an EventListener callback, this way JS will search for an handleEvent method in the class and execute accordingly :

    var myInstance = new myClass;
    myInstance.addEventListener("mousedown",myInstance);
    
    //To remove the event you can follow the same pattern
    myInstance.removeEventListener("mousedown",myInstance);
    

    You have to construct your class this way :

    Class myClass
    
    constructor(){
         //Whatever this is supposed to do.
         //You can also add events listener within the class this way :
         this.addEventListener("mousedown",this);
    }
    
    mouseDownEvent(e)(){
         //Some action related to the mouse down event (e)
         console.log(e.target);
    }
    mouseMoveEvent(e)(){
         //Some action related to the mouse move event (e)
    }
    mouseUpEvent(e)(){
         //Some action related to the mouse up event (e)
    }
    
    handleEvent(e) {
        switch(e.type) {
            case "mousedown":
                this.mouseDownEvent(e);
            break;
            case "mousemove":
                this.mouseMoveEvent(e);
            break;
            case "mouseup":
                this.mouseUpEvent(e);
            break;
        }
    }
    

    Sources :

    https://medium.com/@WebReflection/dom-handleevent-a-cross-platform-standard-since-year-2000-5bf17287fd38

    https://www.thecssninja.com/javascript/handleevent

    https://metafizzy.co/blog/this-in-event-listeners/

    I find this method clearer, also while declaring events inside the class this is pretty explicit. Hope I helped someone.

    0 讨论(0)
提交回复
热议问题