2011-02-10 33 views
39

我实现jQuery UI的自动完成,我想知道是否有什么办法只允许选择从建议结果被退回,而不是允许任何价值估值输入到文本框中。jQuery用户界面自动完成:只允许选择的从建议名单

我使用这个标签系统非常像这个网站上使用的标签系统,所以我只想让用户从预先填充的列表中选择标签返回到自动完成插件。

+0

另请参阅:https://stackoverflow.com/a/15704767/5802289 – J0ANMM

回答

16

我得到了同样的问题,选择未定义。找到了解决办法,并添加了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

我不知道为什么链接到的示例使事情变得如此复杂。这个版本不需要额外的控制,而且很容易理解: http://jsfiddle.net/jlowery2663/o4n29wn3/ –

+0

这不适合我。 select是未定义的,我怀疑输入也是如此。你有这个实际测试过的版本吗? – B2K

37

您也可以使用此:

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

我已经看到了这个唯一的缺点是,即使用户输入一个可接受项目的全部价值,当他们从移动焦点textfield它将删除该值,他们将不得不重做。他们能够输入值的唯一方法是从列表中选择它。

不知道这对你是否重要。

+11

如果您不使用标识符而只使用标签,则可以使用它:(内部更改函数)'if(!ui.item){$(this).val(''); }' – collimarco

+1

当您通过按“Enter”键选择一个项目 - ui将始终为空。 jQuery UI v1.11.0 – asologor

+0

这个解决方案对我来说没有你提到的副作用(在从文本字段移动焦点时值被删除)。使用jQuery autocomplete v1.8进行检查。 – BornToCode

5

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

它是有效的形式时,他们有很多的jQuery功能的形式? – TarangP

+0

如果输入任何允许的项目的子字符串,则这不起作用。 –

3

这是我如何与结算清单做到了:

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

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

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

你可以试试

+0

尝试此操作,但显示为空的所有值。无法选择任何东西 – webzy

-1

随着简单的jQuery,使用事件focusout

例如:

$("#input").focusout(function(){ 

}); 

然后:获得与$("#input").val() 文本并检查字是否是按照该阵列。 如果不干净的输入:$("#input").val('');

0

我在Drupal的7.38和 只允许在自动完成 你只需要在点删除用户输入从选择框输入, JS那里不需要它了 - 这只要在搜索结果中的建议,弹出 到达那里,你可以savely设置是这样的, :

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

见下文从autocomplete.js提取物... 所以我复制了整个Drupal.jsAC.prototype.found对象 到我的自定义模块,将其添加到所需形式 与

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

下面是从Drupal的原始杂项/自动完成的提取物。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. 

= cut。 。 。 。 。 。

相关问题