标签:var ble ima 一行代码 listen 修改 默认 images 按钮
Javascript中的事件包括click、mouseover、submit、change等等,它们分别在元素被点击、鼠标滑过、表单提交、域的内容改变时触发,那么自定义事件是如何定义和触发的?它有什么意义?
如何定义?
自定义事件创建分两步:创建事件模型、初始化。
document.createEvent()用于创建事件模型,它接收一个参数,表示事件模型的类型。事件模型类型一共有4类,分别是:
UIEvents(通用的UI事件),鼠标事件键盘事件都继承自UI事件
MouseEvents(通用的鼠标事件)
MutationEvents(通用的突变事件)
HTMLEvents(通用的HTML事件)

什么叫突变事件?文档中的某个元素被移除了,就会触发突变事件中的DOMNodeRemovedFromDocument事件
什么叫HTML事件,就是元素上的事件。如blur、change、resize
对4种事件模型详情感兴趣可移步这里了解更多……
创建事件模型后,初始化返回的event对象。以上4种事件模型对应的初始化方法分别是initUIEvent()、initMouseEvent()、initMutationEvent()、initEvent(),它们接收3个参数:
type 事件类型,如“click”
bubble 是否冒泡
cancelable 是否可以取消事件默认行为
当然他们各自还有其它参数,这里主要介绍自定义事件,就不展开了。
如何触发?
自定义事件初始化以后,如何触发呢?自定义事件和浏览器的行为不相干,都是通过元素的dispatchEvent()方法主动触发的,改方法接收一个参数,表示触发的事件对象,即document.createEvent()的返回值。
源码:
<script>
// 创建自定义事件
var e = document.createEvent("HTMLEvents");
// 初始化wangmeijian事件
e.initEvent("wangmeijian", false, true);
// 监听document的wangmeijian事件
document.addEventListener("wangmeijian", function(){
alert("触发成功!");
})
// 触发自定义事件
document.dispatchEvent(e);
</script>
IE8及以下浏览器不支持createEvent方法,但是它们有onprototypechange事件,当dom元素的属性值发生变化时会触发这个事件,也就是说,可以给dom元素设置一个属性attr,监听该元素的onprototypechange事件,判断发生变化的属性(event对象下的prototypeName)是不是attr,是则执行自定义事件函数。要主动触发onprototypechange事件,只需要修改元素的attr属性值即可。
demo(仅测试了IE11下的IE7、IE8文档模式)
源码:
<h1>
请使用IE8或更低版本的浏览器测试
</h1>
<button id="btn" eventAttr="0">点击修改按钮的eventAttr属性值</button>
<script>
var btn = document.getElementById("btn");
btn.attachEvent("onpropertychange", function(e){
if(e.propertyName === "eventAttr"){
alert("触发成功!");
}
})
btn.attachEvent("onclick", function(){
btn.setAttribute("eventAttr", 1);
})
</script>
有什么意义?
到这里有的同学会问了,写这么一堆代码,最终是为了执行这一行代码
alert("触发成功!");
是主动执行的,并且知道要在什么时候执行,那为什么不直接写这一行就够了,自定义事件的意义在哪里?
我的理解是:为了代码解耦,你不需要关心事件什么时候发生,你只需要关心事件发生后要做什么事。在多人协作开发中,这点尤其重要!
转发自:http://www.mamicode.com/info-detail-1029072.html
标签:var ble ima 一行代码 listen 修改 默认 images 按钮
原文地址:http://www.cnblogs.com/fangsmile/p/7429292.html