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 相关文章推荐
用javascript来实现动画导航效果的代码
Dec 16 Javascript
escape、encodeURI 和 encodeURIComponent 的区别
Mar 02 Javascript
js加载之使用DOM方法动态加载Javascript文件
Nov 08 Javascript
js写的评论分页(还不错)
Dec 23 Javascript
使用CSS3的scale实现网页整体缩放
Mar 18 Javascript
JavaScript中对循环语句的优化技巧深入探讨
Jun 06 Javascript
原生javascript实现的一个简单动画效果
Mar 30 Javascript
jquery实现表格中点击相应行变色功能效果【实例代码】
May 09 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
Nov 28 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
Jun 11 Javascript
JavaScript canvas实现雨滴特效
Jan 10 Javascript
Vue图片裁剪组件实例代码
Jul 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
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
php array的学习笔记
2012/05/16 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
PHP中数据库单例模式的实现代码分享
2014/08/21 PHP
PHP使用memcache缓存技术提高响应速度的方法
2014/12/26 PHP
php动态生成版权所有信息的方法
2015/03/24 PHP
laravel 操作数据库常用函数的返回值方法
2019/10/11 PHP
php实现微信和支付宝支付的示例代码
2020/08/11 PHP
jquery tab插件精简版分享
2011/09/10 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
jQuery对象的length属性用法实例
2014/12/27 Javascript
jquery任意位置浮动固定层插件用法实例
2015/05/29 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
使用 Node.js 模拟滑动拼图验证码操作的示例代码
2017/11/02 Javascript
Angular resolve基础用法详解
2018/10/03 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
Node.js API详解之 net模块实例分析
2020/05/18 Javascript
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
浅谈Python 对象内存占用
2016/07/15 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
2017/05/08 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
购买200个世界上最好的内衣品牌:Bare Necessities
2017/02/11 全球购物
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
游戏商店:Eneba
2020/04/25 全球购物
平民服装店创业计划书
2014/01/17 职场文书
群众路线教育实践活动心得体会
2014/03/07 职场文书
企业指导教师评语
2014/04/28 职场文书
人大调研汇报材料
2014/08/14 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
现实表现材料范文
2014/12/23 职场文书
茶楼服务员岗位职责
2015/02/09 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
Go各时间字符串使用解析
2021/04/02 Golang
linux下导入、导出mysql数据库命令的实现方法
2021/05/26 MySQL
python在package下继续嵌套一个package
2022/04/14 Python