本文实例讲述了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对象添加srcElement和type属性,其他属性则必须手动添加。
在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.jb51.net/table/javascript_event
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript事件相关操作与技巧大全》、《JavaScript页面元素操作技巧总结》、《JavaScript操作DOM技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript错误与调试技巧总结》
希望本文所述对大家JavaScript程序设计有所帮助。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】