2011-02-07 4 views
4

По странным причинам я должен изменить выбранный элемент в выпадающем списке не через e.selectedIndex, а через симуляцию событий мыши и нажатия клавиш.Сжатие клавиши со стрелкой в ​​окне выбора с помощью javascript

Я попробовал следующее:

//e = the dropdown 
e.focus(); 

//my custom function to fire mouse events. This opens the dropdown.  
fireMouseEvent("mousedown", e); 

//firing the key press, tried it via keydown, keypress and keyup. Nothing works. 
var evt = e.ownerDocument.createEvent("KeyEvents"); 
evt.initKeyEvent("keydown", true, true, null, false, false, false, false, 40, 0); 
evt.initKeyEvent("keypress", true, true, null, false, false, false, false, 40, 0); 
evt.initKeyEvent("keyup", true, true, null, false, false, false, false, 40, 40); 

e.dispatchEvent(evt); 

я делаю что-то неправильно, или это невозможно?

спасибо.

+0

Странные причины действительно. Постарайтесь объяснить, чтобы, возможно, мы предложили альтернативу? :) –

+0

Кажется, что вы можете установить selectedIndex, а затем вызвать события, которые необходимы. –

+0

Посмотрите это, если вы используете хром (объясняет, почему это невозможно): http://stackoverflow.com/questions/1897333/firing-a-keyboard-event-on-chrome –

ответ

2

Это работает для меня в большинстве современных браузеров. Это от Yahoo UI Library с парой правок: http://developer.yahoo.com/yui/docs/UserAction.js.html

var customEvent; 
var type = 'keydown'; 
var bubbles = true; 
var cancelable = true; 
var view = window; 
var ctrlKey = false; 
var altKey = false; 
var shiftKey = false; 
var metaKey = false; 
var keyCode = 40; 
var charCode = 40; 

try { 

    //try to create key event 
    customEvent = document.createEvent("KeyEvents"); 

    /* 
    * Interesting problem: Firefox implemented a non-standard 
    * version of initKeyEvent() based on DOM Level 2 specs. 
    * Key event was removed from DOM Level 2 and re-introduced 
    * in DOM Level 3 with a different interface. Firefox is the 
    * only browser with any implementation of Key Events, so for 
    * now, assume it's Firefox if the above line doesn't error. 
    */ 
    //TODO: Decipher between Firefox's implementation and a correct one. 
    customEvent.initKeyEvent(type, bubbles, cancelable, view, ctrlKey, 
     altKey, shiftKey, metaKey, keyCode, charCode);  

} catch (ex /*:Error*/){ 

    /* 
    * If it got here, that means key events aren't officially supported. 
    * Safari/WebKit is a real problem now. WebKit 522 won't let you 
    * set keyCode, charCode, or other properties if you use a 
    * UIEvent, so we first must try to create a generic event. The 
    * fun part is that this will throw an error on Safari 2.x. The 
    * end result is that we need another try...catch statement just to 
    * deal with this mess. 
    */ 
    try { 

     //try to create generic event - will fail in Safari 2.x 
     customEvent = document.createEvent("Events"); 

    } catch (uierror /*:Error*/){ 

     //the above failed, so create a UIEvent for Safari 2.x 
     customEvent = document.createEvent("UIEvents"); 

    } finally { 

     customEvent.initEvent(type, bubbles, cancelable); 

     //initialize 
     customEvent.view = view; 
     customEvent.altKey = altKey; 
     customEvent.ctrlKey = ctrlKey; 
     customEvent.shiftKey = shiftKey; 
     customEvent.metaKey = metaKey; 
     customEvent.keyCode = keyCode; 
     customEvent.charCode = charCode; 

    }   

} 

//fire the event 
document.dispatchEvent(customEvent); 
Смежные вопросы