2012-12-11 12 views
9

Używam Select2, aby utworzyć pole adresów e-mail w stylu Gmaila w mojej aplikacji. Działa świetnie, z wyjątkiem jednego przypadku: gdy użytkownik wpisuje adres e-mail i nie umieszcza po nim spacji ani przecinka, a nie trafia w pole lub kartę. Na przykład, jeśli wystarczy wpisać adres e-mail, a następnie użyć myszy do wybrania następnego pola formularza, wpisany adres e-mail zostanie usunięty.Znacznik jQuery Select2 na rozmycie

Mam przykład jsfiddle here, który ilustruje problem.

Oto jak ja konfigurowania select2 na moim ukrytym wejściem:

$(function(){ 
    $('input').select2({ 
     tags: [], 
     width: "300px", 
     dropdownCss: {display: 'none'}, 
     tokenSeparators: [',', ', ', ' '] 
    }); 
}); 

Czy istnieje sposób dla mnie, aby skonfigurować select2 tak że onBlur właśnie trwa co pozostało i nie jest obecnie tag i czyni to jednym?

Odpowiedz

17

Jest to teraz obsługiwane w wersji 3.3 biblioteki select2 przy użyciu opcji "selectOnBlur".

+2

możesz pokazać przykład. –

+0

To NIE działa z Select2 4.0.1-rc.1: '$ .fn.select2.defaults.set (" selectOnBlur "," true ");' – EriF89

+0

Opcja została zmieniona na 'selectOnClose' – kartikluke

1

ja naprawdę nie rozumie, co staramy się robić tu, bo mówimy o e-maile:

jQuery(element.val().split(",")).each(function() { 
       data.push({id: this, text: this}); 
      }); 

Ale można spróbować to zamiast:

var splitted = element.val().split(","); 
for(var i=0,z=splitted.length;i<z;i++) 
    data.push({id: splitted[i], text: splitted[i]}); 

przy okazji, twój jsfiddle jest nieukończone.

+0

Usunąłem te ustawienia, ponieważ nie są one związane z problemem i zaktualizowały moje skrzypce i kod powyżej. – davertron

3

Miałem formularz z select2 (tryb tagu) i przycisk przesyłania. Domyślnie, gdy użytkownik wpisze znacznik, bez wybierania z rozwijanego znacznika lub naciśnięcia jednego z wyzwalających klawiszy sterujących, wpis użytkownika zostanie utracony, ponieważ wtyczka zamyka wygenerowany obiekt wejściowy dom podczas zderzenia.

Moja szybkie ustalenie tego problemu było włamać funkcji rozmycia wtyczki i dodać następujące wiersze:

var val=this.search.val(); 
if($.trim(val)!='') this.onSelect({id:val,text:val}); 

Po rozmycie funkcja jest wywoływana, gdy powyższe kontrole kod Jeśli wpis użytkownika. Jeśli jest, wyzwala wybrane zdarzenie i wysyła wymagany obiekt. Przesyłany obiekt jest odpowiedni tylko dla select2 w trybie tagowania i jeśli użyjesz select2 v3.2, ta linia może zostać wstawiona na początku funkcji rozmycia AbstractSelect2 na linii 1311. Mam nadzieję, że daje ci to pomysł, jak dostosować widget zgodny z Twoimi potrzebami.

+1

Chociaż nie lubię konieczności samodzielnego modyfikowania biblioteki, aby uzyskać tę funkcjonalność, jest to jedyna odpowiedź, która działa do tej pory. Dodatkową zmianą, którą wprowadziłem, było przekazanie "noFocus: true" do metody "onSelect", a następnie sprawdzanie na dole i nie wołanie "focusSearch", ponieważ wprowadzanie tekstu jest naprawdę denerwujące, kliknij inne pole tekstowe a następnie ponownie ustawić skupienie starego pola select2. – davertron

+0

Dzięki @Ramin i @davertron! Z jakiegoś powodu nie mogę użyć ostatniej wersji select2 (zewnętrzne kliknięcie niczego nie zamknie), więc wracam do v3.2 i tworzę dwa hacki z was. Było dość trudne, ponieważ miałem dostęp tylko do wersji minified. W każdym razie, tutaj ostateczny sens hack, dla innych ludzi: https://gist.github.com/hartator/6689203 – Hartator

1

Z documentation począwszy od 4.0.3:

$('select').select2({ 
    selectOnClose: true 
}); 

To będzie uchwycić wybór i utworzyć znacznik jeśli użytkownik kliknie w innym miejscu.

Powiązane problemy