Wyzwalanie zdarzenia zmiany listy rozwijanej

86

Chcę wywołać zdarzenie zmiany listy rozwijanej w $ (dokument). Już przy użyciu jquery.

Mam kaskadowe menu z krajami i stanami na stronie szczegółów użytkownika. jak mogę ustawić wartość (która jest pobierana z bazy danych na podstawie identyfikatora użytkownika) dla kraju i stanu w MVC z C #.

Prasad
źródło
Możesz umieścić więcej tagów, takich jak javascript i jQuery, aby znaleźć więcej
xenon

Odpowiedzi:

185

Nie znam zbyt wiele JQuery, ale słyszałem, że pozwala na uruchamianie natywnych zdarzeń przy użyciu tej składni.

$(document).ready(function(){

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

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

Musisz zadeklarować procedurę obsługi zdarzenia change przed wywołaniem funkcji trigger () lub change (), w przeciwnym razie nie zostanie ona uruchomiona. Dzięki za wzmiankę @LenielMacaferi.

Więcej informacji tutaj .

Christophe Eblé
źródło
13
Musisz zadeklarować procedurę obsługi zdarzenia zmiany przed wywołaniem trigger()lub nawet change()tak, jak jest to poprawnie pokazane w tej odpowiedzi, to znaczy, jeśli kod obsługi zdarzenia pojawi się poniżej wywołania, nic się nie dzieje! :)
Leniel Maccaferri
3
@LenielMacaferi Dziękuję za uratowanie mi godziny lub dwóch.
Frank Nocke
@Christophe Eblé & Leniel Macaferi, wielkie dzięki. Christophe, czy mógłbyś dodać komentarz Leniel do swojej odpowiedzi?
Zaxter
Użyłem .change (), ale bez powodzenia z jquery 3.1.1, Po tym poście uruchamia się zgodnie z oczekiwaniami.
Sorangwala Abbasali
To po prostu kończy się nieskończoną pętlą, a rozwiązanie każdego z nich kończy się zapętleniem.
Nathan McKaskle
12

Spróbuj tego:

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

Zdefiniuj zdarzenie zmiany i uruchom je natychmiast. Dzięki temu program obsługi zdarzeń jest zdefiniowany przed jego wywołaniem.

Może się spóźnić, aby odpowiedzieć na oryginalny plakat, ale ktoś inny może skorzystać na zapisie skróconym, a to jest zgodne z łączeniem jQuery itp.

tworzenie łańcuchów jQuery

mlnyc
źródło
7

Spróbuj tego:

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

Pracuje dla mnie.

W jednej linii wraz z ustawieniem wartości: $('#id').val(16).change();

d.popov
źródło
3
$ ('# id'). val (16) .change (); zrobił to dla mnie.
TomoMiha
1
Dzięki, @TomoMiha. Dodałem to w odpowiedzi.
d.popov
2

Jeśli próbujesz mieć połączone listy rozwijane, najlepszym sposobem na to jest posiadanie skryptu, który zwraca gotowe pole wyboru i wywołanie AJAX, które tego żąda.

Oto dokumentacja metody Ajax jQuery, jeśli jej potrzebujesz.

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

});

Następnie ustaw zakres wokół pola wyboru stanu z identyfikatorem „stateBoxHook”

ksenon
źródło
Mam kaskadowe listy rozwijane: <% = Html.DropDownList ("MyCountries", "--- Select Country ---")%> <% = Html.CascadingDropDownList ("MyStates", "MyCountries")%> Mogę ustawić wartość MyCountries as $ ("# MyCountries"). val ('<% = Model.CountryId%>'); w $ (document) .ready. Ale nie jestem w stanie ustawić wartości stanu, ponieważ pokazuje ona tylko jedną opcję „Wybierz stan”, która powinna być wypełniona na zdarzeniu zmiany kraju, ponieważ są one kaskadowo rozwijane. To jest rzeczywisty problem.
Prasad
Nadal nie jestem pewien, czego szukasz. Czy próbujesz stworzyć system, w którym wybierają państwo i zawężają listę do stanów w tym kraju? W takim przypadku będziesz musiał wykonać połączenie AJAX z serwerem i wysłać z wybranego kraju, a następnie odesłać listę stanów w tym kraju.
ksenon
Ustawiłem Stany Zjednoczone jako Kraj i Alabama jako Stan, co jest rozwijanym menu rozwijanym podczas dodawania profilu użytkownika. A kiedy wrócę na tę stronę, aby edytować pole, potrzebuję, aby kraj i stan zostały wypełnione wartościami, które ustawiłem wcześniej. Nie mam problemu z dodaniem profilu użytkownika, kiedy wracam na stronę do edycji, mogę ustawić wartość dla listy rozwijanej Kraj, a na liście rozwijanej stanu wartości nie są wypełnione, ponieważ są kaskadowe, które wypełniają się wartością kraju zmień wydarzenie. W tym celu muszę wyzwolić zdarzenie zmiany kraju, aby stan został wypełniony i mogę ustawić stan
Prasad
Dlaczego tak się dzieje? Wiesz, jaki kraj jest w momencie wczytywania strony, więc możesz wyrenderować właściwą listę wybranych stanów z wybranym stanem. Po zmianie kraju lista i tak zostanie ponownie załadowana.
ksenon
1

alternatywnie możesz umieścić atrybut onchange na samej liście rozwijanej, który będzie wywoływał określoną funkcję jquery w ten sposób.

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

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

mam nadzieję, że ten pomoże ci i pamiętaj, że ten kod jest tylko wstępną wersją roboczą, nie testowany na żadnym IDE. dzięki

dave
źródło
To nie wywołuje zdarzenia zmiany, gdy strona ładuje się po raz pierwszy (zgodnie z pytaniem OP)
0

Z jakiegoś powodu inne jQueryprzedstawione tutaj rozwiązania działały podczas uruchamiania skryptu z konsoli, jednak nie działały u mnie po uruchomieniu z Chrome Bookmarklets .

Na szczęście to rozwiązanie Vanilla JS ( triggerChangeEventfunkcja) zadziałało:

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

Domi
źródło