Proszę otworzyć te przykłady na telefonie iPhone.iPhone - Zdarzenie JavaScript Dispatch - Moje menu wyboru nie zostanie otwarte w funkcji setTimeout.
Poniższy kod jest prawidłowy.
<select id="selectMenu">
<option value="1">1</option>
<option value="2">2</option>
</select>
<input id="button" name="button" type="button" value="Click Me" />
var initEvt = function (el, type) {
var e = document.createEvent('MouseEvents');
e.initEvent(type, true, true, window);
el.dispatchEvent(e);
},
selMenu;
selMenu = document.getElementById('selectMenu');
document.getElementById('button').onclick = function() {
initEvt(selMenu, 'mouseover');
initEvt(selMenu, 'mousedown');
initEvt(selMenu, 'mouseup');
initEvt(selMenu, 'click');
}
Jeśli dodać funkcję setTimeout nie będzie działać.
<select id="selectMenu">
<option value="1">1</option>
<option value="2">2</option>
</select>
<input id="button" name="button" type="button" value="Click Me" />
var initEvt = function (el, type) {
var e = document.createEvent('MouseEvents');
e.initEvent(type, true, true, window);
el.dispatchEvent(e);
},
selMenu;
selMenu = document.getElementById('selectMenu');
document.getElementById('button').onclick = function() {
setTimeout(function() {
initEvt(selMenu, 'mouseover');
initEvt(selMenu, 'mousedown');
initEvt(selMenu, 'mouseup');
initEvt(selMenu, 'click');
}, 500);
}
http://jsfiddle.net/ghwfstmj/1/
Każdy pomysł dlaczego?
Widzę również dziwny problem przewijania. Jeśli istnieją dwa wybrane menu, przewinie się do przycisku i wykona kopię zapasową, jeśli używasz natywnych (wybierz opcje) lewej i prawej strzałki. Jeśli klikniesz zrobić to tego nie robi lub kliknij je ręcznie:
select {
display: block;
width: 100%;
}
#selectMenu { margin-bottom: 50px; }
#selectMenu2 { margin-bottom: 200px; }
<select id="selectMenu">
<option value="1">1</option>
<option value="2">2</option>
</select>
<select id="selectMenu2">
<option value="1">1</option>
<option value="2">2</option>
</select>
<input id="button" name="button" type="button" value="Click Me" />
var initEvt = function (el, type) {
var e = document.createEvent('MouseEvents');
e.initEvent(type, true, true, window);
el.dispatchEvent(e);
},
selMenu;
selMenu = document.getElementById('selectMenu');
document.getElementById('button').onclick = function() {
initEvt(selMenu, 'mouseover');
initEvt(selMenu, 'mousedown');
initEvt(selMenu, 'mouseup');
initEvt(selMenu, 'click');
}
http://jsfiddle.net/ghwfstmj/4/
Cheers!
Wygląda na to, że wszystko działa dobrze. Czasomierz działa (przynajmniej z chromem). O dziwnym zachowaniu z natywnymi strzałkami w lewo, może to być tylko kwestia skupienia. Wysyłasz kliknięcie i mouseevent, ale może powinieneś wywołać nacisk na selMenu również – Bene
Wypróbuj w Safari (iPhone). Przeglądarka i emulator działają bez zarzutu. Próbowałem dodać fokus i nie miałem szczęścia. Możesz osiągnąć to samo zachowanie, jeśli dodasz tabindex i użyjesz kodu $ ("# selectMenu"). Trigger ("focus"); Oznacza to, że nie jest powiązany ze zdarzeniem aktywnym. Dodałem też dodatkowy dispatchEvent i nie miałem szczęścia :( – Paddy
Oups, mój błąd poszedłem prosto w kodzie i zapomniałem o całej części "iPhone" – Bene