Показать сообщение отдельно
  #1 (permalink)  
Старый 23.06.2016, 03:34
Аватар для Sogl
Аспирант
Отправить личное сообщение для Sogl Посмотреть профиль Найти все сообщения от Sogl
 
Регистрация: 12.05.2016
Сообщений: 95

Перекрытие события keyup другими при setTimeout
Всем привет!
По историческим причинам (очень много уже написанного кода) работаю с ExtJS v 2.3.

Недавно понадобилось сделать отлов события keyup в input, после которого отправлять ajax-запрос на сервер, а полученный результат записывать в другой input. Все работает, только вот обнаружил, что запрос на сервер идет после каждого нажатия клавиши. Нашел реализацию setTimeout для событий ExtJS (зовется buffer) и в итоге код получился такой:
workTimePPR.on('keyup', function(workTimePPR, e) {
    console.log(e);
    var symKey = e.getKey();

    //если валидация пройдена и значение не пустое
    //0-9 (коды 48-57) и двоеточие (код 58)
    if(workTimePPR.isValid() && !Ext2.isEmpty(workTimePPR.getValue()) && (symKey >= 48 && symKey <= 58)) {

        //здесь код ajax-запроса

    }
}, this, {buffer: 1000});


Работает замечательно и отсекает все ненужные нажатия Alt/Ctrl/Enter итп, однако есть интересная проблема — если мы водим мышкой во время ввода значения, то идет отлов событий mouseout/mousemove вместо keyup, у которых symKey уже равен undefined. Это связано как раз с задержкой в 1000 мс, которую установили.

Как разрешить эту проблему?

Пока что в голову приходит добавление в условие событий мыши и symKey === undefined, но это решение мне не нравится.

p.s. Ссылка на документацию по событиям в 2.3:
https://docs.sencha.com/extjs/2.3.0/...od-addListener
Ответить с цитированием