【问题标题】:Is it a bad idea to trigger a database lookup on keyup (i.e. checking for unique username)在 keyup 上触发数据库查找是不是一个坏主意(即检查唯一的用户名)
【发布时间】:2013-09-23 15:13:20
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript knockout.js breeze asp.net-web-api


    【解决方案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);
    
    }());
    

    【讨论】:

    • 您能否指出我在线上的任何 sn-ps 代码,并举例说明我如何做到这一点?或者添加到您的答案中?
    • 对于 jquery,这应该会有所帮助:stackoverflow.com/questions/446594/…
    【解决方案2】:

    如果你想实时查看,你可以这样接近。当用户键入数据并暂停一段时间然后向您发送 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
    
    }
    

    【讨论】:

      【解决方案3】:

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

      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/

      【讨论】:

      • 所有答案都很有帮助,谢谢。我特别喜欢这个,因为它利用了淘汰赛。
      猜你喜欢
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      • 2011-08-16
      • 1970-01-01
      相关资源
      最近更新 更多