Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Контекст объекта внутри метода с параметром event (https://javascript.ru/forum/misc/75846-kontekst-obekta-vnutri-metoda-s-parametrom-event.html)

MC-XOBAHCK 11.11.2018 23:17

Контекст объекта внутри метода с параметром event
 
Подскажите в такой ситуации.
Есть объект:
const testApp = {
    
    typesAll: document.querySelectorAll('.type'),
    type: '',
    

    event: function() {
        this.typesAll.forEach( item => item.addEventListener('click', this.selectType)); // Вызов метода
    },


    selectType: function (e) {
        
        if (e.type == 'click' || (e.type == 'keypress' && (e.which === 13 || e.keyCode === 13))) {
            
            testApp.type = this.getAttribute('name'); // тут testApp заменить контекстом объекта???

        }

    }

}

Метод selectType принимает параметр event.
Внутри метода я специально оставил кусок кода чтоб показать что методу нужны event и контекст элемента по которому произошел клик, чтоб получить значение из атрибута name.

Вопрос: могу ли я в 16 строке заменить testApp контекстом объекта, чтоб не писать имя объекта? При этом мне остаются нужны event и контекст элемента по которому произошёл клик.

Вроде как можно через call и apply передать, но я не знаю как тогда правильно передать event и контекст самого элемента по которому сделан клик.

***Ага, элемент можно передать как item, сам объект как this.

Если можно всунуть всё это при вызове метода, покажите пожалуйста как правильно это делается.

Или лучше в данном случае оставить так как есть?

Aetae 12.11.2018 00:09

Или:
item.addEventListener('click', event => this.selectType(event))

или:
item.addEventListener('click', this.selectType.bind(this))

или(имхо лучше всего):
item.addEventListener('click', this)
const testApp = {
  ...
  handleEvent(e){
    if (e.type == 'click' || (e.type == 'keypress' && (e.which === 13 || e.keyCode === 13))){
      this.selectType(e);
    }
  }
}


К самому элементу обращаться в любом случае надо через event.target.

рони 12.11.2018 00:24

MC-XOBAHCK,
:-?
const testApp = {

    typesAll: document.querySelectorAll('.type'),
    type: '',
    event: function() {
        this.typesAll.forEach(item => item.addEventListener('click', this.selectType(this))); // Вызов метода
    },


    selectType: function(obj) {
        return function(e) {
            if (e.type == 'click' || (e.type == 'keypress' && (e.which === 13 || e.keyCode === 13))) {

                obj.type = this.getAttribute('name'); // тут testApp заменить контекстом объекта???

            }

        }
    }

}


Часовой пояс GMT +3, время: 01:08.