Kích hoạt một hành động sau khi lựa chọn select2


79

Tôi đang sử dụng thư viện select2 cho tìm kiếm của mình.
có cách nào để kích hoạt một hành động sau khi chọn kết quả tìm kiếm không? ví dụ: mở một cửa sổ bật lên hoặc một cảnh báo js đơn giản.

$("#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
Bạn có thể liên kết với sự kiện 'thay đổi', có một phần được gọi là "Sự kiện" trên liên kết bạn đã cung cấp với một đoạn mã rất dài cho tất cả các ràng buộc sự kiện khác nhau.
Ross

Câu trả lời:


168

Xem phần sự kiện tài liệu

Tùy thuộc vào phiên bản, một trong các đoạn mã dưới đây sẽ cung cấp cho bạn sự kiện bạn muốn, hoặc chỉ cần thay thế "select2-selection" bằng "change".

Phiên bản 4.0 +

Sự kiện hiện có định dạng: select2:selecting(thay vì select2-selecting)

Cảm ơn snakey cho thông báo rằng điều này đã thay đổi kể từ 4.0

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

Phiên bản trước 4.0

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

Chỉ cần làm rõ, tài liệu để select2-selectingđọc:

select2-select Được kích hoạt khi một lựa chọn đang được chọn trong menu thả xuống, nhưng trước khi bất kỳ sửa đổi nào được thực hiện đối với lựa chọn. Sự kiện này được sử dụng để cho phép người dùng từ chối lựa chọn bằng cách gọi event.preventDefault ()

trong khi thay đổi có:

thay đổi Được kích hoạt khi lựa chọn được thay đổi.

Vì vậy, changecó thể phù hợp hơn với nhu cầu của bạn, tùy thuộc vào việc bạn muốn lựa chọn hoàn tất và sau đó thực hiện sự kiện của mình hay có khả năng chặn thay đổi.


13
Sự kiện có tên khác trong các phiên bản mới hơn (ví dụ: 'select2: select'), xem https://select2.github.io/examples.html
snakey

1
Các sự kiện ở đây trong tài liệu. Không rõ ràng với kiểu FAQ.
Pierre de LESPINAY

1
lệnh gọi "chọn" được thực hiện ngay trước khi giá trị được đặt. mà sẽ dẫn đến: "console.log ($ (this) .val ())" outputing một giá trị trống
Joseph Groot Kormelink

Khi tôi thử tương tự trong ứng dụng góc cạnh của mình, nó đã cho tôi các giá trị sai. Giả sử có 4 giá trị trong các tùy chọn select2. 1 phút, 5 phút, 1 giờ, hàng ngày. Hiện đang sử dụng $ ('# yourelect'). On ("select2-selection", function (e) {...} Nó đã mang lại cho tôi giá trị trước đây mà những gì tôi đã chọn.
Yash Jain

Thay vì điều đó, tôi đã thử $ ('# yourselect'). On ("select2-select"), function (e) {...} Điều đó đã hiệu quả với tôi
Yash Jain

25

Đã có một số thay đổi đối với tên sự kiện select2 (tôi nghĩ ở câu 4 trở lên) nên dấu '-' được đổi thành ':' .
Xem các ví dụ tiếp theo:

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

Bạn có thể kiểm tra tất cả các sự kiện tại trang plugin 'select2': select2 Events


13

Nó hoạt động cho tôi:

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

Tôi không hiểu tại sao nhưng điều này có hiệu quả với tôi khi câu trả lời của Tarek thì không. Tôi thậm chí đã nhận được câu trả lời của anh ấy là làm việc trong một dự án riêng biệt nhưng vì lý do nào đó, đây là lần ghi đè duy nhất giúp dự án của tôi bắt đầu và chạy.
tokyo0709 29/12/17

@ tokyo0709 Nó hoạt động vì .changesự kiện đến muộn hơn trong chuỗi thực thi hơn là select2:selectsự kiện. Đối với tôi, tôi đã cố gắng chụp css của vùng chọn select2:selectnhưng mặc dù tôi đã nhìn thấy nó trên thanh tra, tôi không thể chụp nó qua select2:select- khi tôi thay đổi thành .changenó hoạt động vì Select2 kích hoạt select2:selectsự kiện trước khi cập nhật css cho lựa chọn ban đầu .. hơi điên rồ , theo ý kiến ​​của tôi.
a20

1
@ a20 đôi khi một giải pháp dễ dàng là thiết lập các phần tử dom css thông qua html css để bạn không phải đợi công cụ javascript bắt kịp. Nó hoạt động tốt trong một số trường hợp.
yardpenalty.com

7

Theo cách sử dụng của tôi ở trên v.4, điều này sẽ hoạt động

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

Và đối với ít hơn thì v.4, điều này sẽ hoạt động:

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

Điều này không làm việc cho tôi. Tôi đã thay đổi mã trên thành như được cung cấp bên dưới. e.params.args.data
Tushar Saxena

Điều này cũng không hoạt động với tôi, e.params.data thông qua trường dữ liệu không được tìm thấy cho không xác định. Khi kiểm tra kỹ hơn, không có trường tham số nào được thiết lập cho e. Đối với vấn đề của tôi, tôi chỉ cần đọc giá trị để e.val là đủ đối với tôi.
NemyaNation


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);
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.