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

时间:2011-02-10 00:22:05

标签: javascript jquery ajax jquery-ui autocomplete

我正在实施 jQuery UI自动填充功能,我想知道是否有任何方法只允许从建议结果中选择返回,而不是允许任何值输入文本框。

我将此用于标记系统,就像在此网站上使用的那样,所以我只想让用户从预先填充的列表中选择返回到自动完成插件的标签。

9 个答案:

答案 0 :(得分:40)

你也可以使用它:

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

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

不知道这对你是否重要。

答案 1 :(得分:15)

我在选择未定义时遇到了同样的问题。为了安全起见,我为它做了一个解决方法并添加了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); 
        }
    }
}

答案 2 :(得分:6)

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;
    }
});

答案 3 :(得分:6)

我只是修改代码在我的情况下&amp;它的工作

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 : ""));
        }
    }

你可以尝试

答案 4 :(得分:5)

这就是我用结算清单做到的方式:

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

答案 5 :(得分:0)

我正在使用drupal 7.38和 仅允许自动完成中来自选择框的输入 你只需要在这一点上删除用户输入, 其中js不再需要它 - 在这种情况下, 一旦搜索结果到达建议弹出窗口 在那里你可以保存设置:

 **this.input.value = ''**

请参阅以下autocomplete.js摘录... 所以我复制了整个Drupal.jsAC.prototype.found对象 进入我的自定义模块并将其添加到所需的表单 与

 $form['#attached']['js'][] = array(
  'type' => 'file',
  'data' => 'sites/all/modules/<modulname>_autocomplete.js',
 );

这是drupal原始misc / autocomplete.js的摘录 由该单行修改......

Drupal.jsAC.prototype.found = function (matches) {
  // If no value in the textfield, do not show the popup.
  if (!this.input.value.length) {
    return false;
  }
  // === just added one single line below ===
  this.input.value = '';

  // Prepare matches.

=切。 。 。 。 。 。

答案 6 :(得分:0)

Ajax提交和处理

这对你们中的一些人有用:

$('#INPUT_ID').autocomplete({
    source: function (request, response) {
        $.ajax({
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            url: autocompleteURL,
            data: "{'data':'" + $('INPUT_ID').val() + "'}",
            dataType: 'json',
            success: function (data) {
                response(data.d);
            },
            error: function (data) {
                console.log('No match.')
            }
        });
    },
    change: function (event, ui) {
        var opt = $(this).val();

        $.ajax({
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            url: autocompleteURL,
            data: "{'empName':'" + name + "'}",
            dataType: 'json',
            success: function (data) {
                if (data.d.length == 0) {
                    $('#INPUT_ID').val('');
                    alert('Option must be selected from the list.');
                } else if (data.d[0] != opt) {
                    $('#INPUT_ID').val('');
                    alert('Option must be selected from the list.');
                }
            },
            error: function (data) {
                $(this).val('');
                console.log('Error retrieving options.');
            }
        });
    }
});

答案 7 :(得分:0)

如果要限制用户从自动完成列表中选择推荐,请尝试定义关闭函数,如下所示。当结果下拉菜单关闭时调用close函数,如果用户从列表中选择,则定义event.currentTarget;如果未定义,则结果下拉列表关闭而无需用户选择选项。如果他们没有选择选项,那么我会将输入重置为空白。

//
// Extend Autocomplete
//
$.widget( "ui.autocomplete", $.ui.autocomplete, {      
   options: {
      close: function( event, ui ) {
         if (typeof event.currentTarget == 'undefined') {
            $(this).val("");
         }
      }
   }
 });

答案 8 :(得分:0)

实际上,您可以结合使用response事件和change事件来存储建议的项目,如下所示:

response: function (event, ui) {
    var list = ui.content.map(o => o.value.toLowerCase());
},
change: function (event, ui) {
    if (!ui.item && list.indexOf($(this).val().toLowerCase()) === -1 ) { $(this).val(''); 
}