Uruchom akcję po wybraniu select2


79

Do wyszukiwania używam biblioteki select2 .
czy istnieje sposób na wywołanie akcji po wybraniu wyniku wyszukiwania? np. otwórz wyskakujące okienko lub prosty alert js.

$("#e6").select2({
    placeholder: "Enter an item id please",
    minimumInputLength: 1,
    ajax: { // instead of writing the function to execute the request we use Select2's convenient helper
        url: "index.php?r=sia/searchresults",
        dataType: 'jsonp',
        quietMillis: 3000,
        data: function (term, page) {
        return {
            q: term, // search term
            page_limit: 10,
            id: 10
            };
        },
        results: function (data, page) { // parse the results into the format expected by Select2.
            // since we are using custom formatting functions we do not need to alter remote JSON data
            return {results: data};
        },
    },

    formatResult: movieFormatResult, // omitted for brevity, see the source of this page
    formatSelection: movieFormatSelection, // omitted for brevity, see the source of this page
    dropdownCssClass: "bigdrop", // apply css that makes the dropdown taller
    escapeMarkup: function (m) { return m; } // we do not want to escape markup since we are displaying html in results
});

1
Możesz powiązać ze zdarzeniem „zmiana”. W linku, który podałeś, znajduje się sekcja „Zdarzenia” z bardzo długim fragmentem kodu dla wszystkich różnych powiązań zdarzeń.
— Ross

Odpowiedzi:


170

Zobacz sekcję dotyczącą wydarzeń w dokumentacji

W zależności od wersji jeden z poniższych fragmentów powinien wskazywać żądane zdarzenie, alternatywnie po prostu zamień „select2-selection” na „change”.

Wersja 4.0 +

Wydarzenia mają teraz format: select2:selecting(zamiast select2-selecting)

Dzięki Snakey za powiadomienie, że zmieniło się to od 4.0

$('#yourselect').on("select2:selecting", function(e) { 
   // what you would like to happen
});

Wersja przed 4.0

$('#yourselect').on("select2-selecting", function(e) { 
   // what you would like to happen
});

Dla wyjaśnienia dokumentacja do select2-selectingczytania:

select2-selection Uruchamiany, gdy wybór jest wybierany z listy rozwijanej, ale przed dokonaniem jakiejkolwiek modyfikacji wyboru. To zdarzenie jest używane, aby umożliwić użytkownikowi odrzucenie wyboru przez wywołanie event.preventDefault ()

podczas gdy zmiana ma:

change Uruchamiane po zmianie wyboru.

changeMoże więc być bardziej odpowiedni dla twoich potrzeb, w zależności od tego, czy chcesz zakończyć wybór, a następnie wykonać wydarzenie, czy potencjalnie zablokować zmianę.


13
Zdarzenia mają inne nazwy w nowszych wersjach (np „select2: wybierz”), patrz https://select2.github.io/examples.html
— Snakey

1
Wydarzenia są tutaj w doc. Nie jest to oczywiste w stylu FAQ.
— Pierre de LESPINAY

1
wywołanie „wybierania” jest wykonywane tuż przed ustawieniem wartości. co doprowadzi do: "console.log ($ (this) .val ())" wypisuje pustą wartość
— Joseph Groot Kormelink.

Kiedy próbowałem tego samego w mojej aplikacji kątowej, dawało mi to złe wartości. Załóżmy, że w opcjach select2 są 4 wartości. 1 minuta, 5 minut, 1 godzina, codziennie. Teraz używając $ ('# yourselect'). On ("select2-selection", function (e) {...} To dawało mi poprzednią wartość, którą wybrałem.
— Yash Jain

Zamiast tego wypróbowałem $ ('# yourselect'). On ("select2-select"), function (e) {...} To zadziałało
— Yash Jain

25

Dokonano pewnych zmian w nazwach zdarzeń select2 (myślę, że w wersji 4 i późniejszych), więc znak „-” jest zamieniany na „:” .
Zobacz następne przykłady:

$('#select').on("select2:select", function(e) { 
    //Do stuff
});

Wszystkie zdarzenia możesz sprawdzić na stronie wtyczki „select2”: zdarzenia select2


13

Mi to pasuje:

$('#yourselect').on("change", function(e) { 
   // what you would like to happen
});

Nie rozumiem dlaczego, ale to zadziałało dla mnie, kiedy odpowiedź Tarka nie. Otrzymałem nawet odpowiedź, że pracuję w oddzielnym projekcie, ale z jakiegoś powodu było to jedyne zastąpienie, które spowodowało, że mój projekt został uruchomiony.
— tokyo0709

@ tokyo0709 To działa, ponieważ .changezdarzenie pojawia się później w serii egzekucji niż select2:selectzdarzenie. Dla mnie próbowałem przechwycić css zaznaczonego, select2:selectale mimo że widziałem go w inspektorze, nie mogłem go przechwycić select2:select- kiedy zmieniłem na .changeto zadziałało, ponieważ Select2 uruchamia select2:selectzdarzenie przed aktualizacją css dla oryginalnego wyboru ... trochę szalone , w mojej opinii.
— a20

1
@ a20 czasami łatwym obejściem jest ustawienie elementów dom w css za pomocą html css, więc nie musisz czekać, aż silnik javascript nadrobi zaległości. W niektórych przypadkach działa dobrze.
— yardpenalty.com

7

Zgodnie z moim użyciem powyżej v.4 to będzie działać

$('#selectID').on("select2:select", function(e) { 
    //var value = e.params.data;  Using {id,text format}
});

A mniej niż wersja 4 to będzie działać:

$('#selectID').on("change", function(e) { 
   //var value = e.params.data; Using {id,text} format
});

To nie działa dla mnie. Zmieniłem powyższy kod na podany poniżej. e.params.args.data
— Tushar Saxena,

To też nie zadziałało dla mnie, e.params.data przez pole danych nie znaleziono dla undefined. Po bliższej inspekcji nie było pola params ustawionego dla e. W przypadku mojego problemu wystarczyło odczytać wartość, więc wystarczyło mi e.val.
— NemyaNation

2

Powyżej v4

$('#yourselect').on("select2:select", function(e) { 
     // after selection of select2 
});

0
//when a Department selecting
$('#department_id').on('select2-selecting', function (e) {
    console.log("Action Before Selected");
    var deptid=e.choice.id;
    var depttext=e.choice.text;
    console.log("Department ID "+deptid);
    console.log("Department Text "+depttext);
});

//when a Department removing
$('#department_id').on('select2-removing', function (e) {
    console.log("Action Before Deleted");
    var deptid=e.choice.id;
    var depttext=e.choice.text;
    console.log("Department ID "+deptid);
    console.log("Department Text "+depttext);
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.