提问:

键盘默认事件,比如tab切换,alt+f4关闭,ctrl+t新建等,如果不想通过键盘而是一些按钮点击来触发这些功能,该咋办呢?

例子:

先以tab为例上一个小例子:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>触发键盘默认事件</title>
</head>
<body>
<div>
<input type="button" tabindex="-1" value="点点点点点" id="btn">
<input type="text" placeholder="1">
<input type="text" placeholder="2">
<input type="text" placeholder="3">
<input type="text" placeholder="4">
<input type="text" placeholder="5">
<input type="text" placeholder="6">
</div>
<script> // 当前获取焦点的元素
var nowEle=document;
// 需要焦点切换的元素
var inputs=[].slice.call(document.querySelectorAll("[type=text]")); // 只添加获取焦点事件
// 放弃失去焦点事件 -- 需要判断失去后焦点被谁获得,太麻烦
inputs.forEach(function(el,i){
el.onfocus=function(){
nowEle=this;
};
/*el.onblur=function(){
setTimeout(function() {
nowEle=document;
}, 0);
};*/
}); // !!! 关键部分,事件模拟 !!!
btn.onclick=function(ev){
// console.log(nowEle);
var e=document.createEvent("KeyboardEvents");
e.initKeyboardEvent("keydown",true,true,window,"U+0009"); // tab
if(nowEle==inputs[inputs.length-1])nowEle=document;
nowEle.focus && nowEle.focus();
nowEle.dispatchEvent(e);
// console.log(e);
};
/*document.onkeydown=function(ev){
// console.log(ev.keyCode,ev.which,ev);
};*/ // input获取焦点:tab切换和鼠标点击
// 这里处理鼠标点击获取焦点
document.addEventListener("click",function(ev){
for (var i = 0; i < inputs.length; i++) {
if(inputs[i]==ev.target || btn==ev.target)return;
};
nowEle=document;
},false); </script>
</body>
</html>

介绍:

实际效果:模拟tab事件在指定范围内移动焦点,点击按钮,使焦点在6个input标签里切换。

主逻辑为:通过键盘事件和点击事件(焦点的两种获取方式)找到当前获取焦点的元素,通过按钮点击来模拟键盘的tab按钮。

技术难点:键盘事件模拟,以及找到正确的事件触发者。

难点:

模拟键盘事件:

var e=document.createEvent("KeyboardEvents");
e.initKeyboardEvent("keydown",true,true,window,"U+0009"); // tab
if(nowEle==inputs[inputs.length-1])nowEle=document;
nowEle.focus && nowEle.focus();
nowEle.dispatchEvent(e);

1.document.createEvent

DOM3 新方法,创建事件,参考资料:浅谈Javascript事件模拟

2.e.initKeyboardEvent

设置事件参数,参考资料:WebKit 内核浏览器 initKeyboardEvent 函数原型

3.nowEle.dispatchEvent(e)

指定事件对象。

收获:

源自一个讨论群里的小问题,有点感兴趣就查了查,写了个小demo,看来JavaScript里还有很多东西要去挖掘,前端大路漫漫。

 

JS模拟键盘事件 -- 原理及小例子的更多相关文章

  1. 初识 jquery.simulate.js 模拟键盘事件

    用jquery 和 jquery.simulate.js 实现模拟键盘事件,点击上下左右div相当于点击键盘的上下左右键 <!DOCTYPE html> <html> < ...

  2. js模拟键盘事件

    <!DOCTYPE html> <html> <head lang="zh-CN"> <meta charset="UTF-8& ...

  3. JavaScript 模拟键盘事件

    JavaScript 模拟键盘事件和鼠标事件(比如模拟按下回车等) 2016年09月08日 15:23:25 神秘_博士 阅读数:41158 标签: javascript鼠标键盘事件模拟更多 个人分类 ...

  4. selenium 模拟键盘事件 复制粘贴、右键、回车等

    #coding=utf-8 ''' selenium ''' from selenium import webdriver as wd import time bc=wd.Chrome(executa ...

  5. js/jquery键盘事件及keycode大全

    js/jquery的键盘事件分为keypress.keydown和keyup事件 一.键盘事件 1.keydown()事件当按钮被按下时,发生 keydown 事件. 2.keypress()事件ke ...

  6. 使用jquery模拟键盘事件,但window系统并不会真的响应事件,只是浏览器当前页面会响应而已

    <!DOCTYPE html> <html> <head> <title>Demo</title> <meta http-equiv= ...

  7. js模拟触发事件

     html标签元素封装着实用的[事件],但在很多时候,需要[模拟触发事件],比如 [按钮单机事件]  可以实实在在点击按钮触发该事件,但体验而言,很多时候需要js逻辑处理让实现 触发事件的效果这时就用 ...

  8. js浏览器键盘事件控制(转自新浪微博)

    js键盘事件全面控制 主要分四个部分第一部分:浏览器的按键事件第二部分:兼容浏览器第三部分:代码实现和优化第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件类型 ...

  9. JS获取键盘事件

    <script type="text/javascript" language=JavaScript charset="UTF-8"> docume ...

随机推荐

  1. 转:Twitter.com在用哪些Javascript框架?

    原文来自于:http://blog.jobbole.com/63964/ 我一直在研究twitter.com使用的一些UI框架.下面是这些框架的清单(大部分是Javascript框架).如果你发现有些 ...

  2. c++ 高效文本读写

    上数据结构课,做project,数据老师要求我们多做测试,而文本文件可以有效记录这些东东,这样我想起了文件的读写,下面是渣渣我个人的一些想法,大神们看见有错的,尽管指出(orz~~~囧,木有人看我的呀 ...

  3. windows 查看文件被哪个进程占用

    经常当我们删除文件时,有时会提示[操作无法完成,因为文件已在另一个程序中打开,请关闭该文件并重试],到底是哪些程序呢? 有时候一个一个找真不是办法,已经被这个问题折磨很久了,今天下决心要把它解决,找到 ...

  4. 2013第38周日Java文件上传下载收集思考

    2013第38周日Java文件上传&下载收集思考 感觉文件上传及下载操作很常用,之前简单搜集过一些东西,没有及时学习总结,现在基本没啥印象了,今天就再次学习下,记录下自己目前知识背景下对该类问 ...

  5. mongodb sort limit和skip用法

    > db.mediaCollection.find().skip().toArray() [ { "_id" : ObjectId("5353463193efef0 ...

  6. HP DL160 Gen9服务器集群部署文档

    HP DL160 Gen9服务器集群部署文档 硬件配置=======================================================Server        Memo ...

  7. Java[3] Java多线程相关资料

    Java多线程: http://www.uml.org.cn/j2ee/201509093.asp

  8. MongoDB的数据类型

    最近在写一个lua的MongoDB模块.MongoDB版本3.2,lua则是5.3.1.底层以C++来写,再把函数暴露给lua调用.但是在lua中打印结果时,发现了些奇怪的现象.首先,数据库中的内容: ...

  9. Windows下oracle打补丁步骤

    1.Oracle官网下载对应的补丁文件(需要oracle支持账号才能下载) 2.设置ORACLE_HOME set oracle_home=F:\oracle\product\11.2.0\dbhom ...

  10. DB2完美卸载

    会安装,也要会卸载.详细的安装说明不多,我这个我觉得写得还算全.  准备工作.      1.用 ps -ef|grep db2 找出db2安装目录      2. ./db2level 查出DB2的 ...