VIKINGVyksa
@VIKINGVyksa
front-end developer

Как заставить работать settimeout с нужным значением?

Я создаю поиск, при клике по клавише клавиатуры срабатывает событие keyup в функции initialize. В ней получаеться значение поле куда вводят поисковую строку и оно отправляеться на сервер с помощью функции send. Но прежде чем отправить запрос на сервер необходимо проверить изменилось ли значение в поле через 800мс. Это не получается сделать тк. переменная постоянно перезаписывается и я сравниваю несколько раз одно и тоже значение в итоге(если уменьшить до 1мс то всё ок). Мне нужно чтобы settimeout проверял значение которое я передал когда-то, с текущим. Но такогово не происходит, если бытро печатать то за эти 800 мс она переменная перезапишеться много раз и будет сверяться не то значение. Я пытался стеки делать и чего только не пытался. Помогите))

Я думал что передав в settimeout значение всё будет работать нормально, но нет((

var ajax = require('./ajax.js'),
		query = require('./query.js');

//global variablse;
var mainBox = $('.search-fild'),
		fild = mainBox.children('.main-search'),
		result = mainBox.children('.result-search'),
		sbtn = mainBox.children('.input-group-btn').children('button'),
		black = mainBox.children('.black');

function initialize(){
	/*
		Инициализирует search модуль на странице
	*/

	//INPUT
	fild.keyup(function(){
		var value = $(this).val();

		result.children('.result-item').remove();

		send(value);

	});
}

function renderResultItems(data){
	for(var i = 0, l = data.length; i<l;i++){
		result.append('<div class="result-item"> ( '+data[i].ID+' ) '+data[i].COMENT+' </div>');
	}

}

function send(val){

	if(val.length>=3){
		console.log('[send] val:'+val);
		setTimeout('time( "'+val+'" )',800);
	}else{
		result.children('.result-item').remove();
	}

	

}

window.time =function(val){
		console.log('[time] val:'+val+' fildval:' + fild.val());
		if(val===fild.val()){
			ajax.search(val);
		}
};
module.exports.init = initialize;
module.exports.renderItems = renderResultItems;
  • Вопрос задан
  • 296 просмотров
Решения вопроса 1
@Aves
Насколько я понял, нужно сделать отправку не чаще, чем раз в 800мс и только если значение изменилось, тогда примерно так:
var lastsend, lastval, timer;
var input = document.querySelector('input');
var output = document.querySelector('#output');

input.addEventListener('keyup', function() {
    send(this.value);
});

function send(val) {
    clearTimeout(timer);
    var d = Date.now() - lastsend;
    if (d < 2000) {
        timer = setTimeout(function() {
            send(val);
        }, d);
        return;
    }
    if (val != lastsend) {
        output.innerText = lastval = val;
        lastsend = Date.now();
    }
}

jsbin.com/torubu/embed
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
AlexXYZ
@AlexXYZ
O Keep Clear O
Зачем вам settimeout, если нужно определить определить разницу во времени между двумя событиями? new Date() не годится?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы