javascript的事件

去年一直在学习框架的东西,好比VueJs,angularJs的东西,但感受本身的基础知识仍是很匮乏,所以想着该从新回归本质,多看看原生javascrip的东西,如今返回去学一些东西,感受不少都豁然开朗的感受。javascript

所谓事件呢,就是能够被 JavaScript 侦测到的行为。而具体的事件有哪些呢html

  • 鼠标事件java

  • 键盘事件浏览器

  • window事件框架

  • media事件函数

  • form事件学习

当触发事件时,就须要去处理他,而使用事件处理模型有三种spa

  • html事件处理模型----定义:将事件直接绑定到html标签上----缺点:html和javascript耦合,没法处理多个事件程序code

<input id="btn" value="按钮" type="button" onclick="showMessage();">
<script>
 function showMessage(){
   console.log("HTML添加事件处理");
 }
</script>

. DOM0级事件处理模型----定义:函数赋值给事件处理程序的方法orm

var btn=document.getElementById('btn');

 btn.onclick=function(){

 console.log('这是经过DOM 2级处理程序')

};

. DOM 2级事件处理程序----经过addEventListener 和 removeEventListener,这两个函数的参数要一致

function showMsg(){
console.log('msg')
}
btn.addEventListener('click', showMsg, false)
btn.removeEventListener('click', showMsg, false)

IE事件处理
IE8如下的版本不支持addEventListener
所以须要用attachEvent 添加事件处理程序

detachEvent 删除事件处理程序

而事件发生时会在元素节点与根节点之间按照特定的顺序传播,路径所通过的全部节点都会收到该事件,这个传播过程即DOM事件流。

事件传播的顺序对应浏览器的两种事件流模型:捕获型事件流和冒泡型事件流。

事件捕获:不太具体的DOM节点,具体节点接收到事件

事件冒泡:由具体的DOM节点逐级向上传递至最不具体的节点

网上的图片更形象的代表了

clipboard.pngclipboard.png

<div id='box'>
        <div id='father'>
            <div id='son'></div>
        </div>
    </div>
    <script>
        var box=documentGetById('box'),
            father=document.getElementById('father'),
            son=document.getElementById('son');
        father.addEventListener('click',function(){
            console.log('father msg');
        },false)    
        son.addEventListener('click',function(){
            console.log('son msg')
        },false)
    </script>

当咱们点击son的时候,控制台会前后打出

som msg
father msg

但是咱们只想显示son msg,应该怎么处理呢 ,接着往下看

DOM中的事件对象

在触发DOM上的事件时都会产生一个对象 
DOM中的 event事件对象
     type:事件类型,
     target:获取事件目标元素
     stopPropagation:方法 阻止事件冒泡
     preventDefault 方法 阻止事件的默认行为
IE中的事件对象
    type:事件类型
    srcElement 属性 获取事件目标元素
    cancleBubble 属性
    returnValue 属性 设置为true

经过以上知识,咱们能够封装一个跨浏览器的事件对象

var eventObj= {
         /**
         * 添加事件 
         * element 元素
         * 事件类型
         * 事件处理
         **/
        addEventHandler: function (element, type, handler) {
            if (element.addEventListener) {
                element.addEventListener(type, handler, false)
            } else if (element.attachEvent) {
                element.attachEvent('on' + type, handler)
            } else {
                element['on' + type] = handler;
            }
        },
        /**
        * 移除事件
        * element 元素
        * 事件类型
        * 事件处理
        **/
        removeEventHandler: function (element, type, handler) {
            if (element.removeEventListener) {
                element.removeEventListener(type, handler)
            } else if (element.attachEvent) {
                element.attachEvent('on' + type, handler)
            } else {
                element['on' + type] = null;
            }
        },
        /**
        *获取事件
        **/
        getEvent: function (e) {
            return e ? e : window.event;
        },
        /**
        * 阻止默认行为
        **/
        preventDefault: function (e) {
            if (e.preventDefault) {
                e.preventDefault()
            } else {
                e.returnValue = false;
            }
        },
        getElement: function (e) {
            return e.target || e.srcElement;
        },
        /** 
        * 阻止事件冒泡
        **/
        stopPropagation: function (e) {
            if (e.stopPropagation) {
                e.stopPropagation()
            } else {
                e.cancelBubble = true;
            }

        }
    };
    eventUtil.addHandler(btn2, 'click', showMessage);
相关文章
相关标签/搜索