jQuery UI 自动完成:只允许从建议列表中选择值

IT技术 javascript jquery ajax jquery-ui autocomplete
2021-02-28 19:48:14

我正在实现jQuery UI 自动完成,并且想知道是否有任何方法只允许从返回建议结果中进行选择,而不是允许将任何值输入到文本框中。

我将它用于标记系统,很像本网站上使用的标记系统,因此我只想允许用户从返回到自动完成插件的预填充列表中选择标记。

6个回答

你也可以使用这个:

change: function(event,ui){
  $(this).val((ui.item ? ui.item.id : ""));
}

我看到的唯一缺点是,即使用户输入可接受项目的完整值,当他们从文本字段移动焦点时,它将删除该值,他们将不得不再次执行此操作。他们能够输入值的唯一方法是从列表中选择它。

不知道这对你来说是否重要。

这个解决方案对我有用,没有你提到的副作用(从文本字段移动焦点时值被删除)。使用 jQuery 自动完成 v1.8 进行检查。
2021-04-22 19:48:14
@collimarco 的答案和您的评论都很有魅力。我真的可以更好地使用选项卡和输入键。
2021-05-06 19:48:14
当您不使用 id 而只使用标签时,您可能想要使用它:(在更改功能内) if (!ui.item) { $(this).val(''); }
2021-05-10 19:48:14
当您通过按“Enter”键选择一个项目时 - ui 将始终为空。jQuery UI v1.11.0
2021-05-16 19:48:14

我遇到了同样的问题,选择未定义。为它找到了解决方法并添加了该toLowerCase功能,只是为了安全。

$('#' + specificInput).autocomplete({ 
  create: function () {
    $(this).data('ui-autocomplete')._renderItem = function (ul, item) {
      $(ul).addClass('for_' + specificInput); //usefull for multiple autocomplete fields
      return $('<li data-id = "' + item.id + '">' + item.value + '</li>').appendTo(ul); 
    };
  }, 
  change:
    function( event, ui ){
      var selfInput = $(this); //stores the input field
      if ( !ui.item ) { 
        var writtenItem = new RegExp("^" + $.ui.autocomplete.escapeRegex($(this).val().toLowerCase()) + "$", "i"), valid = false;

        $('ul.for_' + specificInput).children("li").each(function() {
          if($(this).text().toLowerCase().match(writtenItem)) {
            this.selected = valid = true;
            selfInput.val($(this).text()); // shows the item's name from the autocomplete
            selfInput.next('span').text('(Existing)');
            selfInput.data('id', $(this).data('id'));
            return false;
          }
        });

        if (!valid) { 
          selfInput.next('span').text('(New)');
          selfInput.data('id', -1); 
        }
    }
}
这对我不起作用。选择未定义,我怀疑输入也是如此。你有没有经过实际测试的版本?
2021-04-23 19:48:14
我不知道为什么链接到的例子让事情变得如此复杂。这个版本不需要额外的控制并且很容易理解: jsfiddle.net/jlowery2663/o4n29wn3
2021-05-04 19:48:14

http://jsfiddle.net/pxfunc/j3AN7/

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;
    }
});
当表单中有很多 jquery 函数时,表单的用法是否有效?
2021-04-21 19:48:14
如果您输入任何允许项目的子字符串,这将不起作用。
2021-05-01 19:48:14

这就是我使用定居点列表的方式:

 $("#settlement").autocomplete({
  source:settlements,
  change: function( event, ui ) {
  val = $(this).val();
  exists = $.inArray(val,settlements);
  if (exists<0) {
    $(this).val("");
    return false;
  }
 }
});

我只是在我的情况下修改代码并且它正在工作

selectFirst: true,
change: function (event, ui) {
        if (ui.item == null){ 
         //here is null if entered value is not match in suggestion list
            $(this).val((ui.item ? ui.item.id : ""));
        }
    }

你可以试试

尝试此操作,但所有值都显示为空。不能选择任何东西
2021-05-07 19:48:14