2011-02-10 11 views
39

Jestem wykonawczych jQuery UI autouzupełniania i zastanawiam się czy jest jakiś sposób, aby umożliwić jedynie wybór z sugerowane wyniki, które są zwracane w przeciwieństwie do pozwalając żadnej wartości do wprowadzenia do pola tekstowego.jQuery UI autouzupełniania: tylko pozwoli wybranych ceniony od sugerowanej listy

Używam tego dla systemu oznaczania podobnego do tego używanego w tej witrynie, więc chcę zezwolić użytkownikom na wybór tagów z wstępnie wypełnionej listy zwróconej do wtyczki autouzupełniania.

+0

Zobacz także: https://stackoverflow.com/a/15704767/5802289 – J0ANMM

Odpowiedz

16

Mam ten sam problem z wybranymi nie zdefiniowanymi. Mam do tego obejście i dodałem funkcję toLowerCase, aby być bezpiecznym.

$('#' + 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

nie wiem dlaczego linkowane przykład sprawia, że ​​rzeczy tak skomplikowane. Ta wersja nie wymaga dodatkowej kontroli i jest łatwa do zrozumienia: http://jsfiddle.net/jlowery2663/o4n29wn3/ –

+0

To nie działa dla mnie. select jest niezdefiniowany i podejrzewam, że dane wejściowe również. Czy masz wersję tego, która została przetestowana? – B2K

37

Można też użyć tego:

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

Jedyną wadą widziałem jest to, że nawet jeśli użytkownik wprowadzi pełną wartość dopuszczalnego elementu, gdy przenieść fokus z textfield usunie wartość i będą musieli zrobić to ponownie. Jedynym sposobem na wprowadzenie wartości jest wybranie jej z listy.

Nie wiem, czy to ma znaczenie dla Ciebie, czy nie.

+11

Kiedy nie używać identyfikatorów ale tylko etykiet może chcesz użyć zamiast tego: (wewnątrz funkcji zmian) 'if (ui.item!) {$ (This) .val (''); } ' – collimarco

+1

Po wybraniu elementu poprzez naciśnięcie klawisza" Enter "- ui będzie zawsze mieć wartość zerową. jQuery UI v1.11.0 – asologor

+0

To rozwiązanie działało dla mnie bez efektu ubocznego, o którym wspomniałeś (o wartości usuniętej podczas przenoszenia fokusa z pola tekstowego). Sprawdzono za pomocą autocomplete jQuery 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

czy jest to poprawne użycie dla formularza, gdy w formie mają one wiele funkcji jQuery? – TarangP

+0

To nie działa, jeśli podasz podciąg dowolnego z dozwolonych elementów. –

3

To jak to zrobiłem z listą osiedli:

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

Właśnie modyfikacji do kodu w moim przypadku & to działa

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

ty może spróbować

+0

Próbuję tego, ale wszystkie wartości wykazują wartość null. Nie można wybrać niczego – webzy

-1

Z prostego jQuery użyć zdarzenia focusout:

na przykład:

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

}); 

Następnie: uzyskać tekst z $("#input").val() i sprawdzić, czy słowo jest zgodne z tablicy. jeśli nie czyścić wejście: $("#input").val('');

0

jestem na drupal 7,38 i aby umożliwić wejście tylko od wybranej skrzynki w autouzupełniania trzeba tylko usunąć wejściowe użytkownika w miejscu, gdzie js nie potrzebuje to dłużej - co jest, jak najszybciej z wyszukiwarki wyniki przyjeździe sugestia-popup tam można savely set:

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

patrz niżej w ekstrakcie z autocomplete.js ... Skopiowałem więc cały obiekt Drupal.jsAC.prototype.found do mojego modułu niestandardowej i dodaje je do pożądanej postaci z

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

A oto fragment oryginalnej Drupal misc/autouzupełnianie.js zmodyfikowany przez tę jednej linii ...

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. 

= cięcie. . . . . .

Powiązane problemy