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 相关文章推荐
jQuery 1.2.x 升? 1.3.x 注意事项
May 06 Javascript
jQuery TextBox自动完成条
Jul 22 Javascript
JS限制Textarea文本域字符个数的具体实现
Aug 02 Javascript
js function定义函数的几种不错方法
Feb 27 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
Sep 28 Javascript
js 实现一些跨浏览器的事件方法详解及实例
Oct 27 Javascript
JS判断是否手机或pad访问实现方法
Dec 09 Javascript
js实现百度搜索提示框
Feb 05 Javascript
详解RequireJS按需加载样式文件
Apr 12 Javascript
微信小程序如何获知用户运行小程序的场景教程
May 17 Javascript
详解layui弹窗父子窗口之间传参数的方法
Jan 16 Javascript
vue 在单页面应用里使用二级套嵌路由
Dec 19 Vue.js
快速了解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
一条久听不愿放下的DIY森海MX500,三言两语话神奇
2021/03/02 无线电
分享十款最出色的PHP安全开发库中文详细介绍
2015/03/22 PHP
PHP检测用户是否关闭浏览器的方法
2016/02/14 PHP
自制PHP框架之路由与控制器
2017/05/07 PHP
PHP crc32()函数讲解
2019/02/14 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
js登录弹出层特效
2014/03/07 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
Vue 2中ref属性的使用方法及注意事项
2017/06/12 Javascript
谈谈VUE种methods watch和compute的区别和联系
2017/08/01 Javascript
详解Layer弹出层样式
2017/08/21 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
Node.js实现简单的爬取的示例代码
2019/06/25 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
javascript中layim之查找好友查找群组
2021/02/06 Javascript
Python Socket编程详细介绍
2017/03/23 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
整理HTML5中支持的URL编码与字符编码
2016/02/23 HTML / CSS
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
海滩咖啡馆:Beach Cafe
2018/02/02 全球购物
澳大利亚最大的在线美发和美容零售商之一:My Hair Care & Beauty
2019/08/24 全球购物
SQL面试题
2013/04/30 面试题
文明礼仪事迹材料
2014/01/09 职场文书
年度献血先进个人事迹材料
2014/02/14 职场文书
《桂花雨》教学反思
2014/04/12 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
长江三峡导游词
2015/01/31 职场文书
个人年底工作总结
2015/03/10 职场文书
导游词之泰山玉皇顶
2019/12/23 职场文书
JavaScript 语句之常用 for 循环详解
2021/03/29 Javascript
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL