我想发送在文本字段中键入的击键,但只能在1s间隔内发送。
这是为了减少每次按键发送ajax请求的负担。
所以,例如。如果用户在一秒内键入4个字母,请求将发送所有这4个字母。并且假设他在1分钟内不间断地键入,然后脚本将以1s的间隔发送,直到他停止输入。
目前我的脚本看起来像这样:
$("#type_post").live('keyup', function() {
$.post('posts.php', {post: $("#type_post").val()});
});
但这会发送所有按键。
有人可以帮助我吗
更新:这是我使用的代码。
var last_post = '';
$('#type_post').focus(function() {
// check if text has been changed every second when input field is focused
setInterval(function() {
if($('#type_post').val() != last_post)
{
// if changed, post it and set the new text as last text
$.post('posts.php', {post: $("#type_post").val()});
last_post = $("#type_post").val();
}
}, 1000);
});
答案 0 :(得分:4)
好吧,不管这个功能有多烦人,你都希望每秒使用setTimeout()
(info here)来运行一个函数并获取文本。如果它不同,那么进行ajax调用。
除此之外,您只需在文本框具有焦点时启用此功能,因此您可以在“焦点”和“模糊”事件上设置字段和相关操作。
答案 1 :(得分:3)
您可以将最后更新时间存储在变量中,然后检查延迟时间是否已经过去。
答案 2 :(得分:3)
每秒发送一个AJAX请求是一个可怕的想法。您应该考虑使用setTimeout
和clearTimeout
的组合来仅在用户停止输入后发送击键请求。我会在一分钟内得到一个例子。
var timer = 0;
$("#type_post").live('keyup', function(e) {
var val = $(this).val();
// clear any existing timer
clearTimeout(timer);
// set a 1 second timeout
timer = setTimeout(function() { keyLogger(val) }, 1000);
});
function keyLogger(val) {
$.post('posts.php', {post: $("#type_post").val()});
}
答案 3 :(得分:3)
要记住的一件重要事情是,在用户互动条款中,4秒是等待某事发生的非常长时间。期望用户在那么长的时间内等待反馈是相当不切实际的。
话虽如此,这是我所做的部分实施。它不会在用户模糊后发送任何数据,因此当它们退出时可能有点尴尬 - 可能不是。我没有测试过,但一般原则就在那里。
var sendInterval;
var lastValue;
$("#type_post").focus(function() {
var input = $(this);
sendInterval = setInterval(function() { sendData(input.val()); }, 4000);
});
$("#type_post").blur(function() {
if(sendInterval)
clearInterval(sendInterval);
});
function sendData(data) {
if(lastValue != data) {
lastValue = data;
$.post('posts.php', {post: data});
}
}
答案 4 :(得分:1)
我正在使用jQuery的Ajax自动完成,版本1.1很好地解决了这个问题,这是OnKeyUp事件中包含的一段代码:
clearInterval(this.onChangeInterval);
if (this.currentValue !== this.el.val()) {
if (this.options.deferRequestBy > 0) {
// Defer lookup in case when value changes very quickly:
var me = this;
this.onChangeInterval = setInterval(function() { me.onValueChange(); }, this.options.deferRequestBy);
} else {
this.onValueChange();
}
}
我建议你进一步检讨以完全理解。
答案 5 :(得分:1)
之前我做过类似的事情,除了使用MooTools而不是jQuery ...看一下http://obviousspoilers.com/member/register的注册表单(输入用户名)。
我在学习不引人注目的JavaScript之前对其进行了编码,因此它使用了onkeyup =“...”onblur =“...”。代码肯定可以清理,但随意使用它们。 JavaScript位于http://obviousspoilers.com/res/script.js,请查看Register对象。
编辑:未正确阅读您的问题,所以这可能无济于事(