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 相关文章推荐
extjs表格文本启用选择复制功能具体实现
Oct 11 Javascript
jquery+ajax请求且带返回值的代码
Aug 12 Javascript
JavaScript实现的背景自动变色代码
Oct 17 Javascript
AngularJS实现按钮提示与点击变色效果
Sep 07 Javascript
jQuery实现判断控件是否显示的方法
Jan 11 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
Jul 23 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
Aug 31 Javascript
jQuery 禁止表单用户名、密码自动填充功能
Oct 30 jQuery
Vue实现美团app的影院推荐选座功能【推荐】
Aug 29 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
Jan 08 jQuery
vue视频播放插件vue-video-player的具体使用方法
Nov 08 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
Jul 28 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应用技巧
2008/03/27 PHP
php反弹shell实现代码
2009/04/22 PHP
php遍历目录viewDir函数
2009/12/15 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
2019/09/18 PHP
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
js正则表达exec与match的区别说明
2014/01/29 Javascript
纯js写的分页表格数据为json串
2014/02/18 Javascript
Javascript中Array.prototype.map()详解
2014/10/22 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
非常酷炫的Bootstrap图片轮播动画
2016/05/27 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
View.post() 不靠谱的地方你知道多少
2017/08/29 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
2017/09/22 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
python实现百度关键词排名查询
2014/03/30 Python
python获取外网ip地址的方法总结
2015/07/02 Python
再谈Python中的字符串与字符编码(推荐)
2016/12/14 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
Python多进程编程常用方法解析
2020/03/26 Python
Python3.8安装Pygame教程步骤详解
2020/08/14 Python
python-jwt用户认证食用教学的实现方法
2021/01/19 Python
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
企划经理的岗位职责
2013/11/17 职场文书
幼儿园教师培训制度
2014/01/16 职场文书
体育个人工作总结
2015/02/09 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
会议通知范文
2015/04/15 职场文书
企业廉洁教育心得体会
2016/01/20 职场文书
CI Games宣布《堕落之王2》使用虚幻引擎5制作 预计将于2023年正式发售
2022/04/11 其他游戏
利用 Python 的 Pandas和 NumPy 库来清理数据
2022/04/13 Python