zoukankan      html  css  js  c++  java
  • javascript自定义事件

    javascript自定义事件

    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

  • 相关阅读:
    linux信号
    APM浅析
    Jackson高并发情况下,产生阻塞
    [转]slf4j 与log4j 日志管理
    2015-09-27 git学习
    MySQL学习笔记-锁相关话题
    MySQL学习笔记-MySQL数据库优化实践[转]
    MySQL学习笔记-事务相关话题
    几个关于网站架构和性能的问题(我在知乎上的问答)
    MySQL学习笔记-数据库文件
  • 原文地址:https://www.cnblogs.com/fangsmile/p/7429292.html
Copyright © 2011-2022 走看看