浅谈JavaScript的事件(事件模拟)
事件经常由操作或者通过浏览器功能触发,通过JavaScript也可以触发元素的事件。通过JavaScript触发事件,也称为事件的模拟。
- DOM中事件模拟
可以document的createEvent方法创建event对象。这个方法接收一个参数,即表示要创建的事件类型的字符串。在DOM2级中,所有这些字符串都使用英文复数形式,在DOM3级中都变成了单数。这几个字符串如下:UIEvents,一般化的ui事件,鼠标事件和键盘事件都继承于该事件,在DOM3级中是UIEvent;MouseEvents,一般化的鼠标事件,在DOM3级中是MouseEvent;MutationEvents,DOM变动事件DOM3级是MutationEvent;HTMLEvents,html事件,没有对应的DOM3级。
在创建了event对象后,还需要使用与事件有关的信息对其进行初始化。每种类型的event都有一个对应的方法,为其传入一个参数就可以初始化事件对象。模拟事件的最后一步是触发事件,触发事件使用dispatchEvent方法,所有支持DOM事件的节点都支持该方法。调用dispatchEvent方法需要传入一个参数,即表示要触发事件的event对象。
创建鼠标事件对象,并为其指定必要的信息,就可以模拟鼠标事件。创建鼠标事件的对象方法是createEvent方法,传入的参数是MouseEvents。返回的event对象有一个initMouseEvent方法,用于指定与鼠标事件有关的信息。这个方法接收15个参数,分别与鼠标事件中典型的属性一一对应,属性如下:type,表示要触发的事件类型,如“click”;bubbles,是否支持冒泡,如true;cancelable,表示事件是否可以取消,如true;view,事件关联的视图,一般是document.defaultView;detail,与事件有关的详细信息,通常设置为0;screenX,事件相对于屏幕的x坐标;screenY,事件相对于屏幕的y坐标;clientX,事件相对于视口的X坐标;clientY,事件相对于视口的Y坐标;ctrlKey,表示是否按下了ctrl键,一般为false;shiftKey,表示是否按下了shit键,一般为false;metaKey,表示是否按下了meta键,一般为false;button,表示按下的是哪一个鼠标键,默认为0;relatedTarget,表示与事件相关的对象,在模拟mouseout和mouseover时使用。
对于需要模拟鼠标事件,一般只需要传递前3个参数。
var callback =function(event){
console.log("1");
}
EventUtil.addEvent(document.getElementById("btnadd"),"click",callback);
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click",false,false);
var btn =document.getElementById("btnadd");
btn.dispatchEvent(evt);
通过上面的事件,我们就能触发btnadd元素的click事件。首先我们为元素绑定了click事件,这个事件需要用户操作才能触发。第5行通过createEvent创建了鼠标事件对象,通过initMouseEvent初始化了事件对象。然后通过元素的dispatchEvent方法来触发事件。
DOM2级中对键盘事件没有做出规范的规定。在DOM3级中对键盘事件有明确的定义。调用createEvent方法,传入KeyboardEvent能够创建键盘事件。返回的事件对象包含一个initKeyEvent的方法。这个方法的参数如下:type,事件类型,如keydown;bubbles,事件是否支持冒泡,如true;cancelable,事件是否可以取消,如true;view,事件的视图,一般为document.defaultView;key,表示按下键的键码;location,表示按下了哪里的键,0表示默认的主键盘,1表示左,2表示右,3表示数字键盘,4表示移动设备,5表示手柄;modifiers,空格分隔的修改键列表,如shift;repeat,按这个键的次数。
var txt=document.getElementById("inputtext");
txt.focus();
var evt =document.createEvent("KeyboardEvent");
evt.initKeyboardEvent("keydown",false,false,document.defaultView,"a",0,"Shift",0);
txt.dispatchEvent(evt);
上面的代码模拟了keydown事件,同时按下shift键和a键。
可以通过JavaScript代码模拟鼠标事件、键盘事件、HTML事件和变动事件。同时也可以模拟自定义事件。
var add=document.getElementById("btnadd");
EventUtil.addEvent(add,"myevent",function(ev){
ev=EventUtil.getEvent(ev);
var target=EventUtil.getTarget(ev);
console.log(ev.type);//myevent
});
var evt=document.createEvent("CustomEvent");
evt.initCustomEvent("myevent",false,false,"hello");
add.dispatchEvent(evt);
上面的代码通过createEvent方法创建了CustomEvent事件对象,也就是自定义事件对象,通过initCustomEvent初始化对象,最后触发myevent事件。第5行输出事件的类型为myevent,正是我们自定义的事件。
上面的创建模拟事件的方法在ie8以及ie8以下的浏览器中,并不支持。可以使用以下的代码来模拟事件。
var btn =document.getElementById("btnadd");
EventUtil.addEvent(btn,"click",function(e){
console.log("click");
})
var evt=document.createEventObject();
btn.fireEvent("onclick",evt);
最后讲一下事件模拟中经常用到的一场景,比如需要下载一幅图片或者导出excel等,可以通过事件模拟来实现。
function downloadImg(){
var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
var img = document.createElement("img");
img.src="Font-Awesome-3.2.1/src/assets/img/fort_awesome.jpg";
img.style.display="none";
document.body.appendChild(img);
if (userAgent.indexOf("MSIE") > -1) {
var oPop = window.open(img.src,"","width=1, height=1, top=5000, left=5000");
for(; oPop.document.readyState != "complete"; )
{
if (oPop.document.readyState == "complete")break;
}
oPop.document.execCommand("SaveAs");
oPop.close();
}
else{
var evt=document.createEvent("MouseEvents");
evt.initMouseEvent("click",false,false);
var a=document.createElement("a");
a.download="test.jpg";
a.href=img.src;
a.dispatchEvent(evt);
}
}
downloadImg();
浅谈JavaScript的事件(事件模拟)的更多相关文章
- 浅谈JavaScript中的事件
引言 Html页面与JavaScript之间的交互是通过事件来完成的.事件,就是文档或者浏览器窗口中发生的一些特定的交互瞬间.可以使用侦听器(处理程序)来预订事件,以便事件发生时执行相应的代码.这在传 ...
- 浅谈Javascript单线程和事件循环
单线程 Javascript 是单线程的,意味着不会有其他线程来竞争.为什么是单线程呢? 假设 Javascript 是多线程的,有两个线程,分别对同一个元素进行操作: function change ...
- 浅谈javascript的Touch事件
js的touch事件,一般用于移动端的触屏滑动 代码如下: $(function(){ document.addEventListener("touchmove", _touch, ...
- 浅谈javascript函数节流
浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
- 浅谈JavaScript浮点数及其运算
原文:浅谈JavaScript浮点数及其运算 JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题 ...
- 浅谈 JavaScript 编程语言的编码规范
对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...
- 浅谈javascript的原型及原型链
浅谈javascript的原型及原型链 这里,我们列出原型的几个概念,如下: prototype属性 [[prototype]] __proto__ prototype属性 只要创建了一个函数,就会为 ...
- 浅谈JavaScript中的null和undefined
浅谈JavaScript中的null和undefined null null是JavaScript中的关键字,表示一个特殊值,常用来描述"空值". 对null进行typeof类型运 ...
- 浅谈JavaScript中的正则表达式(适用初学者观看)
浅谈JavaScript中的正则表达式 1.什么是正则表达式(RegExp)? 官方定义: 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去 ...
随机推荐
- .27-浅析webpack源码之事件流make(2)
上一节跑到了NormalModuleFactory模块,调用了原型方法create后,依次触发了before-rsolve.factory.resolver事件流,这节从resolver事件流开始讲. ...
- python+appium+unittest
一个流行语言,一个主流工具,一个实用框架: For android 实例如下: import unittest from appium import webdriver from time impor ...
- 坑爹的file_exists
介绍 我发现了一个问题,今天与大家分享.我把整个过程描述一下. 问题 公司有个框架是基于smarty写的,我负责php的升级,维护人员把新环境布上来之后,测试人员找我提出经常报错(错 ...
- 认识Java(1)
Java是一门程序设计语言. 有三个方向: JAVA SE (java platform standard edition):包含java核心类,如数据库.接口.网络编程. JAVA ME(java ...
- vue 开发2017年变化回顾及2018年展望
vue.js 变化 从 github 的发布记录我们可以看到2017年 vue.js 的第一个发布为 v2.1.9,最后一个为 v2.5.13,主要发布小版本 2.2~2.5.这些发布提升了vue 与 ...
- ASPNET 5 和 dnx commands
DNX项目是用来创建和运行.net应用程序适用于windows,mac 和linux 的,dnx提供了一个宿主进程(a host process),CLR托管逻辑( CLR hosting logic ...
- Java线程-异常处理
在Java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉.这一点是通过java.lang.Run ...
- Hibernate (三)
1 一对多的单向 示例:一个已经存在的学生,新建一个班级,然后将该学生加入到该班级之下 设置inverse="false" <?xml version="1.0&q ...
- Struts2 (一)
1 三层架构 2 MVC框架的原理 3 什么是Struts2 Struts2是一个非常优秀的MVC框架,基于Model2设计模式. 是由传统的Struts1和WebWork两个经典的框架发展而来的. ...
- JVM类加载机制---类加载的过程
一.类加载的时机 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用.卸载 7个阶段,其中验证.准备.解析 3个部分统称为 连接. 二.具体步骤 ...