Açılır listenin tetik değişikliği olayı


86

$ (Belge) içindeki açılır listenin değişiklik olayını tetiklemek istiyorum. Jquery kullanarak.

Kullanıcı ayrıntıları sayfasında ülke ve eyalet için basamaklı bir açılır menü var. MVC'de C # ile ülke ve eyalet için (kullanıcı kimliğine dayalı olarak DB'den alınan) değeri nasıl ayarlayabilirim.


Bunun daha fazla bulunması için javascript ve jQuery gibi daha fazla etiket koymak isteyebilirsiniz
xenon

Yanıtlar:


185

O kadar JQuery bilmiyorum ama bu sözdizimi ile yerel olayları ateşlemeye izin verdiğini duydum.

$(document).ready(function(){

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

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

Trigger () veya change () 'i çağırmadan önce change olay işleyicisini bildirmelisiniz, aksi takdirde tetiklenmeyecektir. @LenielMacaferi'den bahsettiğiniz için teşekkürler.

Daha fazla bilgi burada .


13
Değişim olay işleyicisini aramadan önce trigger()veya change()bu yanıtta doğru bir şekilde gösterildiği gibi bildirmelisiniz , yani olay işleyici kodu çağrının altında görünüyorsa hiçbir şey olmuyor! :)
Leniel Maccaferri

3
@LenielMacaferi Beni bir veya iki saat kurtardığınız için teşekkür ederim.
Frank Nocke

@Christophe Eblé & Leniel Macaferi, Çok teşekkürler. Christophe, lütfen cevabına Leniel'in yorumunu ekler misin?
Zaxter

.Change () kullandım ancak jquery 3.1.1 ile şansım olmadı, bu gönderiden sonra beklendiği gibi tetikleniyor.
Sorangwala Abbasali

Bu sadece sonsuz döngüye giriyor, herkesin buna yönelik çözümü döngüye giriyor.
Nathan McKaskle

12

Bunu dene:

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

Değişiklik olayını tanımlayın ve hemen tetikleyin. Bu, olay işleyicisinin çağrılmadan önce tanımlanmasını sağlar.

Orijinal posteri yanıtlamak için geç olabilir, ancak başka biri steno notasyondan yararlanabilir ve bu jQuery'nin zincirlemesini takip eder.

jquery zincirleme


7

Bunu dene:

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

Benim için çalışıyor.

Değerin ayarlanmasıyla birlikte tek satırda: $('#id').val(16).change();


3
$ ['# id']. val (16) .change (); benim için yaptı.
TomoMiha

1
Teşekkürler @TomoMiha. Cevaba ekledim.
d.popov

2

Bağlantılı açılır menülere sahip olmaya çalışıyorsanız, bunu yapmanın en iyi yolu, önceden oluşturulmuş bir seçim kutusunu ve onu isteyen bir AJAX çağrısını döndüren bir komut dosyasına sahip olmaktır.

İhtiyacınız olursa jQuery'nin Ajax yöntemi için belgeler burada.

$(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);
            }
        });
    });

});

Ardından, "stateBoxHook" kimliğiyle eyalet seçim kutunuzun etrafında bir aralık bırakın


Basamaklı açılır menülerim var: <% = Html.DropDownList ("MyCountries", "--- Select Country ---")%> <% = Html.CascadingDropDownList ("MyStates", "MyCountries")%> MyCountries değeri $ ("# MyCountries"). val ('<% = Model.CountryId%>'); $ (belge) içinde. hazır. Ancak, yalnızca bir seçenek olan "Eyalet Seç" i gösterdiği için durum değerini ayarlayamıyorum, bu seçenek, basamaklı açılır menüler olduğundan, ülke onchange olayında doldurulmalıdır. Bu asıl mesele.
Prasad

Hala neyin peşinde olduğundan emin değilim. Bir ülke seçtikleri ve listeyi o ülkedeki eyaletlere kadar daralttıkları bir sisteme mi ulaşmaya çalışıyorsunuz? Durum buysa, sunucuya bir AJAX çağrısı yapmanız ve seçilen ülkeyi göndermeniz ve ardından o ülkedeki eyaletler listesini iade etmeniz gerekecektir.
xenon

Kullanıcı profilini eklerken basamaklı bir açılır menü olan ABD'yi Ülke ve Alabama'yı Eyalet olarak belirledim. Ve bir alanı düzenlemek için o sayfaya geri döndüğümde, Ülke ve Eyalet'in daha önce belirlediğim değerlerle doldurulmasına ihtiyacım var. Kullanıcı profilini eklemekte sorun yaşamıyorum, Düzenle sayfasına geri döndüğümde Ülke açılır menüsü için değer ayarlayabiliyorum ve eyalet açılır menüsünde değerler basamaklı olduğu için doldurulmuyor ve ülke değeri dolduruluyor olay değiştir. Bunun için ülke değişim olayını tetiklemeliyim ki eyalet dolsun ve eyaleti ayarlayabilirim
Prasad

Bu neden böyle? Sayfa yükleme zamanında ülkenin ne olduğunu bilirsiniz, böylece doğru durum seçilmiş olarak doğru seçilmiş durum listesini oluşturabilirsiniz. Ülkeyi değiştirdiğinizde liste yine de yeniden yüklenecektir.
xenon

1

alternatif olarak açılır listenin kendisine onchange özniteliğini koyabilirsiniz, bu onchange bunun gibi belirli jquery işlevini çağırır.

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

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

Umarım bu size yardımcı olur ve lütfen bu kodun herhangi bir fikir üzerinde test edilmemiş kaba bir taslak olduğunu unutmayın. Teşekkürler


Bu, sayfa ilk yüklendiğinde (OP'nin sorusuna göre) değişiklik olayını tetiklemez

0

Bazı nedenlerden dolayı, jQueryburada sağlanan diğer çözümler komut dosyasını konsoldan çalıştırırken çalıştı, ancak Chrome Yer İşaretlerinden tetiklendiğinde benim için çalışmadı .

Neyse ki, bu Vanilla JS çözümü ( triggerChangeEventişlev) işe yaradı:

/**
  * 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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.