13.6 模拟事件

大城市里の小女人 提交于 2020-02-02 08:41:37

在 document 对象上调用 document.createEvent() 方法创建 event 对象,接收一个参数,要创建的事件的字符串

参数 说明
UIEvents UI 事件,DOM3中是UIEvent
MouseEvents 鼠标事件,DOM3中是MouseEvent
MutationEvents DOM 变动事件,DOM3中是MutationEvent
HTMLEvents HTML 事件,没有对应的 DOM3级事件

创建对象-初始化-触发事件(dispatchEvent方法)

一、DOM 中的事件模拟

1.模拟鼠标事件

var btn = document.getElementById('myBtn');
var event = document.createEvent('MouseEvents'); //创建鼠标事件
event.initMouseEvent('click',true,true,document.defaultView,0,0,0,0,0,false,false,false,false,0,null); //初始化鼠标事件
btn.dispatchEvent(event); //触发事件

模拟鼠标事件的初始化方法为 initMouseEvent,该方法接收15个参数,对应 DOM 中的事件对象属性

参数 取值
type 事件类型
bubbles(布尔值) 是否可以冒泡,一般为 true
cancelable(布尔值) 是否可以取消,一般为 true
view 相关的视图,一般为 document.defaultView
detail 通常设置为0
screenX、screenY、clientX、clientY 自定义设置
ctrlKey、altKey、shiftKey、metaKey 默认为 false
button 按下了鼠标哪个键,默认为0
relatedTarget 相关元素,模拟 mouseover 和 mouseout 时使用

2.模拟键盘事件

DOM3 级方式创建,初始化方法为 initKeyboardEvent,该方法接收8个参数

参数 取值
type 事件类型
bubbles(布尔值) 是否可以冒泡,一般为 true
cancelable(布尔值) 是否可以取消,一般为 true
view 相关的视图,一般为 document.defaultView
key 按下键的键码(DOM3中为具体的字符而不是 ASCII 码)
location 按下了哪里的键,0主键盘,1左,2右,3数字键盘,4移动设备(虚拟键盘),5手柄
modifiers(字符串) 空格分隔的修改键列表
repeat 在一行中按了多少次键
var textbox = document.getElementById('myTextbox'),
    event;
if(document.implementation.hasFeature('KeyboardEvents','3.0')) {
    // 判断是否支持 DOM3
    event = document.createEvent('KeyboardEvent'); //创建键盘事件
    event.initKeyboardEvent('keydown',true,true,document.defaultView,'a',0,'shift',0); //初始化
}
textbox.dispatchEvent(event);

Firefox 中创建,初始化方法为 initKeyEvent,该方法接收10个参数

参数 取值
type 事件类型
bubbles(布尔值) 是否可以冒泡,一般为 true
cancelable(布尔值) 是否可以取消,一般为 true
view 相关的视图,一般为 document.defaultView
ctrlKey、altKey、shiftKey、metaKey 默认为 false
keyCode 键码,默认为0,字符键为 ASCII 码值,非字符键有其对应值
charCode ASCII 码,默认为0

另外,Firefox 中创建时,createEvent 方法中传入的参数也不同

var textbox = document.getElementById('myTextbox');
var event = document.createEvent('KeyEvent'); //创建键盘事件
event.initKeyEvent('keydown',true,true,document.defaultView,false,false,false,false,65,65); //初始化
textbox.dispatchEvent(event);

3.模拟其他事件

创建变动事件,initMutationEvent 方法接收以下参数
type、bubbles、cancelable、relatedTarget、preValue、newValue、attrName、attrChange

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

模拟 HTML 事件,不常用

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

4.自定义 DOM 事件

创建自定义事件,initCustomEvent 方法接收四个参数
type、bubbles、cancelable、detail

var div = document.getElementById('myDiv'),
    event;
if(document.implementation.hasFeature('CustomEvents','3.0')) {
    event = document.createEvent('CustomEvent'); 
    event.initCustomEvent('myevent',true,false,'hello world'); 
    div.dispatchEvent(event);
}

二、IE 中的事件模拟

IE 中创建对象调用 document.createEventObject() 方法,不传入参数,创建通用对象
之后不支持自动初始化,需自己将所有属性一一添加
最后调用 fireEvent() 触发事件,接收两个参数:事件处理程序名称、event 对象

var btn = document.getElementById('myBtn');
var event = document.createEventObject(); //创建对象
event.screenX = 100;
event.screenY = 0;
event.clientX = 100;
event.clientY = 0;
event.ctrlKey = false;
event.altKey = false;
event.shiftKey = false;
event.button = 0;
btn.fireEvent('onclick',event); //触发事件
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!