JavaScript中的模拟事件和自定义事件实例分析


Posted in Python onJuly 27, 2018

本文实例讲述了JavaScript中的模拟事件和自定义事件。分享给大家供大家参考,具体如下:

前面介绍了JavaScript中为事件指定处理程序的五种方式和JavaScript的事件对象event。

下面介绍JavaScript中的模拟事件和自定义事件。

1、DOM中的事件模拟

1) DOM中的事件模拟有以下3个步骤:

步骤1:创建事件对象event

可以在document对象上使用createEvent()方法创建event对象,此方法接收一个参数,即要创建的事件类型的字符串。在DOM2级中这些字符串都使用英文复数形式,而在DOM3级中都变成了单数。这个字符串可以是以下几个字符串之一:

UIEvents:一般化的UI事件,鼠标事件和键盘事件都继承自UI事件,DOM3级中是UIEvent

MouseEvents:一般化的鼠标事件,DOM3级中是MouseEvent

MutationEvents:一般化的DOM变动事件,DOM3级中是MutationEvent

HTMLEvents:一般化的HTML事件,没有对应的DOM3级事件,被分散到 其他类别中。

步骤2:初始化事件对象

使用与事件有关的信息对其进行初始化,每种类型的event对象都有一个特殊的方法,为它传入适当的数据就可以初始化该event对象,不同类型的方法的名字也不相同,具体要取决于createEvent()中使用的参数。

步骤3:触发事件

使用dispatch()方法,此方法接收一个参数,即要触发事件的event对象。

2) 模拟鼠标事件:

使用createEvent()方法创建event对象,传入字符串"MouseEvents",返回的对象有一个名为initMouseEvent()方法,用于指定与该鼠标事件有关的信息。

模拟按钮的单击事件:

var btn = document.getElementsByTagNames("button")[0];
var event = document.createEvent("MouseEvents");
event.initMouseEvent("click", true, true, document.defaultView, 0, 0, 0, 0, 0, false, false, false, 0, null);
btn.dispatchEvent(event);

3) 模拟键盘事件:

使用createEvent()方法创建event对象,传入字符串"KeyboardEvent",返回的对象有一个名为initKeyboardEvent()方法。

DOM2级事件并没有专门规定键盘事件,后来的DOM3级事件才正式将其作为一种事件给出规定。IE9是目前唯一支持DOM3级键盘事件的浏览器,但其他浏览器也可以模拟键盘事件。

在使用createEvent()方法之前,需要先检测浏览器是否支持DOM3级事件。

模拟按住Shift的同时又按下A键:

var text = document.getElementsByTagNames("input")[0];
if (document.implementation.hasFeature("KeyboardEvents", 3.0) {
  var event = document.createEvent("KeyboardEvent");
  event.initKeyboardEvent("keydown", true, true, document.defaultView, "a", 0, "Shift", 0);
}
text.dispatchEvent(event);

4) 模拟其他事件:

① 模拟变动事件:

使用createEvent()方法创建event对象,传入字符串"MutationEvents",返回的对象有一个名为initMutationEvent()的方法。

var event = document.createEvent("MutationEvents");
event.initMutationEvent("DOMNodeInserted", true, false, someNode, "", "", "", 0);
target.dispatchEvent(event);

② 模拟HTML事件:

使用createEvent()方法创建event对象,传入字符串"HTMLEvents",返回的对象有一个名为initMutationEvent()的方法。

var event = document.createEvent("HTMLEvents");
event.initEvent("focus", true, false);
target.dispatchEvent(event);

5) 自定义DOM事件:

DOM3级还定义了自定义事件。自定义事件不是由DOM原生触发的,目的是让开发人员创建自己的事件。

创建自定义事件,可以使用createEvent("CustomEvent")方法,返回的对象有一个名为initCustomEvent()的方法,接收如下4个参数:

type(字符串):事件类型;

bubbles(布尔值):时间是否应该冒泡;

cancelable(布尔值):表示事件是否可以取消;

detail(对象):任意值,保存在event对象的detail属性中。

var div = document.getElementsByTagNames("div")[0];
EventUtil.addHandler(div, "myEvent", function(event) {
  alert("div:" + event.detail);
});
EventUtil.addHandler(document, "myEvent", function(event) {
  alert("document:" + event.detail);
});
if (document.implementation.hasFeature("CustomEvents", 3.0) {
  var event = document.createEvent("CustomEvent");
  event.initCustomEvent("myEvent", true, false, "Hello world");
}
div.dispatchEvent(event);

单击div会输出:

div:Hello world
document:Hello world

单击document会输出:

document:Hello world

2、IE中的事件模拟

IE中的事件模拟有以下3个步骤:

① 使用document.createEventObject()方法在IE中创建event对象,与DOM不同的是,此方法不接受参数,结果会返回一个通用的event对象。

② 为event对象手动添加所有必要的信息,没有方法来辅助添加。

③ 在目标上使用fireEvent()方法,此方法接收两个参数:事件处理程序的名称和event对象。在调用fireEvent()方法时,会自动为event对象添加srcElementtype属性,其他属性则必须手动添加。

在IE中,模拟任何事件都采用相同的模式。

模拟click事件:

var btn = document.getElementsByTagNames("button")[0];
var event = document.createEventObject();
event.screenX = 100;
event.screenY = 0;
event.clientX = 0;
event.clientY = 0;
event.strlKey = false;
event.altKey = false;
event.shiftKey = false;
Event.button = 0;
btn.fireEvent("onclick", event);

模拟keypress事件:

var text = document.getElementsByTagNames("input")[0];
var event = document.createEventObject();
event.strlKey = false;
event.altKey = false;
event.shiftKey = false;
Event.keyCode = 65;
btn.fireEvent("onkeypress", event);

PS:关于javascript事件说明可参考本站javascript事件与功能说明大全:http://tools.3water.com/table/javascript_event

希望本文所述对大家JavaScript程序设计有所帮助。

Python 相关文章推荐
Python深入学习之上下文管理器
Aug 31 Python
浅析Python中的序列化存储的方法
Apr 28 Python
在Python中处理字符串之isdecimal()方法的使用
May 20 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
Jul 12 Python
浅谈python中的正则表达式(re模块)
Oct 17 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
Apr 05 Python
Django框架的中的setting.py文件说明详解
Oct 15 Python
用django设置session过期时间的方法解析
Aug 05 Python
python3常用的数据清洗方法(小结)
Oct 31 Python
Tensorflow全局设置可见GPU编号操作
Jun 30 Python
Python操作Elasticsearch处理timeout超时
Jul 17 Python
Python爬虫实战之爬取携程评论
Jun 02 Python
浅谈tensorflow中几个随机函数的用法
Jul 27 #Python
tensorflow 中对数组元素的操作方法
Jul 27 #Python
Python读取excel中的图片完美解决方法
Jul 27 #Python
tensorflow实现图像的裁剪和填充方法
Jul 27 #Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
Jul 27 #Python
对Tensorflow中的矩阵运算函数详解
Jul 27 #Python
python+influxdb+shell编写区域网络状况表
Jul 27 #Python
You might like
打造计数器DIY三步曲(下)
2006/10/09 PHP
FCKeditor添加自定义按钮
2008/03/27 PHP
PHP XML操作类DOMDocument
2009/12/16 PHP
PHP 编写大型网站问题集
2010/05/07 PHP
php自动加载autoload机制示例分享
2014/02/20 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
PHP实现判断数组是一维、二维或几维的方法
2017/02/06 PHP
最短的javascript:地址栏载入脚本代码
2011/10/13 Javascript
jQuery实现form表单reset按钮重置清空表单功能
2012/12/18 Javascript
js Select下拉列表框进行多选、移除、交换内容的具体实现方法
2013/08/13 Javascript
JavaScript自定义方法实现trim()、Ltrim()、Rtrim()的功能
2013/11/03 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
2014/04/10 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
AngularJS 获取ng-repeat动态生成的ng-model值实例详解
2016/11/29 Javascript
详解A标签中href=""的几种用法
2017/08/20 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
微信小程序 wx:for遍历循环使用实例解析
2019/09/09 Javascript
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
基于Python os模块常用命令介绍
2017/11/03 Python
django中模板的html自动转意方法
2018/05/27 Python
python画一个玫瑰和一个爱心
2020/08/18 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
Python学习之路之pycharm的第一个项目搭建过程
2020/06/18 Python
canvas绘制圆角头像的实现方法
2019/01/17 HTML / CSS
主持人演讲稿范文
2013/12/28 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书
alibaba seata服务端具体实现
2022/02/24 Java/Android
一文简单了解MySQL前缀索引
2022/04/03 MySQL
nginx日志格式分析和修改
2022/04/28 Servers
mybatis-plus模糊查询指定字段
2022/04/28 Java/Android