Подтвердить что ты не робот

Прислушайтесь к нажатию на документ в реале

Я хочу привязать, чтобы закрыть активный ответный загрузочный опрос на escape нажмите. Вот код

_handleEscKey:function(event){
         console.log(event);
        if(event.keyCode == 27){
          this.state.activePopover.hide();
        }
   },

  componentWillMount:function(){
     BannerDataStore.addChangeListener(this._onchange);
     document.addEventListener("click", this._handleDocumentClick, false);
     document.addEventListener("keyPress", this._handleEscKey, false);
   },


   componentWillUnmount: function() {
     BannerDataStore.removeChangeListener(this._onchange);
      document.removeEventListener("click", this._handleDocumentClick, false);
      document.removeEventListener("keyPress", this._handleEscKey, false);
   },

Но ничто не заходит на консоль при нажатии любой клавиши. Я попытался выслушать это в окне также и в разных случаях.'keypress ',' keyup 'и т.д., Но похоже, что я делаю что-то неправильно.

4b9b3361

Ответ 1

Вы должны использовать keydown, а не keypress.

Keypress обычно используется только для ключей, которые производят вывод символов в соответствии с документами

Keypress

Событие нажатия клавиши запускается, когда клавиша нажата и эта клавиша обычно генерирует значение символа

Keydown

Событие keydown запускается при нажатии клавиши.

Ответ 2

Просто у меня была похожая проблема с этим. Я буду использовать ваш код для иллюстрации исправления.

// for other devs who might not know keyCodes
var ESCAPE_KEY = 27;

_handleKeyDown = (event) => {
    switch( event.keyCode ) {
        case ESCAPE_KEY:
            this.state.activePopover.hide();
            break;
        default: 
            break;
    }
},

// componentWillMount deprecated in React 16.3
componentDidMount(){
    BannerDataStore.addChangeListener(this._onchange);
    document.addEventListener("click", this._handleDocumentClick, false);
    document.addEventListener("keydown", this._handleKeyDown);
},


componentWillUnmount() {
    BannerDataStore.removeChangeListener(this._onchange);
    document.removeEventListener("click", this._handleDocumentClick, false);
    document.removeEventListener("keydown", this._handleKeyDown);
},

Так как вы используете способ создания классов, вам не нужно привязываться к определенным методам, поскольку this подразумевается в каждом определенном методе.

Здесь есть работающий jsfiddle, использующий метод createClass для создания компонента React .

Ответ 3

У меня были те же требования к div, который можно было вкладывать.

Следующий код для меня был внутри вызова items.map((item) =>...

  <div
    tabindex="0"
    onClick={()=> update(item.id)}
    onKeyDown={()=> update(item.id)}
   >
      {renderItem(item)}
  </div>

Это сработало для меня!