键盘按键事件的fireEvent
来源:互联网 发布:mac xquartz使用 编辑:程序博客网 时间:2024/04/27 19:38
转自:http://www.cnblogs.com/Random/archive/2013/03/29/2989789.html
最近代码中有个功能需要用到手动触发键盘事件的功能,咱们的现有库对fireEvent的实现还比较单一,对键盘事件没有作支持,就自己封了一个。但键盘事件的fire在各浏览器下实现不一样,下面分别说明一下:
1. IE下没什么问题,创建事件对象、对对象的keyCode属性赋值,然后再抛出来就行了:
evtObj = document.createEventObject();
evtObj.keyCode=keyCode
el.fireEvent(
'on'
+evtType, evtObj);
2. Firefox 需要通过document.createEvent创建KeyEvents对象,再通过initKeyEvent方法对事件对象初始化
evtObj = document.createEvent(
'KeyEvents'
);
evtObj.initKeyEvent( evtType,
true
,
true
, window,
false
,
false
,
false
,
false
, keyCode, 0 );
3. Chrome/Safari/Opera
通过document.createEvent创建UIEvents对象,初始化后再在该对象上挂载按键值,Chrome和Opera可以先将keyCode属性delete掉后,再用Object.defineProperty方法重新为它赋值:
delete
evtObj.keyCode;<br>Object.defineProperty(evtObj,
"keyCode"
,{value:keyCode});
但是这里需要注意一点:Safari无法对对象的keyCode属性进行操作,强制覆盖里还会报错,解决方法是将键keyCode转为字符后挂在事件对象的key属性上:
evtObj.key=String.fromCharCode(keyCode);
通过这种方式绕开safari的坑后,在事件触发时的回调中再对keyCode进行一次适配即可:
var
keyCode=evt.keyCode || evt.key.charCodeAt(0);
最后,封装好的function大概就是这样:
function
fireKeyEvent(el, evtType, keyCode){
var
evtObj;
if
(document.createEvent){
if
( window.KeyEvent ) {
evtObj = document.createEvent(
'KeyEvents'
);
evtObj.initKeyEvent( evtType,
true
,
true
, window,
false
,
false
,
false
,
false
, keyCode, 0 );
}
else
{
evtObj = document.createEvent(
'UIEvents'
);
evtObj.initUIEvent( evtType,
true
,
true
, window, 1 );
delete
evtObj.keyCode;
if
(
typeof
evtObj.keyCode ===
"undefined"
){
Object.defineProperty(evtObj,
"keyCode"
,{value:keyCode});
}
else
{
evtObj.key=String.fromCharCode(keyCode);
}
}
el.dispatchEvent(evtObj);
}
else
if
(document.createEventObject){
evtObj = document.createEventObject();
evtObj.keyCode=keyCode;
el.fireEvent(
'on'
+evtType, evtObj);
}
}
完整事例:
<!DOCTYPE html><html lang="en"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <title>fireKeyEvent</title> </head> <body> <input type="text" id="txt1"/> <input type="button" id="btn1" value="fire"/> <script type="text/javascript"> function $(id){ return document.getElementById(id); } function addEvent(el, type, fn){ if(document.addEventListener){ el.addEventListener(type, fn, true); }else if(document.attachEvent){ el.attachEvent("on"+type, fn); }else{ el["on"+type] = fn; } } function fireKeyEvent(el, evtType, keyCode){ var evtObj; if(document.createEvent){ if( window.KeyEvent ) { evtObj = document.createEvent('KeyEvents'); evtObj.initKeyEvent( evtType, true, true, window, false, false, false, false, keyCode, 0 ); } else { evtObj = document.createEvent('UIEvents'); evtObj.initUIEvent( evtType, true, true, window, 1 ); delete evtObj.keyCode; if(typeof evtObj.keyCode === "undefined"){ Object.defineProperty(evtObj,"keyCode",{value:keyCode}); }else{ evtObj.key=String.fromCharCode(keyCode); } } el.dispatchEvent(evtObj); }else if(document.createEventObject){ evtObj = document.createEventObject(); evtObj.keyCode=keyCode el.fireEvent('on'+evtType, evtObj); } } addEvent($("txt1"), "keydown" ,function(e){ var evt=window.event || e; var keyCode=evt.keyCode || evt.key.charCodeAt(0); alert("keyCode:"+keyCode); }) addEvent($("btn1"), "click", function(){ fireKeyEvent($("txt1"), "keydown", 27); }); </script> </body></html>
0 0
- 键盘按键事件的fireEvent
- ExtJs的fireEvent事件
- ExtJs的fireEvent事件
- ExtJs的fireEvent事件
- iOS监听键盘的删除按键事件
- iOS监听键盘的删除按键事件
- [Javascript]禁用特定的键盘按键事件
- 键盘按键点击事件
- qml键盘按键事件
- 检测键盘按键事件
- 键盘按键事件
- js的object.fireEvent()触发onchange事件
- 自定义事件fireEvent和dispatchEvent的用法
- Atitit.js的键盘按键事件捆绑and事件调度
- android 模拟键盘按键事件
- 键盘return按键及事件
- Unity 模拟键盘按键事件
- 如何在程序中模拟键盘的按键事件?
- QT手动moc问题:virtual struct QMetaObject const * __thiscall Widget::metaObject
- 从源代码解读spring IOC容器
- pdf解除权限限制
- POJ2391 Floyd+离散化+二分+DINIC
- linux与windows间文件传输rz、sz命令
- 键盘按键事件的fireEvent
- 第一周 基于对象的程序设计——图书管理
- VS2012使用技巧之更改默认保存路径、查看标准头文件、常用快捷键
- OC中interface,protocol的区别
- 获得屏幕尺寸,系统动画和assets文件夹的管理
- 使用静态工厂方法的好处和坏处
- POJ2431贪心(最少加油次数)
- iOS消息推送机制的实现
- Linux使用技巧6--Ubuntu笔记本屏幕亮度调节