浅谈Dom事件

事件流

事件流所描述的就是从页面中接受事件的顺序。

DOM事件流包括三个阶段:
1.事件捕获阶段
2.处于目标阶段
3.事件冒泡阶段

捕获阶段:window => document => html => body => div => ... => 目标元素
冒泡阶段:目标元素 => ... => body => html => document => window

DOM级别

DOM0: element.onclick = function () {...};
DOM2: dom.addEventListener('click', function(){
        // ...
      }, false);
DOM3: 绑定方式同DOM2,增加了键盘、鼠标等事件

event对象

event.preventDefault() : 取消默认事件
event.stopPropagation() : 停止事件冒泡
event.stopImmediatePropagation() : 优先级,执行该方法,其他同类事件取消。
// 如果某个元素有多个相同类型事件的事件监听函数,则当该类型的事件触发时,
// 多个事件监听函数将按照顺序依次执行.如果某个监听函数执行了 
// event.stopImmediatePropagation()方法,则除了该事件的冒泡行为被阻止之外,
// 该元素绑定的后序相同类型事件的监听函数的执行也将被阻止.

Event.currentTarget : 当前注册事件的对象的引用, 指向事件绑定的元素。
Event.target : 事件触发的元素。

事件代理

parent.addEventListener('click',function(event){
       console.log('这是父元素');
       console.log(event.target); 
       console.log(event.currentTarget); 
}, false);


<ul>
    <li><span>点击<span></li>
    <li>点击</li>
</ul>
var elementUl = document.querySelector('ul');
elementUl.addEventListener('click', function(event){
    var el = event.target;
    while (el.tagName !== 'LI') {
        if (el === elementUl){
            el =null;
            break;
        }
        el = el.parentNode;//返回當前元素的父节点
    }

    if (el) {
        console.log(el)
    }
}, false);

自定义事件

var eve = new Event('test');
window.addEventListener('test', function(e){
    console.log('test occured', e);
}, false);
setTimeout(() => {
    window.dispatchEvent(eve);
}, 1000);
posted @ 2018-07-05 00:18  jens1990  阅读(115)  评论(0编辑  收藏  举报