Измените параметр <select> и активируйте события с помощью JavaScript.

Как изменить параметр HTML <select> с помощью JavaScript (без каких-либо библиотек, таких как jQuery), при запуске таких же событий, как если бы пользователь внес изменения?

Например, используя следующий код, если я изменяю параметр с помощью мыши, запускаются триггеры событий (т.е. onchange). Однако, когда я изменяю вариант с помощью JavaScript, он не запускает какое-либо событие. Можно ли запускать триггерные обработчики событий, такие как onclick, onchange и т.д., Когда опция выбрана с использованием JavaScript?

<select id="sel" onchange='alert("changed")'>
  <option value='1'>One</option>
  <option value='2'>Two</option>
  <option value='3'>Three</option>
</select>
<input type="button" onclick='document.getElementById("sel").options[1].selected = true;' value="Change option to 2" />

http://jsfiddle.net/xwywvd1a/

Ответы

Ответ 1

К сожалению, вам нужно вручную запустить событие change. И Event Contructor будет лучшим решением.

var select = document.querySelector('#sel'),
    input = document.querySelector('input[type="button"]');
select.addEventListener('change',function(){
    alert('changed');
});
input.addEventListener('click',function(){
    select.value = 2;
    select.dispatchEvent(new Event('change'));
});
<select id="sel" onchange='alert("changed")'>
  <option value='1'>One</option>
  <option value='2'>Two</option>
  <option value='3' selected>Three</option>
</select>
<input type="button" value="Change option to 2" />

Ответ 2

Скриншот моего решения здесь. Но на всякий случай он истечет, я также вставлю код.

HTML:

<select id="sel">
  <option value='1'>One</option>
  <option value='2'>Two</option>
  <option value='3'>Three</option>
</select>
<input type="button" id="button" value="Change option to 2" />

JS:

var sel = document.getElementById('sel'),
    button = document.getElementById('button');

button.addEventListener('click', function (e) {
    sel.options[1].selected = true;

    // firing the event properly according to StackOverflow
    // http://stackoverflow.com/questions/2856513/how-can-i-trigger-an-onchange-event-manually
    if ("createEvent" in document) {
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent("change", false, true);
        sel.dispatchEvent(evt);
    }
    else {
        sel.fireEvent("onchange");
    }
});

sel.addEventListener('change', function (e) {
    alert('changed');
});

Ответ 3

Это так просто:

var sel = document.getElementById('sel');
var button = document.getElementById('button');

button.addEventListener('click', function (e) {
    sel.options[1].selected = true;
    sel.onchange();
});

Но этот путь имеет проблему. Вы не можете вызывать события так же, как и обычные функции, потому что может быть несколько функций, которые прослушивают событие, и их можно установить несколькими способами.

К сожалению, "правильный путь" для запуска события не так просто, потому что вы должны делать это по-другому в Internet Explorer (используя document.createEventObject) и Firefox (используя document.createEvent( "HTMLEvents" ))

var sel = document.getElementById('sel');
var button = document.getElementById('button');

button.addEventListener('click', function (e) {
    sel.options[1].selected = true;
    fireEvent(sel,'change');

});


function fireEvent(element,event){
    if (document.createEventObject){
    // dispatch for IE
    var evt = document.createEventObject();
    return element.fireEvent('on'+event,evt)
    }
    else{
    // dispatch for firefox + others
    var evt = document.createEvent("HTMLEvents");
    evt.initEvent(event, true, true ); // event type,bubbling,cancelable
    return !element.dispatchEvent(evt);
    }
}

Ответ 4

Все события создания и диспетчеризации работают, но поскольку вы используете атрибут onchange, ваша жизнь может быть немного проще:

http://jsfiddle.net/xwywvd1a/3/

var selEl = document.getElementById("sel");
selEl.options[1].selected = true;
selEl.onchange();

Если вы используете API-интерфейс браузера (addEventListener, IE AttachEvent и т.д.), вам нужно будет создавать и отправлять события, как уже указывали другие.

Ответ 5

Попробуйте следующее:

<select id="sel">
 <option value='1'>One</option>
  <option value='2'>Two</option> 
  <option value='3'>Three</option> 
  </select> 


  <input type="button" value="Change option to 2"  onclick="changeOpt()"/>

  <script>

  function changeOpt(){
  document.getElementById("sel").options[1].selected = true;

alert("changed")
  }

  </script>

Ответ 6

Эти вопросы могут иметь отношение к тому, что вы просите:

Вот мои мысли: вы можете складывать более одного вызова в своем событии onclick следующим образом:

<select id="sel" onchange='alert("changed")'>
  <option value='1'>One</option>
  <option value='2'>Two</option>
  <option value='3'>Three</option>
</select>
<input type="button" onclick='document.getElementById("sel").options[1].selected = true; alert("changed");' value="Change option to 2" />

Вы также можете вызвать функцию для этого.

Если вы действительно хотите назвать одну функцию и оба ведут себя одинаково, я думаю, что что-то вроде этого должно работать. На самом деле это не соответствует лучшей практике "Функции должны делать одно и делать это хорошо", но это позволяет вам вызывать одну функцию для обработки обоих способов изменения раскрывающегося списка. В основном я передаю (значение) на событие onchange и (null, индекс опции) в событии onclick.

Вот код: http://codepen.io/mmaynar1/pen/ZYJaaj

<select id="sel" onchange='doThisOnChange(this.value)'>
<option value='1'>One</option>
<option value='2'>Two</option>
<option value='3'>Three</option>
</select>
<input type="button" onclick='doThisOnChange(null,1);' value="Change option to 2"/>

<script>
doThisOnChange = function( value, optionIndex)
{
    if ( optionIndex != null )
    {
       var option = document.getElementById( "sel" ).options[optionIndex];
       option.selected = true;
       value = option.value;
    }
    alert( "Do something with the value: " + value );
}
</script>

Ответ 7

Вы можете запустить событие вручную после изменения выбранного параметра в событии onclick: document.getElementById("sel").onchange();

Ответ 8

HTML, используя Razor:

 @Html.DropDownList("test1", Model.SelectOptionList, new { id = "test1", onchange = "myFunction()" })

JS-код:

function myFunction() {

            var value = document.getElementById('test1').value;

            console.log("it has been changed! to " + value );
        }