美文网首页
前端知识点之DOM 事件类

前端知识点之DOM 事件类

作者: 无故下架内容so账号已弃用 | 来源:发表于2019-01-09 13:25 被阅读0次

知识点:
--DOM 事件的级别
--DOM 事件模型和事件流
--Event 对象的常见应用
--自定义事件

DOM 事件基本概念

一、DOM 事件的级别

DOM 0
element.onclick = function () {}

DOM 2
element.addEventListener('click',function (){},false)
true: 捕获
false:冒泡,默认值

DOM 3
element.addEventListener('keyup',function (){},false)
DOM 3标准时代主要新增了键盘等物理事件

二、DOM 事件模型和事件流

捕获:从上而下,window => document => html => body => .... => 目标元素
冒泡: 从下而上,目标元素 => ... => body => html => document => window
事件流:: 捕获阶段-目标阶段-冒泡阶段

捕获的具体流程:window => document => html => body => .... => 目标元素

<div id="div">
    <span id="span">目标元素</span>
</div>
<script>
    var oDiv = document.getElementById('div'),
        oSpan = document.getElementById('span'),
        oBody = document.body,
        oHtml = document.documentElement;
    oDiv.addEventListener('click',function (){
        console.log('div');
    },true)
    oSpan.addEventListener('click',function (){
        console.log('span');
    },true)
    oBody.addEventListener('click',function (){
        console.log('body');
    },true)
    oHtml.addEventListener('click',function (){
        console.log('html');
    },true)
    document.addEventListener('click',function (){
        console.log('document');
    },true)
    window.addEventListener('click',function (){
        console.log('window');
    },true)
</script>
// 输出顺序 window document html body div span

冒泡的具体流程:目标元素 => ... => body => html => document => window

<div id="div">
    <span id="span">目标元素</span>
</div>
<script>
    var oDiv = document.getElementById('div'),
        oSpan = document.getElementById('span'),
        oBody = document.body,
        oHtml = document.documentElement;
    oDiv.addEventListener('click',function (){
        console.log('div');
    },false)
    oSpan.addEventListener('click',function (){
        console.log('span');
    },false)
    oBody.addEventListener('click',function (){
        console.log('body');
    },false)
    oHtml.addEventListener('click',function (){
        console.log('html');
    },false)
    document.addEventListener('click',function (){
        console.log('document');
    },false)
    window.addEventListener('click',function (){
        console.log('window');
    },false)
</script>
// 输出顺序 span div body html document window

三、Event 对象的常见应用

  1. event.preventDefault(): 阻止默认事件,比如:
<a href="http://www.baidu.com">跳转成功</a>
<a href="http://www.baidu.com" id="link">跳转失败</a>
<script>
    var oLink = document.getElementById('link');
    oLink.addEventListener('click',function (ev){
        var ev = ev || window.event;
        ev.preventDefault();
    },false)
</script>
  1. event.stopPropagation(): 阻止冒泡行为:
<span id="span">点击</span>
<script>
    var oSpan = document.getElementById('span'),
        oBody = document.body;
    oSpan.addEventListener('click',function (ev){
        console.log('span')
        var ev = ev || window.event;
        ev.stopPropagation();
    },false)
    oBody.addEventListener('click',function (){
        console.log('body')
    },false)
</script>
// 只输出 span,阻止了冒泡,所以 console.log('body') 没有被执行
  1. event.stopImmediatePropagation(): 阻止事件冒泡、把这个元素绑定的同类型事件也阻止
<div id="div">
    <span id="span">目标元素</span>
</div>
<script>
    var oDiv = document.getElementById('div'),
        oSpan = document.getElementById('span');
    oSpan.addEventListener('click', function(ev) {
        console.log('span绑定的第一个事件函数');
    }, false);
    oSpan.addEventListener('click', function(ev) {
        var ev = ev || window.event;
        console.log('span绑定的第二个事件函数');
        // 阻止事件冒泡、把 span 元素绑定的同类型事件也阻止
        ev.stopImmediatePropagation();
    }, false);
    oSpan.addEventListener('click', function(ev) {
        console.log('span绑定的第三个事件函数');
    }, false);
    oDiv.addEventListener('click', function(ev) {
        console.log('div');
    }, false);
</script>
// 输出 span绑定的第一个事件函数 -- span绑定的第二个事件函数
// console.log('span绑定的第三个事件函数'); console.log('div'); 没有执行
  1. event.currentTarget 和 event.target
    event.currentTarget: 事件绑定的元素
    event.target: 触发事件的元素
<div id="div">
    <span id="span">目标元素</span>
</div>
<script>
    var oDiv = document.getElementById('div'),
        oSpan = document.getElementById('span');
    oDiv.addEventListener('click', function(ev) {
        var ev = ev || window.event;
        console.log(ev.currentTarget);
        console.log(ev.target);
    }, false);
</script>

如果点击的是span,那么结果为:


image.png

如果没有点中span的范围,而点击在 div 的范围内,那么结果为:


image.png

四、自定义事件

还没搞懂。。

以上为学习笔记,参考资料:慕课网的课程

相关文章

网友评论

      本文标题:前端知识点之DOM 事件类

      本文链接:https://www.haomeiwen.com/subject/pdrjrqtx.html