Событие изменения триггера в раскрывающемся списке

86

Я хочу вызвать событие изменения раскрывающегося списка в $ (document) .ready с помощью jquery.

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

Прасад
источник
Возможно, вы захотите добавить еще несколько тегов, таких как javascript и jQuery, чтобы узнать об этом больше
xenon

Ответы:

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');
});

Вы должны объявить обработчик события изменения перед вызовом trigger () или change (), иначе он не будет запущен. Спасибо за упоминание @LenielMacaferi.

Больше информации здесь .

Кристоф Эбле
источник
13
Вы должны объявить обработчик события изменения перед вызовом trigger()или даже так, change()как правильно показано в этом ответе, то есть, если код обработчика событий появляется под вызовом, ничего не происходит! :)
Leniel Maccaferri
3
@LenielMacaferi Спасибо, что сэкономили мне час или два.
Frank Nocke
@Christophe Eblé и Leniel Macaferi, большое спасибо. Кристоф, не могли бы вы добавить комментарий Ленила к своему ответу?
Zaxter
Я использовал .change (), но не повезло с jquery 3.1.1, после этого сообщения он запускается, как ожидалось.
Сорангвала Аббасали
Это просто заканчивается бесконечным зацикливанием, все решения этого заканчиваются зацикливанием.
Nathan McKaskle
12

Попробуй это:

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

Определите событие изменения и немедленно активируйте его. Это гарантирует, что обработчик событий определен перед его вызовом.

Возможно, будет поздно ответить на исходный постер, но кто-то другой может извлечь выгоду из сокращенной записи, и это следует за цепочкой jQuery и т. Д.

цепочка jquery

млныц
источник
7

Попробуй это:

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

Работает для меня.

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

д.попов
источник
3
$ ('# идентификатор'). val (16) .change (); сделал это для меня.
TomoMiha
1
Спасибо, @TomoMiha. Добавил в ответ.
d.popov
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", "--- Выберите страну ---")%> <% = Html.CascadingDropDownList ("MyStates", "MyCountries")%> Я могу установить значение MyCountries как $ ("# MyCountries"). val ('<% = Model.CountryId%>'); в $ (документ) .ready. Но я не могу установить значение для состояния, поскольку он показывает только одну опцию «Выбрать состояние», которая должна быть заполнена при событии изменения страны, поскольку они являются каскадными раскрывающимися списками. Это актуальный вопрос.
Прасад
Все еще не уверен, что вам нужно. Вы пытаетесь создать систему, при которой они выбирают страну и сужают список до штатов в этой стране? В этом случае вам нужно будет выполнить вызов AJAX на сервер и отправить из выбранной страны, а затем вернуть список штатов в этой стране.
xenon
Я установил США как страну и Алабаму как штат, что является каскадным раскрывающимся списком при добавлении профиля пользователя. И когда я вернусь на эту страницу, чтобы отредактировать поле, мне нужно, чтобы Страна и Штат были заполнены значениями, которые я установил ранее. У меня нет проблем с добавлением профиля пользователя, когда я возвращаюсь на страницу для редактирования, я могу установить значение для раскрывающегося списка Страна, а в раскрывающемся списке состояния значения не заполняются, поскольку он каскадный, который заполняется значением страны изменить событие. Для этого мне нужно вызвать событие изменения страны, чтобы состояние было заполнено, и я мог установить состояние
Прасад
Почему это так? Вы знаете, какая страна находится во время загрузки страницы, поэтому вы можете отобразить правильный список выбранных состояний с правильным выбранным состоянием. При изменении страны список все равно будет перезагружен.
xenon
1

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

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

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

Надеюсь, это поможет вам, и обратите внимание, что этот код - это всего лишь черновик, не проверенный ни на одном ide. Благодарность

Дэйв
источник
Это не вызывает событие изменения при первой загрузке страницы (согласно вопросу OP)
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>

Доми
источник