Javascript高级编程学习笔记(71)—— 模拟事件(1)DOM事件模拟
事件,指的是网页中某个特定的交互时刻
一般来说事件由浏览器厂商负责提供,一般由用户操作或者其它浏览器功能来触发
但是有一类特殊的事件,那就是由我们开发人员通过JS触发的事件
这些事件和浏览器创建的事件一样,都可以冒泡,并且在其触发时运行事先指定给它的事件处理程序
在测试web程序的过程中这种模拟触发事件是一种极其有用的技术,为此DOM2级规范将其纳入规范
规范化了模拟事件的方式,这种DOM规范规定的模拟事件的技术手段也叫做DOM事件模拟
PS:模拟事件和自定义事件是有区别的,模拟事件指的是我们并不去真的触发浏览器中的事件,而是用代码去触发事件来模拟事件发生的情况。 而自定义事件不过是模拟事件中的一种罢了
DOM事件模拟
首先我们知道事件处理程序和一般的函数的区别就在于,事件处理程序的函数在事件触发时会传入一个 event 事件对象
那么要模拟事件首先就需要创建 event 事件对象
创建事件对象我们可以调用 document 上的 createEvent()方法创建 event 事件对象
该方法接收一个参数,用于表示要创建的事件的类型
在DOM2级规范中这些字符串都使用英文复数形式,而在DOM3中这些字符串都变成了单数形式
以DOM2级规范为例,该函数的参数可以是以下几个字符串之一:
- UIEvents:一般的UI事件,鼠标事件和键盘事件都继承自UI事件
- MouseEvents:一般的鼠标事件
- MutationEvents:一般的DOM变动事件
- HTMLEvents:一般的HTML事件(DOM3中没有对应的值,DOM3中HTML事件被拆分到了其它类别中)
在创建了 event 对象之后,还需使用与事件有关的信息才能对其进行初始化,对于不同类型的 event 对象有不同的方法来对其进行初始化(取决于createEvent()方法传入的参数)
初始化完成后,我们就只需要在代码中我们希望的位置触发即可
触发时我们需要在DOM元素上调用 dispatchEvent()方法(该方法得到所有能够触发事件的元素支持),此时需要传入我们之前创建的 event 对象作为该方法的参数
这样我们模拟的事件就像官方的事件那样能够冒泡,并且触发相应的事件处理程序了
模拟鼠标事件
创建新的鼠标事件并为其指定必要信息就可以模拟鼠标事件
这里需要详细讲的是初始化事件对象
我们在得到 createEvent 方法创建的 MouseEvent 事件对象后,该对象上有一个方法:
initMouseEvent()
该方法接收15个参数以此对应正常的浏览器事件中的鼠标事件的事件对象:
- type(字符串):表示触发鼠标事件的具体类型,如“click”
- bubbles(布尔值):表示该事件是否冒泡,为准确模拟鼠标事件应该为 true
- cancelable(布尔值):表示该事件是否可以取消,为准确模拟应为 true
- view(AbstractView):与事件关联的视图,应该设置为 document.defaultView
- detail(整数):与事件有关的详细信息,此处应该设为0
- screenX(整数):相对于屏幕的X坐标
- screenY(整数):相对于屏幕的Y坐标
- clientX(整数):相对于视口的X坐标
- clientY(整数):相对于视口的Y坐标
- ctrlKey(布尔值):表示是否按下ctrl,默认false
- altKey(布尔值):表示是否按下alt,默认false
- shiftKey(布尔值):表示是否按下shift键,默认false
- metaKey(布尔值):表示是否按下meta键,默认false
- button(整数):表示按下哪一个鼠标键
- relatedTarget(元素):表示与当前事件关联的元素对象,该参数只在模拟mouseover或mouseout时使用
由于是在希望触发的元素上调用 dispatchEvent(),所以 tartget 属性会自动传入
代码如下:
var btn = document.getElementById('myButton');
//创建事件对象
var event = document.createEvent('MouseEvents');//DOM3不用s
//初始化事件对象
event.initMouseEvent("click",true,true,document.defaultView,0,0,0,0,false,false,false,false,0,null);
//触发事件
btn,dispatchEvent(event);
这样就完成了一个鼠标事件的模拟
模拟键盘事件
键盘事件在DOM3中正式纳入规范,所以这里只介绍DOM3中的模拟键盘事件
与模拟鼠标事件的区别在于
- 传入的事件类型字符串为:KeyboardEvent
- 事件包含的初始化方法为:initKeyEvent
initKeyEvent接收的参数如下:
- type(字符串):表示要触发的事件类型,如“keydown”
- bubbles(布尔值):表示事件是否应该冒泡,准确模拟应该为 true
- cancelable(布尔值):表示事件是否可以取消,准确模拟应为 true
- view(AbstractView):一般来说为 document.defaultView
- key(字符串):按下键的键码
- location(整数):表示按下了哪里的键,0默认主键盘,1左,2右,3数字键盘,4移动设备,5手柄
- modifiers(字符串):空格分隔的修改键列表如”Shift Ctrl“
- repeat(整数):在一行中按了这个键多少次
var event = document.createEvent('KeyboardEvent');
//初始化事件对象
event.initKeyboardEvent('keydown',true,true,document.defaultView,"a",0,"Shit ",0);
//触发事件
btn.dispatchEvent(event);
要注意的是火狐中模拟键盘事件和标准DOM中有所不同
- 事件类型参数:”KeyEvents“
- 初始化方法:initKeyEvent()
- 初始化方法的参数:从第五个开始不同
- ctrlKey:表示是否按下 ctrl键
- altKey:表示是否按下alt键
- shiftKey:表示是否按下shift
- metaKey:表示是否按下meta
- keyCode(整数):被按下键的键码
- charCode(整数):通过按键生成字符的ASCLL码
模拟变动事件
初始化参数为:
- type
- bubbles
- cancelable
- relatedNode:关联的DOM节点
- preValue:变动前的值
- newValue:变动后的值
- attrName:特姓名
- attrChange:特性变动
示例如下:
var event = document.createEvent("MutationEvents");
event.initMutationEvent("DOMNodeInserted",true,false,someNode,"","","",0);
target.dispatchEvent(event);
模拟HTML事件
以focus事件为例:
var event =document.createElement('HTMLEvents');
event.initEvent("focus",true,false);
target.dispatchEvent(event);
自定义事件
除了向上面那样模拟浏览器事件之外,我们也可以创建自己的自定义事件
与浏览器事件的区别在于,初始化事件不同
自定义事件的初始化方法为:initCustomEvent
接收以下参数:
- type:触发事件的类型
- bubbles:是否冒泡
- cancelable:是否可以取消
- detail(对象):可以是任意值
示例如下:
var event = document.createEvent("CustomEvent");
event.initCustomEvent("myEvent",true,false,"hello");
target.dispatchEvent(event);
像上面这样冒泡的自定义事件是可以其它元素指定针对该自定义事件的事件处理程序的
如:
document.addEventListener("myEvent",function(event){
console.log(event.detail);
},false);
Javascript高级编程学习笔记(71)—— 模拟事件(1)DOM事件模拟的更多相关文章
- Javascript高级编程学习笔记(69)—— 事件(13)触摸与手势事件
触摸与手势事件 由于移动设备既没有鼠标也没有键盘,所以在为移动浏览器开发交互性网页时,常规的鼠标键盘事件根本不够用 所以早期的苹果为Safari 添加了一些与触摸相关的事件 随着后面Android的W ...
- Javascript高级编程学习笔记(72)—— 模拟事件(2)IE事件模拟
IE中的事件模拟 低版本的IE浏览器作为前端开发的一股清流,想避过都不行 虽然低版本IE正在逐步被市场淘汰,不得不承认IE8以下的浏览器依然占了不小的份额 所以这里大概介绍IE8以下的低版本IE中的事 ...
- Javascript高级编程学习笔记(57)—— 事件(1)事件流
事件 JS与HTML的交互是通过事件实现的 而事件指的就是:文档或浏览器窗口特定的交互瞬间 可以通过侦听器来预定事件,以便在事件发生时执行相应的代码 这种模式也是设计模式中的观察者模式 事件流 有了事 ...
- Javascript高级编程学习笔记(67)—— 事件(11)HTML5事件
DOM规范没有涵盖所有浏览器支持的所有事件 而许多浏览器出于满足用户需求,或解决特殊问题的目的,实现了一些自定义事件 HTML5列出了浏览器应该支持的所有事件,这里只讨论得到浏览器完善支持的事件(并非 ...
- Javascript高级编程学习笔记(70)—— 事件(14)内存和性能
由于事件处理程序是现代的web程序交互能力的提供者 所以在日常实践中,我们免不了要向页面中添加大量的事件处理程序(不管是用于用户交互还是用于统计用户数据) 在创建GUI(图形用户界面)的语言(如C#) ...
- Javascript高级编程学习笔记(68)—— 事件(12)设备事件
设备事件 随着智能手机与平板电脑的普及,为了更好地让用户与这些设备进行交互 浏览器引入了一种新的方式,而一类新的事件也应运而生,这就是设备事件 W3C从2011年开始制定关于设备事件的草案 下面将会介 ...
- Javascript高级编程学习笔记(66)—— 事件(10)变动事件
变动事件 DOM2级的变动事件,能在DOM中的一部分发生变化时给出提示 变动事件是为XML或HTML DOM 设计的,并不特定于某种语言 DOM2级定义了如下变动事件: DOMSubtreeModif ...
- Javascript高级编程学习笔记(64)—— 事件(8)键盘与文本事件
键盘与文本事件 用户在使用键盘时会触发键盘事件 “DOM2级事件”最初规定了键盘事件,但是最后在定稿时又删除了相应内容 所以键盘事件被放入了DOM3级事件的规范中 总的来说有三个键盘事件: keydo ...
- Javascript高级编程学习笔记(63)—— 事件(7)鼠标及滚轮事件
鼠标与滚轮事件 鼠标事件是web开发中最常用的一类事件,毕竟鼠标是最主要的定位设备 DOM3级事件中定义了9个鼠标事件: click:在用户单击主鼠标按钮(一般为鼠标左键)或者按下回车时触发,这一点对 ...
随机推荐
- tiny4412--linux驱动学习(1)
1,概述 linux设备驱动分为三种:字符驱动设备.块驱动设备.网络设备 架构: 1,字符设备驱动 是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符 ...
- Swoole 心跳检测
Swoole的心跳检测特别简单,只需要配置 heartbeat_check_interval,heartbeat_idle_time就可以了. heartbeat_check_interval:表示服 ...
- 20175325 MyCP (课下作业,必做)
20175325 MyCP (课下作业,必做) 一.目录: 题目 设计思路 运行结果 码云链接 二.题目 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两 ...
- vue项目中编写一个图片预览的公用组件
今天产品提出了一个查看影像的功能需求. 在查看单据的列表中,有一列是影像字段,一开始根据单据号调用接口查看是否有图片附件,如果有则弹出一个全屏的弹出层,如果没有给出提示.而且,从列表进入详情之后,附件 ...
- WIN10 安装 ReportBuilder3.msi 提示需要 .NET Framework 4.5
win+r键调出运行窗口输入regedit打开注册表,找到HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/NET Framework Setup/NDP/v4/Client ...
- “天龙八步”细说浏览器输入URL后发生了什么
本文摘要: 1.DNS域名解析: 2.建立TCP连接: 3.发送HTTP请求: 4.服务器处理请求: 5.返回响应结果: 6.关闭TCP连接: 7.浏览器解析HTML: 8.浏览器布局渲染: 总结 输 ...
- java中的 java.util.concurrent.locks.ReentrantLock类的使用方式
实现了lock的类为:ReentrantLock 接口的方式解释: lock()方法为获取锁对象,如果未获取到锁就一直获取锁. trylock():为布尔值,返回是否获取到了锁,如果没有获取到锁则返回 ...
- 本地文件程序脚本上传linux系统中文乱码问题
# 使用notepad++ 编辑器打开,转换一下格式保存,然后上传即可
- Core DES加、解密
安装 Portable.BouncyCastle Nuget包 地址:https://www.nuget.org/packages/Portable.BouncyCastle/ Install-Pac ...
- PNP的学习-P3P
PNP方法是为了解决在当前两帧图像中,已知前一帧图像上的3dLandmark点和当前帧的2d特征点,求取当前帧的pose. PNP主要有P3P.EPNP.UPNP.DLT.MRE(LS Iterati ...