Kích hoạt sự kiện thay đổi của menu thả xuống


86

Tôi muốn kích hoạt sự kiện thay đổi của danh sách thả xuống trong $ (document). Đã sử dụng jquery.

Tôi có một trình đơn thả xuống xếp tầng cho quốc gia và tiểu bang trong trang chi tiết người dùng. làm cách nào để đặt giá trị (được lấy từ DB dựa trên id người dùng) cho quốc gia và tiểu bang trong MVC bằng C #.


Bạn có thể muốn đặt một số thẻ nhiều của như javascript và jQuery để có được điều này tìm thấy nhiều
xenon

Câu trả lời:


184

Tôi không biết nhiều JQuery nhưng tôi đã nghe nói rằng nó cho phép kích hoạt các sự kiện gốc với cú pháp này.

$(document).ready(function(){

    $('#countrylist').change(function(e){
       // Your event handler
    });

    // And now fire change event when the DOM is ready
    $('#countrylist').trigger('change');
});

Bạn phải khai báo trình xử lý sự kiện thay đổi trước khi gọi trigger () hoặc change () nếu không nó sẽ không được kích hoạt. Cảm ơn vì đã đề cập @LenielMacaferi.

Thông tin thêm tại đây .


13
Bạn phải khai báo trình xử lý sự kiện thay đổi trước khi gọi trigger()hoặc thậm chí change()như được hiển thị chính xác trong câu trả lời này, nghĩa là, nếu mã xử lý sự kiện xuất hiện bên dưới cuộc gọi, không có gì xảy ra! :)
Leniel Maccaferri

3
@LenielMacaferi Cảm ơn bạn đã tiết kiệm cho tôi một hoặc hai giờ.
Frank Nocke

@Christophe Eblé & Leniel Macaferi, Cảm ơn rất nhiều. Christophe, bạn có thể vui lòng thêm nhận xét của Leniel vào câu trả lời của bạn không?
Zaxter

Tôi đã sử dụng .change () nhưng không may mắn với jquery 3.1.1, Sau bài đăng này, nó được kích hoạt như mong đợi.
Sorangwala Abbasali

Điều này chỉ kết thúc lặp lại không ngừng, giải pháp của mọi người cho điều này kết thúc vòng lặp.
Nathan McKaskle

12

Thử đi:

$(document).ready(function(event) {
    $('#countrylist').change(function(e){
         // put code here
     }).change();
});

Xác định sự kiện thay đổi và kích hoạt nó ngay lập tức. Điều này đảm bảo trình xử lý sự kiện được xác định trước khi gọi nó.

Có thể muộn để trả lời người đăng ban đầu, nhưng ai đó có thể được hưởng lợi từ ký hiệu viết tắt và điều này theo chuỗi của jQuery, v.v.

chuỗi jquery


7

Thử đi:

$('#id').change();

Làm việc cho tôi.

Trên một dòng cùng với việc đặt giá trị: $('#id').val(16).change();


3
$ ('# id'). val (16) .change (); đã làm điều đó cho tôi.
TomoMiha

1
Cảm ơn, @TomoMiha. Đã thêm nó vào câu trả lời.
d.popov

2

Nếu bạn đang cố gắng tạo menu thả xuống được liên kết, cách tốt nhất để làm điều đó là có một tập lệnh trả về hộp chọn được tạo sẵn và lệnh gọi AJAX yêu cầu nó.

Đây là tài liệu về phương thức Ajax của jQuery nếu bạn cần.

$(document).ready(function(){

    $('#countrylist').change(function(e){
        $this = $(e.target);
        $.ajax({
            type: "POST",
            url: "scriptname.asp", // Don't know asp/asp.net at all so you will have to do this bit
            data: { country: $this.val() },
            success:function(data){
                $('#stateBoxHook').html(data);
            }
        });
    });

});

Sau đó, có một khoảng xung quanh hộp chọn trạng thái của bạn với id là "stateBoxHook"


Tôi có trình đơn thả xuống theo tầng: <% = Html.DropDownList ("MyCountries", "--- Chọn quốc gia ---")%> <% = Html.CascadingDropDownList ("MyStates", "MyCountries")%> Tôi có thể đặt giá trị của MyCountries as $ ("# MyCountries"). val ('<% = Model.CountryId%>'); trong $ (tài liệu) .ready. Nhưng tôi không thể đặt giá trị cho tiểu bang vì nó chỉ hiển thị một tùy chọn "Chọn tiểu bang", tùy chọn này sẽ được điền vào sự kiện thay đổi quốc gia vì chúng đang xếp tầng thả xuống. Đây là vấn đề thực tế.
Prasad

Vẫn không chắc chắn những gì bạn đang theo đuổi. Bạn đang cố gắng đạt được một hệ thống theo đó họ chọn một quốc gia và nó thu hẹp danh sách xuống các tiểu bang ở quốc gia đó? Nếu trường hợp này xảy ra, bạn sẽ cần phải có một cuộc gọi AJAX đến máy chủ và gửi đi quốc gia đã chọn và sau đó trả về một lượt nghe các tiểu bang ở quốc gia đó.
xenon

Tôi đã đặt USA là Country & Alabama làm State, đây là một danh sách thả xuống theo tầng, trong khi thêm hồ sơ người dùng. Và khi tôi quay lại trang đó để Chỉnh sửa trường, tôi cần Quốc gia và Tiểu bang được điền các giá trị mà tôi đã đặt trước đó. Tôi không gặp vấn đề gì khi thêm hồ sơ người dùng, khi tôi quay lại trang để Chỉnh sửa, tôi có thể đặt giá trị cho trình đơn thả xuống Quốc gia và trong trình đơn thả xuống trạng thái, các giá trị không được điền vì nó đang xếp tầng mà được điền vào giá trị quốc gia thay đổi sự kiện. Đối với điều này, tôi cần kích hoạt sự kiện thay đổi quốc gia để tiểu bang đó được lấp đầy và tôi có thể đặt trạng thái
Prasad

Tại sao điều này là trường hợp? Bạn biết quốc gia là gì tại thời điểm tải trang, do đó bạn có thể hiển thị danh sách các tiểu bang được lựa chọn chính xác với trạng thái được chọn chính xác. Khi bạn thay đổi quốc gia, danh sách vẫn sẽ được tải lại.
xenon

1

Ngoài ra, bạn có thể đặt thuộc tính onchange trên chính danh sách thả xuống, onchange đó sẽ gọi một số hàm jquery như thế này.

<input type="dropdownlist" onchange="jqueryFunc()">

<script type="text/javascript">
$(function(){
    jqueryFunc(){
        //something goes here
    }
});
</script>

hy vọng điều này sẽ giúp bạn và xin lưu ý rằng mã này chỉ là một bản nháp sơ bộ, không được thử nghiệm trên bất kỳ lý tưởng nào. cảm ơn


Điều này không gây ra sự kiện thay đổi khi tải trang đầu tiên (theo câu hỏi OP của)

0

Vì một số lý do, các jQuerygiải pháp khác được cung cấp ở đây hoạt động khi chạy tập lệnh từ bảng điều khiển, tuy nhiên, nó không hoạt động với tôi khi được kích hoạt từ Chrome Bookmarklets .

May mắn thay, giải pháp Vanilla JS này ( triggerChangeEventhàm) đã hoạt động:

/**
  * Trigger a `change` event on given drop down option element.
  * WARNING: only works if not already selected.
  * @see /programming/902212/trigger-change-event-of-dropdown/58579258#58579258
  */
function triggerChangeEvent(option) {
  // set selected property
  option.selected = true;
  
  // raise event on parent <select> element
  if ("createEvent" in document) {
    var evt = document.createEvent("HTMLEvents");
    evt.initEvent("change", false, true);
    option.parentNode.dispatchEvent(evt);
  }
  else {
    option.parentNode.fireEvent("onchange");
  }
}

// ################################################
// Setup our test case
// ################################################

(function setup() {
  const sel = document.querySelector('#fruit');
  sel.onchange = () => {
    document.querySelector('#result').textContent = sel.value;
  };
})();

function runTest() {
  const sel = document.querySelector('#selector').value;
  const optionEl = document.querySelector(sel);
  triggerChangeEvent(optionEl);
}
<select id="fruit">
  <option value="">(select a fruit)</option>
  <option value="apple">Apple</option>
  <option value="banana">Banana</option>
  <option value="pineapple">Pineapple</option>
</select>

<p>
  You have selected: <b id="result"></b>
</p>
<p>
  <input id="selector" placeholder="selector" value="option[value='banana']">
  <button onclick="runTest()">Trigger select!</button>
</p>

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.