zoukankan      html  css  js  c++  java
  • DOM事件第一弹

         近期温习了部分w3c上关于DOM事件的规范,发现以前有些模糊的概念更加清晰,以及受到罗胖(罗辑思维)的影响,很是想分享自己的了解的东西,希望大家给予指正或补充。

    一、事件类型

    参数 事件接口 初始化方法
    HTMLEvents HTMLEvent iniEvent()
    MouseEvents MouseEvent iniMouseEvent()
    UIEvents UIEvent iniUIEvent()

    此处为DOM2级事件,DOM3级对事件分解更加详细,后续文章继续整理。

    二、事件对象

    也就是所谓的event对象。标准浏览器的event对象是通过方法的参数传入的,而ie则是window.event来获取。现将常用的一些事件对象操作总结如下:

    标准属性或者方法名 作用 IE兼容事件名
    bubbles 判断事件是否冒泡阶段,true表示冒泡阶段  
    cancelable 指示事件是否可以取消默认动作  
    target 返回触发此事件的元素(事件的目标节点) srcElement
    type 返回事件的类型  
    preventDefault() 阻止默认事件的执行 returnValue为false表示
    stopPropagation() 阻止事件的传播 cancelBubble属性为false

    三、如何自定义一个事件

    1. 使用document.createEvent创建一个事件。

    2.通过对应的“初始化方法”初始化事件对象

    3.使用dispatchEvent初始化事件

    示例代码如下:

    <input type="text" value="text" id="text" />
        <button type="button" id="btn">按钮</button>
        <div id="foo" style=" 200px; height: 200px; background: red;" contenteditable="true" ></div>
        <script>
            var text = document.getElementById('text');
            var foo = document.getElementById('foo');
            var btn = document.getElementById('btn');
    
            //自定义focus事件
            foo.onfocus = function(evt){
                evt = evt || window.event;
                console.log(evt);
                foo.innerHTML += "<br/>发生了focus事件" + ( evt.view ? 'view' : 'dispatch' );
            }
            if(document.createEvent){
                var cFocus = document.createEvent('HTMLEvents');
                //参数全是为了兼容IE9+
                cFocus.initEvent('focus',true, false); 
                foo.dispatchEvent(cFocus);
            }else{
                foo.focus(); //Ie8-下会触发两个
            }
    
            //dispatch触发按钮事件
            
            btn.onclick = function(){
                alert('text: ' + text.value);
                text.focus();
            }
            if(document.createEvent){
                var clickHandle = document.createEvent('MouseEvents');
                //参数全是为了兼容IE9+
                clickHandle.initMouseEvent('click',true,false,window,0, 0, 0, 0, 0, false, false, false, false, 0, null);
                btn.dispatchEvent(clickHandle);
            }else{
                btn.click(); //Ie8-下也只有一次
            }
    
        </script>

    1. 如果是view触发的事件,event对象上也会有view(视图对象)和which(按的哪个键),而通过dispatchEvent触发的则没有这两个属性
    2. 兼容Ie8-的浏览器,把事件委托当作一个方法调用即可,如我想调用click事件(不带on前缀)
      foo.click
  • 相关阅读:
    WebSocket connection to 'ws://192.168.3.195:9527/sockjs-node/564/fjaw2vh2/websocket' failed: Invalid frame header
    审核警告:“data-custom”太新,无法在此检查的页面上运行以及cannot declare a const variable twice 'n'解决。
    react中如何使用iconfont
    重视工作质量,对自己的代码负责
    提醒自己不要浮躁
    结果重要同样过程也同样重要,享受过程
    访问链表节点的时候,需要判断链表节点是否可以访问
    遇到问题或者线上问题不要急,冷静分析,沉着处理
    注意运算符的运算优先级别
    对每一个IO操作的返回都要进行判断
  • 原文地址:https://www.cnblogs.com/cqhaibin/p/6754026.html
Copyright © 2011-2022 走看看