IE 下没什么问题, 创建事件对象, 对对象的 keyCode 属性赋值, 然后再抛出来就行了:
- evtObj = document.createEventObject();
- evtObj.keyCode=keyCode
- el.fireEvent('on'+evtType, evtObj);
Firefox 需要通过 document.createEvent 创建 KeyEvents 对象, 再通过 initKeyEvent 方法对事件对象初始化
- evtObj = document.createEvent('KeyEvents');
- evtObj.initKeyEvent( evtType, true, true, Windows, false, false, false, false, keyCode, 0 );
通过 document.createEvent 创建 UIEvents 对象, 初始化后再在该对象上挂载按键值.
- evtObj = document.createEvent('UIEvents');
- evtObj.initUIEvent( evtType, true, true, Windows, 1 );
Chrome 和 Opera 可以先将 keyCode 属性 delete 掉后, 再用 Object.defineProperty 方法重新为它赋值:
- delete evtObj.keyCode;
- Object.defineProperty(evtObj,"keyCode",{
- value:keyCode
- });
有些安卓浏览器, 此法无效, 需要用下面的方式:
- Object.defineProperty(evtObj, 'keyCode', {
- get : function() { return this.keyCodeVal; }
- });
- Object.defineProperty(evtObj, 'which', {
- get : function() { return this.keyCodeVal; }
- });
- evtObj.keyCodeVal = keyCode;
最后, 封装好的 function 大概就是这样:
- function fireKeyEvent(el, evtType, keyCode){
- var doc = el.ownerDocument,
- win = doc.defaultView || doc.parentWindow,
- evtObj;
- if(doc.createEvent){
- if(win.KeyEvent) {
- evtObj = doc.createEvent('KeyEvents');
- evtObj.initKeyEvent( evtType, true, true, win, false, false, false, false, keyCode, 0 );
- }
- else {
- evtObj = doc.createEvent('UIEvents');
- Object.defineProperty(evtObj, 'keyCode', {
- get : function() { return this.keyCodeVal; }
- });
- Object.defineProperty(evtObj, 'which', {
- get : function() { return this.keyCodeVal; }
- });
- evtObj.initUIEvent( evtType, true, true, win, 1 );
- evtObj.keyCodeVal = keyCode;
- if (evtObj.keyCode !== keyCode) {
- console.log("keyCode" + evtObj.keyCode + "和 (" + evtObj.which + ") 不匹配");
- }
- }
- el.dispatchEvent(evtObj);
- }
- else if(doc.createEventObject){
- evtObj = doc.createEventObject();
- evtObj.keyCode = keyCode;
- el.fireEvent('on' + evtType, evtObj);
- }
- }
使用方法: 假设模拟回车
fireKeyEvent(input 元素, 'keydown', 13);
来源: http://www.bubuko.com/infodetail-3100944.html