Js事件

Posted by Solace Blog on March 6, 2019

JavaScript事件

事件绑定

  • ele.onxxx = function(event) {},兼容性好,基本等同于写在Html行间上

  • obj.addEventListener(‘on’+type, fn, false); IE9向下不兼容,可以作为一个事件绑定多个处理程序

  • obj.attachEvent(‘on’+type, fn); IE独有,一个事件同样可以绑定多个处理程序

事件冒泡、捕获

事件冒泡:结构上(非视觉上)嵌套关系的元素,会存在事件冒泡的功能,即同一事件,自子元素冒向父元素。(自底向上)

事件捕获(只有Chrome实现了):结构上(非视觉上)嵌套关系的元素,会存在事件捕获的功能,即同一事件,自父元素捕获至子元素(事件源元素)。(自顶向上)

触发顺序:先捕获,后冒泡(一个对象的一个事件类型只能遵循一种事件模型)

focus、blur、change、submit、reset、select等事件不冒泡

obj.addEventListener('on'+type, fn, false); 绑定事件的最后一个参数false即为事件冒泡,true时即为事件捕获

事件委托

event对象中有个属性event.srcElement和event.target来获取事件源对象,在发生事件冒泡时,点击不同区域它的事件源对象其实是不同的。使用场景:

// 给每个<li>绑定一个点击事件来获取点击的<li>的内容
<ul>
    <li>1</li>
    <li>2</li>
    .... 中间省略一万个li ...
    <li>9998</li>
    <li>9999</li>
    <li>10000</li>
</ul>
<script>
    // 将点击事件绑定到父元素<ul>中,当点击<ul>时,其实际点击的是<ul>中的<li>
    // 即点击事件的事件源是<li>,就可以获取到<li>的内容了
    var ul = document.getElementByTagName('ul')[0];
    ul.onclick = function(e) {
        var event = e || window.event;
        var target = event.target || event.srcElement;
        console.log(target.innerText);
    }
</script>