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 相关文章推荐
使用GruntJS构建Web程序之Tasks(任务)篇
Jun 06 Javascript
JavaScript组件焦点与页内锚点间传值的方法
Feb 02 Javascript
js实现TAB切换对应不同颜色的代码
Aug 31 Javascript
jQuery实现图片走马灯效果的原理分析
Jan 16 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
Mar 01 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
Jun 05 Javascript
JS 60秒后重新发送验证码的实例讲解
Jul 26 Javascript
浅谈vue中数据双向绑定的实现原理
Sep 14 Javascript
js表达式与运算符简单操作示例
Feb 15 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
Apr 23 Javascript
JavaScript ES6 Class类实现原理详解
May 08 Javascript
javascript实现扫雷简易版
Aug 18 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
2010/04/07 PHP
CI框架集成Smarty的方法分析
2016/05/17 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
2019/06/14 PHP
使用jquery实现简单的ajax
2013/07/08 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
2013/11/19 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
jquery Ajax 实现加载数据前动画效果的示例代码
2014/02/07 Javascript
js设置控件的隐藏与显示的两种方法
2014/08/21 Javascript
js改变embed标签src值的方法
2015/04/10 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
2015/08/31 Javascript
Bootstrap开发实战之响应式轮播图
2016/06/02 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
javascript验证手机号和实现星号(*)代替实例
2016/08/16 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
纯原生js实现贪吃蛇游戏
2020/04/16 Javascript
js实现多张图片延迟加载效果
2017/07/17 Javascript
详解动画插件wow.js的使用方法
2017/09/13 Javascript
vue实现底部菜单功能
2018/07/24 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
解读! Python在人工智能中的作用
2017/11/14 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
tensorflow pb to tflite 精度下降详解
2020/05/25 Python
One.com挪威:北欧成长最快的网络托管公司
2016/11/19 全球购物
波兰最大的电商平台:Allegro.pl
2021/02/06 全球购物
办公室年终个人自我评价
2013/10/28 职场文书
领导班子个人对照检查剖析材料
2014/09/29 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
自荐信模板大全
2015/03/27 职场文书
七年级作文之环保作文
2019/10/17 职场文书
扩展多台相同的Web服务器
2021/04/01 Servers
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技