惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 【当耐特】
小众软件
小众软件
S
SegmentFault 最新的问题
GbyAI
GbyAI
量子位
爱范儿
爱范儿
L
LangChain Blog
Vercel News
Vercel News
A
About on SuperTechFans
腾讯CDC
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
月光博客
月光博客
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
H
Help Net Security
U
Unit 42
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
V2EX
V
Visual Studio Blog
美团技术团队
D
DataBreaches.Net
The GitHub Blog
The GitHub Blog
N
Netflix TechBlog - Medium

博客园 - 随机

10周年整 年中review Javascript 模块化开发上线解决方案 AMDJS编译工具 第三方组件接入方案(演示文稿图片) 代码打包预处理工具 manifest资源提取工具 也来山寨一版Flappy Bird (js版) 2014 todo list 2013年终总结 #1分钟删# 模块合并小工具 移动端页面前端提速的技术梳理 状态机——Javascript词法扫描示例 [整理] ES5 词法约定文档树状图 php并发请求 [转]给明年依然年轻的我们:欲望、外界、标签、天才、时间、人生目标、现实、后悔、和经历 javascript基础组件设计资料 2013 草莓音乐节妹子抓拍 [组图] 错觉
键盘按键事件的fireEvent
随机 · 2013-03-29 · via 博客园 - 随机

最近代码中有个功能需要用到手动触发键盘事件的功能,咱们的现有库对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;
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);
  }
}

完整事例: