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和ajax的关系详细介绍
Nov 29 Javascript
js二维数组定义和初始化的三种方法总结
Mar 03 Javascript
JavaScript通过元素的ID和name设置样式
Jul 08 Javascript
详解JavaScript中localStorage使用要点
Jan 13 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
Apr 17 Javascript
JavaScript判断用户名和密码不能为空的实现代码
May 16 Javascript
详解基于webpack和vue.js搭建开发环境
Apr 05 Javascript
vuejs绑定class和style样式
Apr 11 Javascript
微信小程序 setData的使用方法详解
Apr 20 Javascript
JQuery 选择器、DOM节点操作练习实例
Sep 28 jQuery
通过JS深度判断两个对象字段相同
Jun 14 Javascript
Vue中避免滥用this去读取data中数据
Mar 02 Vue.js
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+adodb+部分自定义类的php开发模式
2006/12/31 PHP
使用PHP批量生成随机用户名
2008/07/10 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
2016/09/26 Javascript
js canvas仿支付宝芝麻信用分仪表盘
2016/11/16 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
详解Vue This$Store总结
2018/12/17 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
easy_install python包安装管理工具介绍
2013/02/10 Python
Python中的高级数据结构详解
2015/03/27 Python
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
Python中的random.uniform()函数教程与实例解析
2019/03/02 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
Python实现一个带权无回置随机抽选函数的方法
2019/07/24 Python
python支付宝支付示例详解
2019/08/22 Python
python实现门限回归方式
2020/02/29 Python
Python爬虫入门教程02之笔趣阁小说爬取
2021/01/24 Python
印度在线购物网站:Paytmmall
2019/07/24 全球购物
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
C&A巴西网上商店:时尚、衣服、手机和鞋子
2020/06/07 全球购物
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
建筑工程技术应届生自荐信
2013/09/27 职场文书
教师求职信范文分享
2013/12/27 职场文书
企业环保标语
2014/06/10 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
作风建设整改方案
2014/10/27 职场文书
村干部任职承诺书
2015/01/21 职场文书
财务总监岗位职责范本
2015/04/03 职场文书
学习十八大的感悟
2015/08/11 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书
Flink 侧流输出源码示例解析
2022/09/23 Servers