2013-10-12 8 views
15

Jak mogę zmienić opcję HTML <select> za pomocą JavaScript (bez bibliotek takich jak jQuery), uruchamiając te same zdarzenia, jak gdyby użytkownik wprowadził zmianę?Zmiana opcji i wyzwalanie zdarzeń za pomocą JavaScript

Na przykład za pomocą następującego kodu, jeśli zmienię opcję za pomocą myszy, zostanie wywołane zdarzenie (tj. Zostanie uruchomione onchange). Jednak gdy zmienię opcję za pomocą JavaScriptu, to nie wywoła żadnego zdarzenia. Czy jest możliwe uruchamianie programów obsługi zdarzeń związanych z wyzwalaczem, takich jak onclick, onchange itp., Gdy wybrana jest opcja z 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/

+0

Ale czy chcesz wywołać zdarzenie onchange? Możesz zrobić to samo tam, gdzie wybierasz opcję. –

Odpowiedz

15

Niestety, należy ręcznie uruchomić zdarzenie change. Najlepszym rozwiązaniem będzie 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" />

I oczywiście, konstruktor Event nie jest obsługiwana w IE. Więc może trzeba PolyFill z tym:

function Event(event, params) { 
    params = params || { bubbles: false, cancelable: false, detail: undefined }; 
    var evt = document.createEvent('CustomEvent'); 
    evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); 
    return evt; 
} 
-1

można ognia zdarzenie ręcznie po zmianie wybraną opcję na zdarzenie onclick robi: document.getElementById("sel").onchange();

+0

Działa to (z pewnymi ograniczeniami) tylko wtedy, gdy ustawiono właściwość 'onchange', a nie z wbudowanymi procedurami obsługi. – Teemu

1

Spróbuj tego:

<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> 
+0

Pytanie ma wywołać zdarzenie - nie fałszować ... – Karol

1

Pytania te mogą być istotne o co prosisz:

Oto moje myśli: Można układać się więcej niż jedno połączenie w przypadku onclick tak:

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

Można też nazwać funkcja do tego.

Jeśli naprawdę chcesz wywołać jedną funkcję i obie zachowują się w ten sam sposób, myślę, że coś takiego powinno zadziałać. Nie jest to zgodne z najlepszą praktyką "Funkcje powinny robić jedną rzecz i robić to dobrze", ale pozwala ona wywołać jedną funkcję, aby obsłużyć oba sposoby zmiany rozwijanego menu. Zasadniczo przekazuję (wartość) w zdarzeniu onchange i (null, index of option) w zdarzeniu onclick.

Oto codepen: 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> 
+0

To kolejne fałszywe rozwiązanie. Co się stanie, jeśli ktoś załączy wiele programów obsługi do 'onchange' na elemencie' select'? Jak ta konstrukcja będzie działać? Jedno jest pewne, że nie wywoła żadnego z nich ... – Karol

9

Fiddle mojego rozwiązania jest here. Ale na wypadek, gdy wygasa, wkleję również kod.

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

Dodatkowo: '' 'button.addEventListener ('kliknij', funkcja (e) { sel.options [1] .selected = true; /* od ie9 jest to możliwe, dla ie8 i poniżej musisz dodać kilka hacków */ sel.dispatchEvent (new CustomEvent ('change')); }); '' ' – Eraden

3

Jest to tak proste, jak to:

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

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

Ale w ten sposób ma problem. Nie możesz wywoływać wydarzeń tak jak Ty, przy normalnych funkcjach, ponieważ może istnieć więcej niż jedna funkcja nasłuchująca zdarzenia i można je ustawić na kilka różnych sposobów.

Niestety, „prawo” sposób na ogień zdarzenia nie jest takie proste, bo trzeba to zrobić w różny sposób w programie Internet Explorer (używając document.createEventObject) oraz Firefox (przy użyciu 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); 
    } 
} 
2

Cały tworzenie i wydarzenia wysyłkowe działa, ale skoro używasz atrybut onchange, twoje życie może być nieco prostsze:

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

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

Jeśli korzystasz z interfejsu API zdarzeń przeglądarki (addEventListener, IE AttachEvent itd.), Będziesz musiał tworzyć i wysyłać zdarzenia, o czym inni już wcześniej wspomnieli.

Powiązane problemy