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迭代器和生成器介绍
Mar 06 Python
python将图片文件转换成base64编码的方法
Mar 14 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
May 21 Python
Python实现的手机号归属地相关信息查询功能示例
Jun 08 Python
Python 基础教程之str和repr的详解
Aug 20 Python
浅谈用VSCode写python的正确姿势
Dec 16 Python
Flask框架web开发之零基础入门
Dec 10 Python
Python操作配置文件ini的三种方法讲解
Feb 22 Python
python 列表推导式使用详解
Aug 29 Python
解决python脚本中error: unrecognized arguments: True错误
Apr 20 Python
Python自定义聚合函数merge与transform区别详解
May 26 Python
Python3实现英文字母转换哥特式字体实例代码
Sep 01 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
Codeigniter生成Excel文档的简单方法
2014/06/12 PHP
浅析Yii2 GridView实现下拉搜索教程
2016/04/22 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
XHTML下,JS浮动代码失效的问题
2009/11/12 Javascript
jquery checkbox全选、取消全选实现代码
2010/03/05 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
2012/01/12 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
jQuery获取页面元素绝对与相对位置的方法
2015/06/10 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
js数字计算 误差问题的快速解决方法
2017/02/28 Javascript
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
[01:19:46]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
详解python3百度指数抓取实例
2016/12/12 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
python如何在循环引用中管理内存
2018/03/20 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
Python格式化字符串f-string概览(小结)
2019/06/18 Python
python3 实现函数写文件路径的正确方法
2019/11/27 Python
python实现从wind导入数据
2019/12/03 Python
Python 实现训练集、测试集随机划分
2020/01/08 Python
python 多线程中join()的作用
2020/10/29 Python
tensorflow与numpy的版本兼容性问题的解决
2021/01/08 Python
详解Html5页面实现下载文件(apk、txt等)的三种方式
2018/10/22 HTML / CSS
婴儿地球:Baby Earth
2018/12/25 全球购物
将时尚融入珠宝:Adornmonde
2019/10/17 全球购物
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
法律顾问服务方案
2014/05/15 职场文书
2015年教师见习期工作总结
2015/05/20 职场文书
死亡诗社观后感
2015/06/05 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
幼儿园中班班级总结
2015/08/10 职场文书
假如给我三天光明:舟逆水而行,人遇挫而达 
2019/10/29 职场文书