Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Пользователь закончил вводить текст (https://javascript.ru/forum/css-html/43732-polzovatel-zakonchil-vvodit-tekst.html)

abar 18.12.2013 12:24

Пользователь закончил вводить текст
 
Всем привет. Делаю autocomplete. Вопрос в следующем: есть input в который пользователь вводит строку для поиска. Соответственно надо поймать тот момент когда пользователь перестал вводить символы но при этом input находится в фокусе. Как это сделать? Может кто делал?

danik.js 18.12.2013 13:35

Цитата:

Сообщение от abar
Соответственно надо поймать тот момент когда пользователь перестал вводить символы

Это невозможно. Ибо нельзя заглянуть в мысли пользователя и узнать - был ли последний введенный символ действительно последним. Сечешь?
Можно только предположить, что если юзер подзавис скажем на пол-секунды, то он перестал вводить текст. И делать автокомплит в это время.


var timerId = null;
textbox.onkeypress = function() {
    clearTimeout(timerId);
    timerId = setTimeout(function() {
        autoComplete();
    }, 500);
}

abar 18.12.2013 14:38

Спасибо за ответ. Но в таком случае (проверял в IE10) действие будет выполняться несколько раз:
<html>

<body>
<input onkeypress="test(this);">
<script>
function test(e){
  var TimeoutID = null;
  clearTimeout(TimeoutID);
  TimeoutID = setTimeout(function(){
  alert(e.value);
},1000);
}
</script>
</body>
</html>

рони 18.12.2013 15:09

abar,
.keyup() задержка и отправка одного запроса после нескольких нажатий

abar 18.12.2013 15:32

Цитата:

Сообщение от рони (Сообщение 287602)

Там же не нашли решение? Просто повесили событие на нажатия enter или изменение фокуса.

рони 18.12.2013 15:42

abar,
решение одно которое предложил danik.js,
вариант который я вам указал дополнен ещё и проверкой на наличие хотябы 3 символов в строке поиска -- там основной момент выводить не все ответы сервера а только тот который больше походит на строку поиска в данное время

abar 18.12.2013 15:49

рони,
то есть, сколько раз нажал пользователь на кнопку/и столько (в моем примере) и алертов будет. От этого никак не избавиться, кроме как ввести проверку на длину строки. Правильно ли мы поняли друг друга?

danik.js 18.12.2013 16:07

abar, переменная TimeoutID должна быть объявлена вне функции. А так при каждом вызове создается новая переменная, со значением null и clearTimeout(TimeoutID) ни к чему не приводит. То есть ты даже не понимаешь базовых вещей в JavaScript.

Кстати говоря, в js принято называть переменные и функции с маленькой буквы. С большой - только конструкторы.

abar 18.12.2013 16:16

danik.js,
я понял, спасибо.
Всем спасибо.

Вячеслав Мухин 14.09.2017 10:13

я так решил:
var field = document.querySelector('input'),
	count = 0;
field.addEventListener('input', function (e) {
	let a = ++count,
		time = setTimeout(function () {
		if (a == window.count) {
			console.log('ввод закончен');
		} else {
			clearTimeout(time);
		}
	}, 3000);
});


/*при срабытавание события увеличиваем счетчик
если по прошествию 3 сек счетчик не поменялся ввод закончен*/


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