JavaScript实现按键精灵的原理分析


Posted in Javascript onFebruary 21, 2017

最近有个需求,需要在页面上面自动点击、输入、提交。

用以模拟真实用户的操作行为,可以通过直接执行某个元素绑定的事件,来执行操作。

也可以创建事件,再派发事件,执行操作。关于事件的更多细节,可以参考《JavaScript中事件处理》

1、模拟MouseEvent中的click事件,x与y位置随机点击

2、模拟TouchEvent中的touchstart和touchmove,用scroll来做滑动效果

3、模拟FocusEvent,聚焦到屏幕中的输入框内

JavaScript实现按键精灵的原理分析

一、鼠标事件MouseEvent

MouseEvent接口指用户与指针设备( 如鼠标 )交互时发生的事件。使用此接口的常见事件包括:click,dblclick,mouseup,mousedown。

MouseEvent派生自 UIEvent,UIEvent 派生自 Event。

function random(max) {
 return Math.floor(Math.random() * max);
}
function on(dom, type, fn) {
 dom.addEventListener(type, fn, false);
}
on(document.body, 'click', function(e) {
 console.log('click事件 x:'+e.clientX, 'y:'+e.clientY);
});
/**
 * MouseEvent
 * 包括事件 click,dblclick,mouseup,mousedown
 */
function mouse() {
 var x = random(window.outerWidth),
  y = random(window.outerHeight);
 var event = new MouseEvent('click', {
  bubbles: true,
  cancelable: true,
  view: window,
  clientX: x,
  clientY: y
 });
 console.log('click环境 x:'+x, 'y:'+y);
 document.body.dispatchEvent(event);
}
mouse();

1)Event

语法如下:

JavaScript实现按键精灵的原理分析

typeArg:事件的名字,DOMString类型。

eventInit:

属性 选项 默认 类型 描述
bubbles 可选 false Boolean 事件是否冒泡
cancelable 可选 false Boolean 事件是否可取消
scoped 可选   Boolean indicating whether the given event bubbles. If this value is true, deepPath will only contain a target node.
composed 可选 false Boolean 事件是否会影子根(shadow root)之外触发侦听器。 Shadow DOM是指在文档(document)渲染时插入一棵DOM元素子树,但是这棵子树不在主DOM树中。

2)UIEvent

语法如下:

有多个事件对象直接或间接的继承了UIEvent,包括:MouseEvent, TouchEvent, FocusEvent, KeyboardEvent, WheelEvent, InputEvent和CompositionEvent。

UIEventInit:

属性 选项 默认 类型 描述
detail 可选 0 long长整型 根据事件不同意义也会不同。 对 click 或者 dblclick 事件, detail是当前点击数量; 对mousedown或者mouseup事件, detail是1加上当前点击数; 对所有的其它UIEvent对象, detail总是0。
view 可选 null WindowProxy 与事件相关联的窗口

3)MouseEvent

语法如下:

JavaScript实现按键精灵的原理分析

mouseEventInit:

属性 选项 默认 类型 描述
screenX/screenY 可选 0 long长整型 鼠标事件发生时相对于用户屏幕screen的水平/垂直坐标位置; 该操作并不会改变真实鼠标的位置。
clientX/clientY 可选 0 long长整型 鼠标事件时相对于浏览器窗口viewport的水平/垂直坐标位置,不包含滚动距离; 该操作并不会改变真实鼠标的位置。
ctrlKey 可选 false Boolean 按下了Ctrl键
shiftKey 可选 false Boolean 按下了Shift键
altKey 可选 false Boolean 按下了Alt键
metaKey 可选 false Boolean 按下了Meta键 
button 可选 0 short短整型 当事件发生时哪个按键被按下或释放; 0:左键 1:中建 2:右键
buttons 可选 0 无符号short 当事件发生时哪些按键被按下; 0:无按键按下 1:左键 2:中建 4:右键
relatedTarget 可选 null EventTarget 标明刚离开的元素 (发生在事件 mouseenter 或 mouseover); 或刚进入的元素 (发生在事件 mouseout 或 mouseleave)。
region 可选 null DOMString 点击事件影响的区域DOM的id

二、触屏事件TouchEvent

TouchEvent是一类描述手指在触摸平面(触摸屏、触摸板等)的状态变化的事件。

每个Touch对象代表一个触点; 每个触点都由其位置,大小,形状,压力大小,和目标元素描述。TouchList对象代表多个触点的一个列表。

触屏touch事件的更多细节,可以参加《触屏touch事件记录》

on(document.body, 'touchstart', function(e) {
 var touch = e.touches.item(0);
 console.log('touchstart x:' + touch.clientX, 'y:' + touch.clientY);
});
on(document.body, 'touchmove', function(e) {
 var touch = e.touches.item(0);
 console.log('touchmove x:' + touch.clientX, 'y:' + touch.clientY);
});
on(document.body, 'touchend', function(e) {
 var touch = e.changedTouches.item(0);
 console.log('touchend x:' + touch.clientX, 'y:' + touch.clientY);
});
on(window, 'scroll', function(e) {
 console.log('scroll timestamp:' + e.timeStamp);
});
/**
 * TouchEvent
 * 包括事件 touchstart,touchend,touchmove,touchcancel
 */
function touchstart(x, y, number) {
 var touch = new Touch({
 identifier: number,
 target: document.querySelector('.drag'), //随便设置的
 clientX: x,
 clientY: y
 });
 console.log('touchstart环境 x:' + x, 'y:' + y);
 var event = new TouchEvent('touchstart', {
 touches: [touch],
 targetTouches: [touch],
 changedTouches: [touch]
 });
 document.body.dispatchEvent(event); //touchstart
}
function touchmove(x, y, interval, number) {
 var touch = new Touch({
 identifier: number,
 target: document.querySelector('.drag'), //随便设置的
 clientX: x,
 clientY: y + interval
 });
 var event = new TouchEvent('touchmove', {
 touches: [touch],
 targetTouches: [touch],
 changedTouches: [touch]
 });
 document.body.dispatchEvent(event); //touchmove
}
function touch() {
 var x = random(window.outerWidth),
 y = random(window.outerHeight),
 number = 1,
 interval = 10;
 touchstart(x, y, number);
 number++;
 touchmove(x, y, interval, number);
 number++;
 interval += 10;
 touchmove(x, y, interval, number);
 number++;
 interval += 10;
 touchmove(x, y, interval, number);
 document.body.scrollTop = interval; //自动滚动
}
setTimeout(function() {
 touch();
}, 2000);

1)Touch

语法如下:

JavaScript实现按键精灵的原理分析

touchInit:

属性 选项 默认 类型 描述
identifier 必填   long长整型 一个触摸点的数字标记,唯一标识符。
target 必填   EventTarget 触点最开始被跟踪时(在 touchstart 事件中),位于的HTML元素。
clientX/clientY 可选 0 double 触摸点相对于浏览器窗口viewport的位置,不包含滚动距离,这个值会根据用户对可见视区的缩放行为而发生变化。
screenX/screenY 可选 0 double 触摸点相对于屏幕screen的位置。在IOS中与clientX/clientY属性不同,不会受到initial-scale的影响; 而在安卓中微信和UC会受之影响,而手机版chrome与红米note自带的浏览器不会被影响。
pageX/pageY 可选 0 double 和clientX/clientY属性不同,这个值是相对于整个html文档的坐标,这个值包含了垂直滚动的偏移。
radiusX/radiusY 可选 0 float 能够包围用户和触摸平面的接触面的最小椭圆的水平轴(X轴)/垂直轴(Y轴)半径。
rotationAngle 可选 0 float 以度为单位的旋转角,由radiusX和radiusY描述的正方向的椭圆; 通过顺时针旋转这个角度后,能最精确地覆盖住用户和触摸平面的接触面的角度。
force 可选 0 float 手指挤压触摸平面的压力大小,从0.0(没有压力)到1.0(设备可识别的最大压力)的浮点数。

 2)TouchEvent

语法如下:

JavaScript实现按键精灵的原理分析

touchEventInit:

属性 选项 默认 类型 描述
touches 可选 [] TouchList TouchList类型(包含了一系列Touch对象的数组),当前位于屏幕上的所有手指的列表。
targetTouches 可选 [] TouchList 与touches类似,但是增加了个过滤条件,要与第一个手指点的地方(同一个节点内)相同。
changedTouches 可选 [] TouchList 在touchstart中:列出在此次事件中新增加的触点。如果同时放下一根或两根手指,那么将与touches相同,但如果先放一根,在放第二根,那就会不同。 在touchmove中:列出和上一次事件相比较,发生了变化的触点。 在touchend中:列出离开触摸平面的触点(这些触点对应已经不接触触摸平面的手指)。
ctrlKey 可选 false Boolean 按下了Ctrl键
shiftKey 可选 false Boolean 按下了Shift键
altKey 可选 false Boolean 按下了Alt键
metaKey 可选 false Boolean 按下了Meta键

三、焦点事件FocusEvent

FocusEvent接口表示和焦点相关的事件比如 focus, blur, focusin, 和 focusout。

on(document.getElementById('txt'), 'focus', function(e) {
 //console.log(e);
 console.log('focus timestamp:' + e.timeStamp);
});
/**
 * FocusEvent
 * 包括事件 focus, blur, focusin, focusout
 */
function focus() {
 var event = new FocusEvent('focus', {
 view: window
 });
 document.getElementById('txt').dispatchEvent(event);
}
focus();

1)FocusEvent

语法如下:

JavaScript实现按键精灵的原理分析

focusEventInit:

属性

选项 默认 类型 描述 relatedTarget 可选 null EventTarget 辅助FocusEvent目标

源码查看:

http://codepen.io/strick/pen/xgNGbz

以上所述是小编给大家介绍的JavaScript实现按键精灵的原理分析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)
May 24 Javascript
浅析jQuery的链式调用之each函数
Dec 03 Javascript
Jquery下判断Id是否存在的代码
Jan 06 Javascript
html页面显示年月日时分秒和星期几的两种方式
Aug 20 Javascript
jQuery实现checkbox全选的方法
Jun 10 Javascript
JavaScript实现点击按钮切换网页背景色的方法
Oct 17 Javascript
浅谈JavaScript的内置对象和浏览器对象
Jun 03 Javascript
JS字符串按逗号和回车分隔的方法
Apr 25 Javascript
通过fastclick源码分析彻底解决tap“点透”
Dec 24 Javascript
Angular4 组件通讯方法大全(推荐)
Jul 12 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
Apr 10 Javascript
js 计数排序的实现示例(升级版)
Jan 12 Javascript
javascript 组合按键事件监听实现代码
Feb 21 #Javascript
简单谈谈gulp-changed插件
Feb 21 #Javascript
从零学习node.js之搭建http服务器(二)
Feb 21 #Javascript
jQuery动态生成不规则表格(前后端)
Feb 21 #Javascript
jquery设置css样式的多种方法(总结)
Feb 21 #Javascript
JavaScript中 this 指向问题深度解析
Feb 21 #Javascript
js return返回多个值,通过对象的属性访问方法
Feb 21 #Javascript
You might like
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
JQuery 获取和设置Select选项的代码
2010/02/07 Javascript
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
javascript 判断数组是否已包含了某个元素的函数
2010/05/30 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
js获取数组的最后一个元素
2015/04/14 Javascript
极力推荐10个短小实用的JavaScript代码段
2016/08/03 Javascript
浅析Ajax语法
2016/12/05 Javascript
Angular.js实现动态加载组件详解
2017/05/28 Javascript
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
2020/09/02 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
python发送arp欺骗攻击代码分析
2014/01/16 Python
python的urllib模块显示下载进度示例
2014/01/17 Python
Python实现的用户登录系统功能示例
2018/02/05 Python
Python FTP两个文件夹间的同步实例代码
2018/05/25 Python
python计算日期之间的放假日期
2018/06/05 Python
Python实现的爬取百度文库功能示例
2019/02/16 Python
Python爬虫程序架构和运行流程原理解析
2020/03/09 Python
Django 解决上传文件时,request.FILES为空的问题
2020/05/20 Python
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
英国最好的包装供应商:Priory Direct
2019/12/17 全球购物
大学生个人推荐信范文
2013/11/25 职场文书
中国梦团日活动总结
2014/07/07 职场文书
公司人事专员岗位职责
2014/08/11 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
导游词之金鞭溪风景区
2019/09/12 职场文书
导游词之湖北梁子湖
2019/11/07 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis
python神经网络编程之手写数字识别
2021/05/08 Python