0

我有一个字段,用户可以在其中手动输入新产品的代码。它不能是 db 生成的 ID,因为用户需要控制代码。

由于这需要往返服务器进行检查,我的意图是在“keyup”事件发生时触发此检查(有点像实时过滤器会起作用),以便对输入的代码有即时反馈(和可能是基于 CSS 的颜色/图像增强)。诚然,对于这个特定的功能,我可能会选择 onblur 而不是 keyup,但很可能在其他情况下我需要检查 keyup。

这从根本上来说是一件坏事吗?往返服务器以检查项目代码是否存在(主键)应该是一个非常快的过程,但是连接速度很慢比它可以返回的速度更快,然后可能会出现一种情况,即在不应该启用“提交”按钮时启用。当然,我也会在提交表单时使用 db 级别的检查来支持这一点,但我正试图让它尽可能地响应。

对未保存在内存中的任何数据源进行 keyup 检查通常是一个坏主意,还是这是一种可以接受的做法?

4

3 回答 3

1

如果您在下一次 keyup 中中止任何先前的 ajax 请求,则永远不会出现竞争条件。

编辑

(function() {
  var xhr; //a reference to an XMLHttpRequest Object

  var onKeyUpCallback = function() {
    if(xhr) {
      xhr.abort();
    }


    xhr = ... //build your XHR object
    //....
    xhr.send();

  }

  yourInputElement.addEventListener('keyup',onkeyUpCallback);

}());
于 2013-09-18T18:14:00.817 回答
1

如果你想实时查看,你可以这样接近。当用户键入数据并暂停一段时间然后向您发送 ajax 请求以检查数据库中是否存在该特定事物。

在按键事件上调用函数,但在用户停止一段时间之前不发送请求

var timer;
function onkeyups()
{
  if(timer)
  {
   clearTimeout(timer);
  }
  timer = setTimeout(function(){callRequest();},500) // the delay, after how much millisecond the ajax call should be made when user has stopped typing
}

function callRequest()
{
// Make your ajax call or whatever

}
于 2013-09-18T18:30:31.567 回答
1

由于您使用淘汰赛,您可以使用油门

ViewModel = function() {
    this.text = ko.observable().extend({ throttle: 500 });
    this.text.subscribe(this.onText, this);
};

ViewModel.prototype = {
    onText: function(value) {
        console.log("ajax call");
    }
};

http://jsfiddle.net/TT3AB/

于 2013-09-18T20:45:10.347 回答