本篇主要介绍HTML DOM中事件的模拟操作。

其他事件文章

1. HTML 事件(一) 事件的介绍

2. HTML 事件(二) 事件的注册与注销

3. HTML 事件(三) 事件流与事件委托

4. HTML 事件(四) 模拟事件操作

目录

1. 模拟事件介绍

  1.1 特点

  1.2 创建方式

2. 老版本

  2.1 创建步骤

  2.2 支持的事件类型

  2.3 模拟鼠标点击

  2.4 自定义事件

3. 新版本

  3.1 创建步骤

  3.2 支持的事件类型

  3.3 模拟鼠标点击

  3.4 自定义事件

4. Excel导出应用场景

1. 模拟事件介绍

模拟事件,即非实际操作去触发元素的事件。如按钮的点击,不需要实际用鼠标去点击此按钮,而是采用模拟触发此按钮的点击事件。

1.1 特点

触发元素的事件可以直接调用事件方法(如:click()触发元素的click事件)。为何还要单独的模拟触发呢?

与直接触发相比,模拟事件包含以下特点:

①模拟特定场景:如触发click事件,可同时模拟是否按下Ctrl、Alt等按键。

②可触发自定义事件。

1.2 创建方式

模拟事件的创建方式有两种:

①老版:通过document.createEvent()方法创建各事件类型对象。

②新版:通过各事件的构造函数创建事件类型对象。

注:老版本方式将会被新版本方式所替代。

2. 老版本方式

说明:通过document.createEvent()方法创建各事件类型对象。

2.1 创建步骤

①通过document.createEvent(eventType)方法创建一个event对象。

②调用event.initEvent()方法进行事件初始化。注意:不同的事件类型对象,其初始化的方法名称也不通;比如MouseEvent的为event.initMouseEvent()。

③调用元素对象的dispatchEvent(event对象)方法进行派发。

2.2 支持的事件类型

事件类型名称 传递document.createEvent()的值 初始化方法
UIEvent Types :用户界面事件类型 UIEvents、UIEvent event.initUIEvent
MouseEvent Types :鼠标事件类型 MouseEvent、MouseEvents event.initMouseEvent
KeyboardEvent Types :键盘事件类型 KeyboardEvent event.initKeyEvent(Gecko内核浏览器才支持)、event.initKeyboardEvent
CustomEvent Types :自定义事件类型 CustomEvent event.initCustomEvent
BasicEvent Types :基本事件类型 Event、Events event.initEvent

2.3 模拟鼠标点击

说明:模拟鼠标点击,按钮A和B都注册了各自的点击事件,点击按钮A时,模拟触发按钮B的点击事件。

HTML:

<button id="a-btn">A按钮</button>
<button id="b-btn">B按钮</button>

JS:

// 按钮A点击时,模拟触发按钮B的点击事件
document.getElementById('a-btn').onclick=function(e){
var clickEvent=document.createEvent('MouseEvent'); // 1.创建一个鼠标事件类型
clickEvent.initMouseEvent('click',false,false,window,0,0,0,0,0,false,false,false,false,0,null); // 2.初始化一个click事件
document.getElementById('b-btn').dispatchEvent(clickEvent); // 3.派发(触发)
}; // 按钮B
document.getElementById('b-btn').onclick=function(e){
console.log('b');
};

2.4 自定义事件

说明:模拟事件支持模拟触发自定义事件。

HTML:

<button id="a-btn">A按钮</button>
<button id="b-btn">B按钮</button>

JS:

// 按钮A
document.getElementById('a-btn').onclick=function(e){
var customEvent=document.createEvent('CustomEvent'); // 1.创建一个自定义事件类型
customEvent.initCustomEvent('build'); // 2.初始化一个build事件
document.getElementById('b-btn').dispatchEvent(customEvent); // 3.派发(触发)
}; // 按钮B注册一个自定义事件
document.getElementById('b-btn').addEventListener('build',function(){
console.log('b-btn build');
});

3. 新版本方式

说明:通过各事件的构造函数创建事件类型对象。

3.1 创建步骤

①通过各事件类型的构造函数创建一个event对象。

②调用元素对象的dispatchEvent(event对象)方法进行派发。

3.2 支持的事件类型

事件名称 构造函数 详情地址
UIEvent Types :用户界面事件类型 new UIEvent(typeArg [, eventInit]) https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/UIEvent
MouseEvent Types :鼠标事件类型 new MouseEvent(typeArg [, eventInit]) https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/MouseEvent

KeyboardEvent Types :键盘事件类型

new KeyboardEvent(typeArg [, eventInit])

https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/KeyboardEvent

CustomEvent Types :自定义事件类型

new CustomEvent(typeArg [, eventInit])

https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent

BasicEvent Types :基本事件类型

new Event(typeArg [, eventInit])

https://developer.mozilla.org/en-US/docs/Web/API/Event/Event

3.3 模拟鼠标点击

说明:模拟鼠标点击,按钮A和B都注册了各自的点击事件,点击按钮A时,模拟触发按钮B的点击事件并且模拟alt按键按下。

HTML:

<button id="a-btn">A按钮</button>
<button id="b-btn">B按钮</button>

JS:

// 按钮A点击时,模拟触发按钮B的点击事件
document.getElementById('a-btn').onclick=function(e){
var clickEvent=new MouseEvent('click',{
altKey:true // 模拟alt键按下
});
document.getElementById('b-btn').dispatchEvent(clickEvent); // 派发
}; // 按钮B
document.getElementById('b-btn').onclick=function(e){
console.log('按钮b点击事件触发;alt案件是否按下:'+e.altKey);
};

  

3.4 自定义事件

说明:模拟事件支持模拟触发自定义事件。

HTML:

<button id="a-btn">A按钮</button>
<button id="b-btn">B按钮</button>

JS:

// 按钮A
document.getElementById('a-btn').onclick=function(e){
var customEvent = new CustomEvent('build');
document.getElementById('b-btn').dispatchEvent(customEvent); // 派发
}; // 按钮B注册一个自定义事件
document.getElementById('b-btn').addEventListener('build',function(){
console.log('b-btn build');
});

4. Excel导出应用场景

在Web系统中Excel导出是很常见的功能,比如销售记录导出、采购记录导出、人员信息导出等等。

采用HTML DOM的模拟事件可以定义为一个公共函数进行统一的导出操作,各业务模块的导出按钮只需调用即可。

4.1 公共函数

/**
* 下载Excel文件
* @param url {URL} 请求URL
* @param params {Params} 查询参数
* @param fileName {String} 文件名称
*/
function downloadExcel(url, params, fileName) {
$.ajax({
type:'GET',
url: url,
data:params,
dataType:'json',
success: function (data, responseStatus) {
/*
* data{
msg:'UpFiles/XXXX.xls' // 返回的文件链接
}
*/
var downloadURL = location.origin + '/' + data.msg; // 下载链接
// 1)建立个a标签
var aElement = document.createElement('a');
aElement.href = downloadURL;
aElement.download = fileName;
// 2)创建点击事件
var clickEvent=new MouseEvent('click');
aElement.dispatchEvent(clickEvent); // 派发
}
});
}

4.2 示例图

End
菜单加载中...

HTML 事件(四) 模拟事件操作的更多相关文章

  1. 解密jQuery事件核心 - 模拟事件(四)

    前几章已经把最核心的实现都分解过了,这一章我们看看jQuery是如何实现事件模拟的 在Internet Explorer 8和更低,一些事件change 和 submit本身不冒泡,但jQuery修改 ...

  2. JS 中的自定义事件和模拟事件

    在 JS 中模拟事件指的是模拟 JS 中定义的一些事件,例如点击事件,键盘事件等. 自定义事件指的是创建一个自定义的,JS 中之前没有的事件. 接下来分别说一下创建这两种事件的方法. 创建自定义事件 ...

  3. jQuery 移除事件与模拟事件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  4. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  5. Javascript高级编程学习笔记(71)—— 模拟事件(1)DOM事件模拟

    事件,指的是网页中某个特定的交互时刻 一般来说事件由浏览器厂商负责提供,一般由用户操作或者其它浏览器功能来触发 但是有一类特殊的事件,那就是由我们开发人员通过JS触发的事件 这些事件和浏览器创建的事件 ...

  6. 第一百七十一节,jQuery,高级事件,模拟操作,命名空间,事件委托,on、off 和 one

    jQuery,高级事件,模拟操作,命名空间,事件委托,on.off 和 one 学习要点: 1.模拟操作 2.命名空间 3.事件委托 4.on.off 和 one jQuery 不但封装了大量常用的事 ...

  7. jQuery-1.9.1源码分析系列(十) 事件系统——主动触发事件和模拟冒泡处理

    发现一个小点,先前没有注意的 stopPropagation: function() { var e = this.originalEvent; ... if ( e.stopPropagation ...

  8. 微信小程序之触控事件(四)

    [未经作者本人同意,请勿以任何形式转载] >>>什么是事件 事件是视图层到逻辑层的通讯方式. 事件可以将用户的行为反馈到逻辑层进行处理. 事件可以绑定在组件上,当达到触发事件,就会执 ...

  9. c#全局鼠标事件以及鼠标事件模拟

    最近在编写Max插件时,其主容器FlowLayoutPanel由于隐藏了滚动条,要实现按住鼠标中键上下拖动的功能,因此尝试了全局鼠标事件.以及鼠标勾子,可惜由于Max不争气?都未能实现,于是代码报废, ...

随机推荐

  1. SQLSERVER将一个文件组的数据移动到另一个文件组

    SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...

  2. Linux虚拟机的安装(使用Centos6.3)

    1.什么是虚拟机? 虚拟机指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统 2.安装Linux虚拟机前要做的准备 2.1:一台windows环境的pc 2.2:下载VM ...

  3. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  4. 关于python的bottle框架跨域请求报错问题的处理

    在用python的bottle框架开发时,前端使用ajax跨域访问时,js代码老是进入不了success,而是进入了error,而返回的状态却是200.url直接在浏览器访问也是正常的,浏览器按F12 ...

  5. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

  6. AFNetworking 3.0 源码解读(七)之 AFAutoPurgingImageCache

    这篇我们就要介绍AFAutoPurgingImageCache这个类了.这个类给了我们临时管理图片内存的能力. 前言 假如说我们要写一个通用的网络框架,除了必备的请求数据的方法外,必须提供一个下载器来 ...

  7. VSCode添加Sciter脚本Tiscript高亮支持

    Sciter中的Tiscript脚本不是标准的Javascript,是对Javascript的扩展.所以在常用的编辑器和IDE上对于高亮的支持很不好. 不过在Sciter论坛中找到了在VSCode上的 ...

  8. TYPESDK手游聚合SDK服务端设计思路与架构之二:服务端设计

    在前一篇文中,我们对一个聚合SDK服务端所需要实现的功能作了简单的分析.通过两个主要场景的功能流程图,我们可以看到,作为多款游戏要适配多个渠道的统一请求转发中心,TYPESDK服务端主要需要实现的功能 ...

  9. IT雇员及外包商选择:人品第一

    最近,苹果iOS操作系统和智能手机爆出了一个奇葩故障,在播放特定一段五秒钟的视频时能导致手机死机.唯一的解决办法是按住电源键和Home按键进行手机的重启. 第十八届中国国际高新技术成果交易会在深圳举办 ...

  10. git和pycharm管理代码

    首先明白三个概念,服务器代码库,本地代码库,和正在coding的项目. coding完毕后,先通过commit提交到本地代码库,然后通过push再提交server的代码库    git步骤 git c ...