.keyup事件替代方案

我有一个简单的自动完成测试,它可以处理硬编码数据。

但是,当我添加自己的数据(包含超过1000个数据)时,它不起作用,只显示第一个字母,所以如果我的数据是“Apple”

当我输入B – 它显示香蕉但我不能输入“BA”,因为“A”消失。

我期待着我可以写出整个单词而不是第一个字母。

这是工作代码:

var validOptions = ["Bold", "Normal", "Default", "100", "200"] previousValue = ""; $('#ac').autocomplete({ autoFocus: true, source: validOptions }) .keyup(function() { var isValid = false; for (i in validOptions) { if (validOptions[i].toLowerCase().match(this.value.toLowerCase())) { isValid = true; } } if (!isValid) { this.value = previousValue } else { previousValue = this.value; } }); 

所以这些字母:粗体“,”正常“,”默认“,”100“,”200“工作。但是

只要我将validOptions更改为:

 var validOptions ='@Url.Action("SerialProdNumStockSiteAutoComplete", "Ajax")?stocksitenum=LW&model=' + $("#Form_Prod_Num").val(); 

它不能正常工作。

有另一种方法可以做到这一点,还是你知道我哪里出错了。

这个问题是关于.keyup的替代方案

SerialProdNumStockSiteAutoComplete代码:

  public JsonResult SerialProdNumStockSiteAutoComplete(string term,string stocksitenum,string model) { return Json(AutoComplete.DeviceFromStockSite(term, stocksitenum, model), JsonRequestBehavior.AllowGet); } 

库存设备:

  public static List DeviceFromStockSite(string term, string stocksitenum, string model) { //devices will always come from serialised stock var qryStock = SC42Ctx.SPNlocs .Where(x => x.Nloc_Site_Num.StartsWith(stocksitenum) && x.Nloc_Part_Num == model && x.Nloc_Ord_Num == null) .Select( s => new TicketSerialNumber { SerialNumber = s.Nloc_ID_Num, Source = stocksitenum, Call = s.Nloc_Ord_Num.ToString() }) .ToList(); 

当我复制URL时,显示:

HTTP://本地主机:58172 / AJAX / SerialProdNumStockSiteAutoComplete stocksitenum = LW&模型= MP4000BADP&术语= 4&_ = 1433235435372

这是当我输入4并且无法添加任何其他内容时

 Try using the minLength option of autocomplete to specify the minimum number of characters: $('#ac').autocomplete({ autoFocus: true, source: validOptions, minLength: 3 }) .keyup(function() { var isValid = false; for (i in validOptions) { if (validOptions[i].toLowerCase().match(this.value.toLowerCase())) { isValid = true; } } if (!isValid) { this.value = previousValue } else { previousValue = this.value; } }); 

这段代码是罪魁祸首:

  if (!isValid) { this.value = previousValue } else { previousValue = this.value; } 

它说的是价值不匹配然后它不会让你输入该值。

将您的代码更新为:

 $(document).ready(function () { var validOptions = ["Bold", "Normal", "Default", "100", "200"] previousValue = ""; $('#ac').autocomplete({ autoFocus: true, source: validOptions }) .keyup(function () { var isValid = false; for (i in validOptions) { if (validOptions[i].toLowerCase().match(this.value.toLowerCase())) { isValid = true; } } }); }); 

.keyup的替代品

当用户输入自动完成的数据以外的内容时显示错误

您似乎想要使用响应事件http://api.jqueryui.com/autocomplete/#event-response 。

搜索完成后,在显示菜单之前触发。 对于建议数据的本地操作很有用…当搜索完成时,即使由于没有结果而不显示菜单,也会触发此事件…

这在硬编码数据的小提琴中不起作用,因为它仅适用于使用搜索URL(您想要的)。

.keyup在搜索完成之前不起作用:

当您使用硬编码数据时(根据小提琴),一切都很好,但是当您更改以便源是URL时,将通过自动完成调用URL(执行搜索)(可以通过在浏览器控制台中查看网络来确认) ) – 当.keyup立即发生(同样如此)时,这会花费很短的时间异步。 您可以通过在操作中添加Thread.Sleep()和在js中添加各种console.log来确认这一点。

对,我找到了答案

简单的东西:

 var source = validOptions; var found = $('.ui-autocomplete li').text().search(source); console.debug('found:' + found); if (found < 0) { $(this).val(''); alert("please select from auto complete"); }