2011-02-07 88 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

奇怪的原因,确实如此。小心解释,以便我们建议替代? :) – 2011-02-07 15:25:46

回答

2

这适用于大多数现代浏览器。这是从雅虎UI库与一对夫妇的编辑: 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); 
相关问题