2015-05-28 16 views
21

Zbudowałem aplikację internetową za pomocą pola wyszukiwania Select2, które łączy się z naszym zapleczem za pośrednictwem AJAX. Pole wyszukiwania przekazuje zapytanie (np. "APPLES") do zaplecza, które następnie aktualizuje stronę. Jak programowo wprowadzać zapytania do wyszukiwania w polu wyszukiwania? Muszę przekazać wartość "val", aby select2 wywoływał backend za pośrednictwem AJAX i aktualizował stronę. Jestem pewien, że jest to oczywiste, ale nie mogłem go znaleźć w dokumentacji.Jak programowo wprowadzać zapytania do Select2 v4?

Na przykład, zamiast zmuszać użytkownika do wpisania "APPLES" w polu wyszukiwania, chciałbym, aby użytkownik kliknął przycisk i automatycznie wypełnił słowo "JABŁKA" w polu wyszukiwania, a następnie wyświetlił stronę aktualizacja.

Dzięki!


następujący komentarz Kevina, nie jestem w tym stanie, gdzie tekst jest osadzony w polu wyszukiwania i selektor wybrał właściwą pozycję. W jaki sposób mogę złożyć (lub wyzwalacza) to prośba, próbowałem "keyDown", "pressdown", "wyślij", "click" (która czyści pole) itd

enter image description here

+0

Bounty nie jest to możliwe, na drodze, ponieważ nie ma sposobu, aby wykryć, gdy żądanie AJAX, który jest wyzwalany zakończy bez podpinania się do globalnego programu obsługi AJAX. –

+0

Aby potwierdzić, nie można wymusić kliknięcia? – vgoklani

+0

Niezależnie, jestem wdzięczny za całą twoją pomoc, a nagroda jest twoja. – vgoklani

Odpowiedz

26

Wybór2 wykorzystane do zapewnienia metoda pomocnika select2('search', 'term'), która pomogłaby w tym, ale nie została przeniesiona do Select2 4.0.0.

Istnieje kilka sposobów, że można to zrobić, ale generalnie wszystkie one według tego samego wzoru kroków

  1. Otwórz Wybór2 rozwijanych
  2. Wpisz wyszukiwany tekst w polu wyszukiwania
  3. wyzwalać zdarzenia klawiatury niezbędne dla Select2 aby rozpocząć wyszukiwanie (zwykle input)

Więc teraz, w Select2 4.0.0 kod do zrobienia, że ​​będzie wyglądać lik e

$('select').select2(); 
 

 
function select2_search ($el, term) { 
 
    $el.select2('open'); 
 
    
 
    // Get the search box within the dropdown or the selection 
 
    // Dropdown = single, Selection = multiple 
 
    var $search = $el.data('select2').dropdown.$search || $el.data('select2').selection.$search; 
 
    // This is undocumented and may change in the future 
 
    
 
    $search.val(term); 
 
    $search.trigger('keyup'); 
 
} 
 

 
$('button').on('click', function() { 
 
    var $select = $($(this).data('target')); 
 
    select2_search($select, 'Arizona'); 
 
});
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.css" rel="stylesheet"/> 
 

 
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script> 
 
<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.js"></script> 
 

 
<select style="width: 200px;" id="single"> 
 
    <option value="AL">Alabama</option> 
 
    <option value="AK">Alaska</option> 
 
    <option value="AZ">Arizona</option> 
 
</select> 
 

 
<button type="button" data-target="#single">Search for 'Arizona'</button> 
 
<br /><br /> 
 

 
<select style="width: 200px;" id="multiple" multiple="multiple"> 
 
    <option value="AL">Alabama</option> 
 
    <option value="AK">Alaska</option> 
 
    <option value="AZ">Arizona</option> 
 
</select> 
 

 
<button type="button" data-target="#multiple">Search for 'Arizona'</button>

Chociaż ten przykład nie korzysta z AJAX, będzie wyzwalać żądania AJAX jeśli Wybór2 jest skonfigurowany dla niego.

+0

Dzięki za odpowiedź Kevin. Niestety nie widzę zmiennej $ search po menu rozwijanym $ e1.data ("select2"). Robię również wywołanie AJAX, więc select2 nie widzi wszystkich identyfikatorów aż do żądania AJAX. Pracowałem nad tym przez kilka dni, mam nadzieję, że potrafisz to wyjaśnić. Dzięki – vgoklani

+0

Należy dodać, że mam dwa pola wyszukiwania, a tylko jeden używa AJAX. Nie-ajaxowe pole select2 obsługuje iniekcje bezproblemowo za pomocą $ selectionBox.val (23) .change ("trigger"). Zgaduję, że wersja AJAX nie działa, ponieważ nie ma identyfikatorów. kiedy uruchomię tę funkcję $ selectionBoxAJAX.val (47) .change ('trigger'), aktualizacja zostanie zepchnięta (ekran aktualizuje się), ale zapytanie jest puste, a poprawny tekst nie jest aktualizowany – vgoklani

+0

@vgoklani Myślę, że kwestia może to być, że używasz wielokrotnego wyboru, chcesz tylko to potwierdzić (i mogę zaktualizować tę odpowiedź, aby również ją wspierać). –

2

Jako dodatek do tej odpowiedzi, próbowaliśmy programowo dodać nowy "tag" do selektora2 skonfigurowanego do tagowania. Zamiast uruchamiać zdarzenie keyup w polu wyszukiwania $, musieliśmy wykonać następujące czynności.

$search.val(tag); 
$search.closest('.select2-search--inline') 
    .trigger($.Event('input', { which: 13 })); 
$search.closest('.select2-selection--multiple') 
    .trigger($.Event('keydown', { which: 13 })); 

To pierwsze pożary zdarzenie, które powoduje, że moduł „szukaj” w Select2 aby dodać „zaznaczony” wynik zawierający tekst znacznika, a następnie drugie zdarzenie powoduje select2 do ognia zdarzenie „wybierz” wewnętrznie który dodaje nowy tag opcji select2 i może także wyzwalać inne rzeczy, w zależności od tego, jak je skonfigurowałeś.

2

Można ustawić minimumInputLength do 0 następnie w funkcji data można sprawdzić params.termlength a jeśli jest to 0, należy ustawić wartość filtra do zadanej wartości wyszukiwania.

To dość głupie, ale działa;)

+0

Tego właśnie szukałem! Dziękujemy za sugestię "minimumInputLength: 0". Moim zadaniem było wstępne wypełnienie select2 niektórymi początkowymi danymi za pomocą wywołania ajax. Więc wszystko, co muszę zrobić, to ustawić minimalne wejście na 0 i odfiltrować żądanie z pustym parametrem GET "q =" na serwerze i zwrócić wartości domyślne. Niesamowite! – Johnner

2

dla mnie wyzwolenie „keyUp” działa tylko wtedy, gdy użytkownik nie wybrano jeszcze żadnych opcji. To, co działa za każdym razem, to wywołanie "input". (Tylko przetestowane w Chrome)

więc na podstawie Kevina Browna odpowiedź:

$('select').select2(); 

function select2_search ($el, term) { 
    $el.select2('open'); 

    // Get the search box within the dropdown or the selection 
    // Dropdown = single, Selection = multiple 
    var $search = $el.data('select2').dropdown.$search || $el.data('select2').selection.$search; 
    // This is undocumented and may change in the future 

    $search.val(term); 
    $search.trigger('input'); 
} 

$('button').on('click', function() { 
    var $select = $($(this).data('target')); 
    select2_search($select, 'Arizona'); 
}); 
Powiązane problemy