Подія зміни тригера, що випадає


86

Я хочу ініціювати випадаючу подію змін у $ (document). Вже використовуючи jquery.

У мене є каскадне спадне меню для країни та штату на сторінці інформації про користувача. як я можу встановити значення (яке береться з БД на основі ідентифікатора користувача) для країни та штату в MVC за допомогою C #.


Можливо, ви захочете поставити ще кілька тегів, таких як javascript та jQuery, щоб отримати це знайдене більше
ксенон

Відповіді:


185

Я не знаю так багато JQuery, але я чув, що це дозволяє запускати власні події за допомогою цього синтаксису.

$(document).ready(function(){

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

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

Ви повинні оголосити обробник події зміни перед викликом тригера () або зміни (), інакше він не буде запущений. Дякуємо за згадку @LenielMacaferi.

Більше інформації тут .


13
Ви повинні оголосити обробник подій змін перед викликом trigger()або навіть change()як правильно показано в цій відповіді, тобто якщо код обробника події з’являється під викликом, нічого не відбувається! :)
Леніель Маккаферрі

3
@LenielMacaferi Дякуємо, що заощадили годину чи дві.
Frank Nocke

@Christophe Eblé & Leniel Macaferi, велике спасибі. Крістофе, чи не могли б Ви додати коментар Леніеля до Вашої відповіді?
Zaxter,

Я використовував .change (), але не пощастило з jquery 3.1.1, після цього повідомлення він запускається, як очікувалося.
Sorangwala Abbasali

Це просто закінчується нескінченною циклічністю, а рішення кожного цього - циклічною.
Натан Маккаскл,

12

Спробуйте це:

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

Визначте подію зміни та негайно запустіть її. Це гарантує, що обробник подій визначений перед його викликом.

Можливо, запізнився відповісти на оригінальний плакат, але хтось інший може скористатися скороченим позначенням, і це слідує за ланцюжком jQuery тощо

jquery ланцюжок


7

Спробуйте це:

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

Працює для мене.

В одному рядку разом із встановленням значення: $('#id').val(16).change();


3
$ ('# id'). val (16) .change (); зробив це за мене.
TomoMiha

1
Дякую, @TomoMiha. Додав це у відповідь.
д.попов

2

Якщо ви намагаєтесь мати пов'язані випадаючі меню, найкращий спосіб це зробити - це мати скрипт, який повертає заздалегідь побудоване поле вибору та виклик AJAX, який це вимагає.

Ось документація до методу jQuery Ajax, якщо він вам потрібен.

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

});

Потім розмістіть область навколо поля вибору штату з ідентифікатором "stateBoxHook"


У мене є каскадні випадаючі меню: <% = Html.DropDownList ("MyCountries", "--- Select Country ---")%> <% = Html.CascadingDropDownList ("MyStates", "MyCountries")%> Я можу встановити значення MyCountries як $ ("# MyCountries"). val ('<% = Model.CountryId%>'); в $ (документ) .жо. Але я не можу встановити значення для стану, оскільки воно відображає лише один параметр "Вибрати стан", який слід заповнити в країні при зміні події, оскільки вони каскадують випадаючими меню. Це актуальне питання.
Прасад

Досі не впевнений, що ти хочеш. Ви намагаєтесь створити систему, згідно з якою вони вибирають країну, і вона звужує список до штатів у цій країні? У цьому випадку вам потрібно буде здійснити виклик AJAX на сервер і відправити вибрану країну, а потім повернути слухання штатів у цій країні.
ксенон

Я призначив США країною та Алабаму державою, що є каскадним випадаючим списком, додаючи профіль користувача. І коли я повертаюся на цю сторінку для редагування поля, мені потрібно, щоб країна і штат були заповнені значеннями, які я встановив раніше. У мене немає проблем з додаванням профілю користувача, коли я повертаюся на сторінку для редагування, я можу встановити значення для спадного меню Країна, і в спадному меню стану значення не заповнюються, оскільки воно каскадне, що отримує заповнення значення країни зміна події. Для цього мені потрібно викликати подію зміни країни, щоб штат отримав заповнення, і я міг встановити стан
Прасад

Чому це так? Ви знаєте, яка країна знаходиться під час завантаження сторінки, таким чином, ви можете зробити правильний вибраний список штатів із вибраним правильним станом. Коли ви зміните країну, список все одно буде оновлений.
ксенон

1

в якості альтернативи ви можете помістити атрибут onchange у сам випадаючий список, який onchange буде викликати певну функцію jquery, як ця.

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

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

сподіваємось, це допоможе вам, і зауважте, що цей код - лише приблизний проект, не перевірений на будь-якій ідеї. Дякую


Це не ініціює подію зміни при першому завантаженні сторінки (відповідно до запитання ОП)

0

З якоїсь причини інші jQueryзапропоновані тут рішення працювали під час запуску сценарію з консолі, однак для мене це не спрацювало, коли спрацьовував із Chrome Bookmarklets .

На щастя, це рішення Vanilla JS ( triggerChangeEventфункція) справді працювало:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.