JavaScript"模拟事件"的注意要点详解


Posted in Javascript onFebruary 13, 2019

DOM中的事件模拟

三个步骤:

首先通过document.createEvent()方法创建event对象,接收一个参数,即表示要创建的事件类型的字符串:

  1. UIEvents(DOM3中的UIEvent)鼠标和键盘事件;
  2. MouseEvents(DOM3中的MouseEvent)鼠标事件;
  3. MutationEvents(DOM3中的MutationEvent)变动事件;
  4. HTMLEvents(没有DOM3中对应的事件)HTML事件;

其次在创建了event对象之后,还需要使用与事件有关的信息对其进行初始化。每种类型的event对象都有一个特殊的方法,为它传入适当的数据就可以初始化该event对象。用event.init......()此类行的方法。

最后就是触发事件。这需要使用dispatchEvent()方法,接收一个参数,即表示要触发的event对象。

模拟鼠标事件

首先创建鼠标事件对象的方法createEvent()传入MouseEvents,返回的对象的方法initMouseEvent(),接收15个信息:

  1. type(字符串):事件类型如“click”;
  2. bubble(布尔值):是否冒泡;
  3. cancelable(布尔值):是否可取消;
  4. view(AbstractView):与事件关联的视图,一般为document.defaultView
  5. detail(整数):一般为0,一般只有事件处理程序使用;
  6. screenX(整数):事件相对于屏幕的X坐标;
  7. screenY(整数);
  8. clientX(整数):事件相对于视口的X坐标;
  9. clientY(整数);
  10. ctrlKey(布尔值):是否按下了Ctrl键,默认为false;
  11. altKey(布尔值);
  12. shiftKey(布尔值);
  13. metaKey(布尔值);
  14. button(整数):表示按下了哪个鼠标键,默认为0;
  15. relatedTarget(对象):表示与事件相关的对象。一般只有在模拟mouseover与mouseout时使用。

最后记得把event对象传给dispatchEvent()方法。

如模拟按钮的单击事件:

//模拟click事件
//获取btn
var btn = document.querySelector("#btn");
//创建event
var event = document.createEvent("MouseEvents");
//初始化event
event.initMouseEvent("click",true,true,document.defaultView,0,0,0,0,0,false,false,false,false,0,null);
//click事件绑定事件处理程序
btn.onclick = function () {
  console.log("hello");
}
//触发事件
btn.dispatchEvent(event); //hello
//取消引用
btn.onclick = null;

另外,建议使用构造函数"MouseEvent":

var evt = new MouseEvent("click", {
  bubbles: true,
  cancelable: true,
  view: window
});

模拟键盘事件

首先创建鼠标事件对象的方法createEvent()传入KeyboardEvents,返回的对象的方法initKeyEvent(),接收下面参数:

  1. type(字符串):要触发的事件类型,“keydown”等;
  2. bubbles(布尔值):表示事件是否应该冒泡;
  3. cancelable(布尔值):是否可以取消;
  4. view(AbstractView):与事件关联的视图。一般为document.defaultView
  5. key(布尔值):表示按下的键的键码;
  6. location(整数):表示按下哪里的键。0为主键盘;1为左;2为右;3为数字键盘;4为虚拟键盘;5为手柄;
  7. modifiers(字符串):空格分隔的修改键列表,如“shift”;
  8. repeat(整数):在一行中按下了多少次这个键;

由于DOM3级不提倡使用keypress事件,因此只能利用这种技术来模拟keydown和keyup事件:

var textbox = document.querySelector("#myTextBox");
var event = document.createEvent("KeyboardEvent");
event.initKeyboardEvent("keydown",true,true,document.defaultView,"a",0,"Shift",0);
textbox.dispatchEvent(event);

在Firefox中,调用createEvent()并传入“KeyEvents”就可以创建一个键盘事件,返回的事件对象会包含一个initKeyEvent()方法,接收参数:

  1. type;
  2. bubbles;
  3. cancelable;
  4. view;
  5. ctrlKey;
  6. altKey;
  7. shiftKey;
  8. metaKey;
  9. keyCode;
  10. charCode;

另外,建议使用构造函数“KeyboardEvent”

模拟其他事件

浏览器中很少使用变动事件和HTML事件;要模拟变动事件,可以用createEvent("MutationEvent");initMutationEvent();要模拟HTML事件,可以用createEvent("HTMLEvents");initEvent();

自定义DOM事件

用createEvent("CustomEvent");initCustomEvent()方法,接收参数:type;bubbles;cancelable;detail;

var btn = document.querySelector("#btn");
var evt = document.createEvent("CustomEvent");
evt.initCustomEvent("click",true,true,"Hello there");
btn.onclick = function () {
  console.log(event.detail);
};
btn.dispatchEvent(evt);

IE中的事件模拟

调用document.createEventObject()方法,创建event对象,并指定必要的信息,最后在目标上调用fireEvent()方法,接收两个参数:事件处理程序名称和event对象:

var btn = document.querySelector("#btn");
var evt = document.createEventObject();
evt.screenX = 0;
evt.screenY = 0;
evt.clientX = 0;
evt.clientY = 0;
evt.ctrlKey = false;
evt.altKey = false;
evt.shiftKey = false;
evt.button = 0;
btn.fireEvent("onclick",evt);

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Javascript 相关文章推荐
javascript function、指针及内置对象
Feb 19 Javascript
JS trim去空格的最佳实践
Oct 30 Javascript
js模拟滚动条(横向竖向)
Feb 22 Javascript
jQuery制作仿腾讯web qq用户体验桌面
Aug 20 Javascript
jquery利用拖拽方式在图片上添加热链接
Nov 24 Javascript
对象转换为原始值的实现方法
Jun 06 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
Aug 01 Javascript
JS实现简单易用的手机端浮动窗口显示效果
Sep 07 Javascript
js实现微博发布小功能
Jan 12 Javascript
利用node.js制作命令行工具方法教程(一)
Jun 22 Javascript
vue 使用Jade模板写html,stylus写css的方法
Feb 23 Javascript
js实现单元格拖拽效果
Feb 10 Javascript
快速了解Node中的Stream流是什么
Feb 13 #Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
Feb 13 #Javascript
vue实现点击隐藏与显示实例分享
Feb 13 #Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
Feb 13 #Javascript
JavaScript实现的拼图算法分析
Feb 13 #Javascript
推荐15个最好用的JavaScript代码压缩工具
Feb 13 #Javascript
Vue中CSS动画原理的实现
Feb 13 #Javascript
You might like
简单的php写入数据库类代码分享
2011/07/26 PHP
php获取数组中重复数据的两种方法
2013/06/28 PHP
php引用传值实例详解学习
2013/11/06 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
JavaScript 无符号右移赋值操作
2009/04/17 Javascript
基于JQuery的访问WebService的代码(可访问Java[Xfire])
2010/11/19 Javascript
jquery随机展示头像代码
2011/12/21 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
html页面显示年月日时分秒和星期几的两种方式
2013/08/20 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
理解JavaScript中Promise的使用
2016/01/18 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
Bootstrap模态框(Modal)实现过渡效果
2017/03/17 Javascript
微信小程序自定义导航隐藏和显示功能
2017/06/13 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
2018/01/03 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
node后端服务保活的实现
2019/11/10 Javascript
jQuery实现的图片点击放大缩小功能案例
2020/01/02 jQuery
在Python的Django框架中更新数据库数据的方法
2015/07/17 Python
Python微信库:itchat的用法详解
2017/08/14 Python
你真的了解Python的random模块吗?
2017/12/12 Python
提升python处理速度原理及方法实例
2019/12/25 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
Python Tkinter图形工具使用方法及实例解析
2020/06/15 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
2021/03/02 Python
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
澳大利亚音乐商店:Bava’s Music City
2019/05/05 全球购物
环境科学专业教师求职信
2014/07/12 职场文书
投资合作意向书范本
2015/05/08 职场文书
Mysql 一主多从的部署
2022/05/20 MySQL