Jak wyzwolić zdarzenie zmiany jQuery w kodzie

177

Mam zdarzenie zmiany, które działa poprawnie, ale muszę je powtórzyć.

Mam więc funkcję, która jest wyzwalana przy zmianie, która „zmieni” inne listy rozwijane w oparciu o selektor klas (zauważ: „drop downS”, może być więcej niż jeden). Ta zmiana serwera proxy nie wyzwala funkcji, a więc kończy się niepowodzeniem. Jak mogę to uruchomić?

Kod

$(document).ready(function () {
    var activeDropBox = null;

    $("select.drop-box").change(function () {
        var questionId = $(this).attr("questionId");
        var selectedAnswer = $(this).val();
        activeDropBox = this;

        alert(this.questionId);

        $.ajax(
        {
            type: "POST",
            url: answerChangedActionUrl,
            data: { questionId: questionId, selectedValue: selectedAnswer },
            success: function (data) {
                SetElementVisibility(data.ShowElement, questionId);
            }, error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert('XMLHttpRequest:' + XMLHttpRequest.responseText);
                alert('textStatus:' + textStatus);
                alert('errorThrown:' + errorThrown);
            }
        });
    });

    function SetElementVisibility(visible, questionId) {
        // I would like each child to then trigger the change event...
        $(".childOf" + questionId)[visible ? 'show' : 'hide']('slow');

        // Suggested code
        //$(".childOf" + questionId + " select").trigger("change");

        if (!visible) {
            $(".childOf" + questionId + " select").attr('selectedIndex', 0);
        }
    }
}

Dotychczasowe sugestie wydają się działać, ale ponieważ zdarzenie zmiany wyzwala post w Ajax, teraz wydaje się, że zawodzi. Mam zamiar się tym bawić, ale to jest coś na inne pytanie, które czuję.

4imble
źródło
1
Podaj trochę kodu, żebyśmy mogli
rzucić
Jak możemy Ci powiedzieć, jak sprawić, by działał, skoro nie pokazałeś nam, co to jest?
user113716
1
Myślałem, że to prosta koncepcja i nie czułem, że kod jest wymagany. Wydaje się, że dotychczasowe odpowiedzi zrozumiały moje wyjaśnienie, dlatego teraz próbuję ich rozwiązań. Jeśli nie będę miał radości, wyślę kod. Moja realizacja jest właściwie dużo bardziej złożona.
4imble
1
Posortowałem to, był problem ze zmianą wartości po wysłaniu Ajax. Dziękuję wszystkim za pomoc. Opublikowane sugestie działały jak marzenie.
4imble

Odpowiedzi:

391

Użyj metody trigger ()

$(selector).trigger("change");
John Hartsock
źródło
4
Czy jest z tego jakaś korzyść change()? A może to tylko preferencja?
Joshua Pinter
6
@JoshPinter nie ma prawdziwej korzyści, bardziej preferencja. Ale zdecydowanie łatwiej jest abstrahować jako parametr niż nazwa metody.
John Hartsock,
Ustawienie wartości przed faktycznym wyzwoleniem zdarzenia zmiany jest najlepszym sposobem !!
Kapil Yadav
33

dla mnie $('#element').val('...').change()to najlepszy sposób.

Luis Carlos Steffens
źródło
Tak !, podoba mi się ten
Juan Herrera
Tak! pozwala na wybór opcji w tym samym czasie. Myślę, że twoja odpowiedź zasługuje na to, by być tutaj najlepszą.
Sergej Fomin
20

Bezparametrowa postać metody change () wyzwala changezdarzenie. Możesz napisać coś takiego:

$(document).ready(function() {
    $("#yourInitialElementID").change(function() {
        // Do something here...
        $(".yourDropDownClass").change();
    });
});
Frédéric Hamidi
źródło
9
$(selector).change()

.zmiana()


.trigger ("zmiana")

Dłuższa wolniejsza alternatywa, lepsza dla abstrakcji.

.trigger ("zmiana")

$(selector).trigger("change")
Geoffrey Hale
źródło
8

Użyć tego :

$(selector).trigger("change");

LUB

$('#id').trigger("click");

LUB

$('.class').trigger(event);

Wyzwalaczem może być każde zdarzenie, które obsługuje javascript. Mam nadzieję, że jest to łatwe do zrozumienia dla wszystkich.

Muhammad Fahad
źródło