2011-02-10 73 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。 。 。 。 。 。

相關問題