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 送你一顶圣诞帽 @微信官方
Dec 25 Python
Python requests库用法实例详解
Aug 14 Python
python3.6.3转化为win-exe文件发布的方法
Oct 31 Python
Pycharm配置远程调试的方法步骤
Dec 17 Python
python3爬虫获取html内容及各属性值的方法
Dec 17 Python
解决Python3 被PHP程序调用执行返回乱码的问题
Feb 16 Python
Python3.6实现带有简单界面的有道翻译小程序
Apr 16 Python
Pyqt5实现英文学习词典
Jun 24 Python
python实现飞机大战游戏(pygame版)
Oct 26 Python
Python如何实现的二分查找算法
May 27 Python
详解在Python中使用Torchmoji将文本转换为表情符号
Jul 27 Python
运行Python编写的程序方法实例
Oct 21 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
PHPMailer安装方法及简单实例
2008/11/25 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
xheditor与validate插件冲突的解决方案
2010/04/15 Javascript
jQuery源码分析-04 选择器-Sizzle-工作原理分析
2011/11/14 Javascript
浅谈javascript中的作用域
2012/04/07 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
Node.js(安装,启动,测试)
2014/06/09 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
2014/10/17 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
2014/12/08 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
微信小程序的动画效果详解
2017/01/18 Javascript
js鼠标移动时禁止选中文字
2017/02/19 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
在Vue.js中使用TypeScript的方法
2020/03/19 Javascript
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
2020/08/05 Javascript
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
使用Python编写提取日志中的中文的脚本的方法
2015/04/30 Python
Python的Bottle框架中返回静态文件和JSON对象的方法
2015/04/30 Python
Python max内置函数详细介绍
2016/11/17 Python
python微信跳一跳游戏辅助代码解析
2018/01/29 Python
基于DataFrame筛选数据与loc的用法详解
2018/05/18 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
广告设计专业自荐信范文
2013/11/14 职场文书
上班离岗检讨书
2014/01/27 职场文书
房产委托公证书
2014/04/08 职场文书
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
党员观看《筑梦中国》心得体会
2016/01/18 职场文书
XX部保密工作制度范本
2019/08/27 职场文书
MySQL 使用事件(Events)完成计划任务
2021/05/24 MySQL
Android存储中最基本的文件存储方式
2022/04/30 Java/Android