1s后用ajax发送击键?

时间:2010-01-15 02:18:31

标签: javascript ajax

我想发送在文本字段中键入的击键,但只能在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);
});

6 个答案:

答案 0 :(得分:4)

好吧,不管这个功能有多烦人,你都希望每秒使用setTimeout()info here)来运行一个函数并获取文本。如果它不同,那么进行ajax调用。

除此之外,您只需在文本框具有焦点时启用此功能,因此您可以在“焦点”和“模糊”事件上设置字段和相关操作。

答案 1 :(得分:3)

您可以将最后更新时间存储在变量中,然后检查延迟时间是否已经过去。

答案 2 :(得分:3)

每秒发送一个AJAX请求是一个可怕的想法。您应该考虑使用setTimeoutclearTimeout的组合来仅在用户停止输入后发送击键请求。我会在一分钟内得到一个例子。

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对象。

编辑:未正确阅读您的问题,所以这可能无济于事(