DOM事件流

DOM文档对象模型

注册事件:

  <button>传统注册事件</button>
    <button>监听注册事件</button>
    <script>
        /*    注册事件(也叫绑定事件)
           传统注册事件:
       注册事件的唯一性;
         同一个元素同一个事件只能有一个函数,如果有多个,后面会覆盖前面的.*/
        var btn = document.querySelectorAll('button')
        btn[0].onclick = function () {
            alert('first fn')
        }
        btn[0].onclick = function () {
            alert('second fn')
        }
        //2.方法监听注册事件  
        //使用方法: addEventListener('type',listener, useCapture)
        //useCapture  可选参数,默认值为false
        //同一个元素同一个事件可以注册多个监听器(事件处理程序),并且按顺序依次执行
        //事件类型必须带引号,而且不加on
        btn[1].addEventListener('click', function () {
            alert('方法监听注册事件')
        });
        btn[1].addEventListener('click', function () {
            alert('方法监听注册事件2')
        })
    </script>

 

删除事件:

   <div>1</div>
    <div>2</div>
    <div>3</div>
    <script>
        var div = document.querySelectorAll('div')
        div[0].onclick = function () {
            alert(1111);
            //传统方式删除事件
            div[0].onclick = null;
        }
        //2. 使用监听事件的removeEventListener()
        div[1].addEventListener('click', fn)

        function fn() {
            alert(22222)
            div[1].removeEventListener('click', fn)
        }
 
 
 
 

事件流:

事件流描述的是从页面中接收事件的顺序.

事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流.

事件流分3个部分,捕获阶段(从顶层到最底层), 当前目标阶段, 冒泡阶段 (从最里层到最外层 )

document ➡html➡body➡ div 捕获阶段

反之,则为冒泡阶段

css属性:

 <style>
        .son {
            height: 200px;
            width: 300px;
            position: relative;
            left: 200px;
            top: 100px;
            ">aqua;
        }

        .father {
            ">rgb(68, 0, 255);
            height: 400px;
            width: 600px;
            position: absolute;
            left: 500px;
            top: 200px;
        }
    </style>
 
 
 主代码:

<body>
    <div class="father">father
        <div class="son"> son</div>
    </div>
    <script>
        //JS代码只能执行捕获或冒泡其中的一个阶段   (即以下两种运行方式,同一时间只可运行一种)
        //onclick和attachEvent只能得到冒泡阶段
        // addEventListener() 当第三个参数为true时,按照捕获阶段的顺序访问
        //当为false或不存在时,默认按照冒泡顺序
        //我们最常用的就是冒泡排序  

        //第一种访问方式: 总是会先访问外层节点(广告就是这样恶心人的)
        // let div = document.querySelector('.father');
        //  div.addEventListener('click', function () {
        //      alert('father')
        //   }, true)
        //   let div1 = document.querySelector('.son');
        //   div1.addEventListener('click', function () {
        //      alert('son')
        // }, true)  

        //第二种访问方式: 会先访问最内层的节点,然后依次访问包含它的外层元素
        let div = document.querySelector('.father');
        div.addEventListener('click', function () {
            alert('father')
            //点击在father而不在son的区域,会弹出father和document
        })
        let div1 = document.querySelector('.son');
        div1.addEventListener('click', function () {
            alert('son')
 
   //4.阻止事件冒泡的两种方式
            //e.stopPropagation() //dom推荐使用的方法,此方法在这里使用后使用后,点击son元素, 只会弹出一个窗口  
            e.cancelBubble = true;//非标准方法
 
            //如果son不在father的区域内,那点击son所在的div就不会访问father的click事件
        })
        document.addEventListener('click', function () {
            alert('document')
        })
    </script>
 
事件对象
<body>
    <div>1</div>
    <script>
        //事件对象:是包含了事件相关的一系列的数据集合
        //1.没有事件,就没有事件对象,它是系统给我们创建的,不需要传递参数
        //2.下面的event就是一个事件对象,写在侦听函数的括号内,看作形参,可以自由命名
        //3.如果是鼠标事件,它就包括了鼠标的坐标信息,绑定对象等,
        //如果是键盘信息就包括了按下了那个键等信息
        var div = document.querySelector('div')
        //传统方式
        div.onclick = function (event) {
            console.log(event)
        }
        //H5新增的addeventlistener
        div.addEventListener('click', function (e) {
            console.log(e)
        })
 
  //  常见事件对象的属性和方法
            //1.  e.target 返回的是触发事件的对象; this 返回的是绑定事件的对象(元素)
            //区别:e.target是你点击了谁就返回谁,比如你点击了ul的子元素li,那么就返回该li
            // this是哪个元素绑定了这个点击事件,就返回谁,你点击了ul的子元素li,但是只绑定了ul元素就返回ul
            var ul = document.querySelector('ul')
            ul.addEventListener('click', function (e) {
                console.log(e.target) //如果点击aa,返回的是  <li>aa </li>
                console.log(this)//如果点击aa,返回的是 ul整体 包含所有li
            })
            //2. e.currentTarget和this非常相似  
            //3. 返回事件类型  e.type  返回的是不带on的事件 如click
            ul.addEventListener('click', fn)
            ul.addEventListener('mousemove', fn)
            ul.addEventListener('mouseout', fn)
            function fn(e) {
                console.log(e.type) //click
            }
            //4.0阻止默认行为(事件) 让连接不跳转 或 让提交按钮不提交
            var a = document.querySelector('a');
            a.addEventListener('click', function (e) {
                e.preventDefault();// dom标准写法
            })
            //4.1传统的注册方式
        a.onclick = function (e) {
            // e.preventDefault();  //普通浏览器也可以用
            // return false  也可以阻止默认行为,但是return后面的代码无法执行
        }
    </script>
</body>

 鼠标和键盘事件

鼠标事件:mouseenter和mousemove的不同 :

 document.addEventListener('click', function (e) {
            //1.clientX/Y鼠标在浏览器窗口可视区的XY坐标,和滚动条位置无关  
            // 坐标系原点在左上角(0,0)
            console.log(e.clientX);//相对于左边
            console.log(e.clientY)//相对于上边
            //2.pageX/Y 鼠标在整个文档页面的XY坐标
            console.log(e.pageX)
            console.log(e.pageY)
            //3.screenX 相对于电脑屏幕的XY坐标
        })


        //案例: 让鼠标有个天使图片一直跟随
        //鼠标移动事件: mousemove  
        //在整个页面中,给document注册事件
        var img = document.querySelector('img')
        document.addEventListener('mousemove', function (e) {
            //原理: 每次移动鼠标,都获得最新的数遍坐标,把这个x和y坐标赋值给
            //图的top和left值
            //  ps:一定要给top和left值拼接px
            var x = e.pageX;
            var y = e.pageY;
            img.style.top = y - 25 + 'px';
            img.style.left = x - 35 + 'px';
        })

        //常用的键盘事件(多用的是keydown和keyup)
        //1.keyup 按键抬起的时候触发      
        // document.onkeyup = function () {
        //   console.log('弹起了一个键')
        // }
        document.addEventListener('keyup', function () {
            console.log('弹起了一个键')
        })
        //2.keydown 按下的时候触发  
        document.addEventListener('keydown', function () {
            console.log('按下了一个键down')
        })
        //3.keypress 按下的时候触发~ 但是它不识别功能键 如左右箭头 shift
        //注意  可以识别enter!!!
        document.addEventListener('keypress', function () {
            console.log('我也按下了一个键press')
        })
        //4.对于按键: 三个事件的执行顺序是  down-press-up


        //键盘事件对象
        //键盘事件对象的keycode属性 可以返回对应的键的asxcII值
        //01.keyup和keydown不区分大小写  a和A都是65
        //02.keypress事件区分大小写 大写A 65 小写a 97
        document.addEventListener('keyup', function (e) {
            console.log('UP:' + e.keyCode)
        })
        document.addEventListener('keypress', function (e) {
            console.log('press:' + e.keyCode) //97
            if (e.keyCode === 97) {
                alert('你按了a')
            }
            else {
                alert('你没按a')
            }
        })
    </script>

 

键盘事件案例 

 css:
  <style>
        .search {
            position: relative;
            width: 178px;
            margin: 100px;
        }

        .jd {
            position: absolute;
            top: 0px;
        }

        .con {
            display: none;
            position: absolute;
            top: -50px;
            width: 171px;
            border: 1px solid black;
            box-shadow: 0 2px 4px black;
            padding: 5px 0;
            font-size: 18px;
            line-height: 20px;
            color: #333;
        }

        .con::before {
            content: '';
            width: 0;
            position: absolute;
            top: 28px;
            left: 18px;
            border: 8px solid rgb(82, 77, 77);
            border-style: solid dashed dashed;
            border-color: rgb(216, 223, 223) transparent transparent;
        }
    </style>
 
 
 主代码:

<body>
    <input type="text">
 
 
    <div class="search">
        <div class="con">123</div>
        <input type="text" placeholder="请输入您的快递单号" class="jd">

    </div>
    <script>
        //模拟京东搜索框,即按s键定位到搜索框输入内容
        //思路:检测用户是否输入了s ,如果输入了,就把光标定位到搜索框里面
        //使用键盘事件 keycode() 判断s的按下
        // 使用focus()方法获得焦点
        var inp = document.querySelector('input')
        document.addEventListener('keyup', function (e) {
            console.log(e.keyCode)
            if (e.keyCode === 83) {
                inp.focus();
            }
        })

        //京东快递单号查询,在输入框的上面显示输入大号字体
        //输入内容时,上面的大号字体盒子con 同步显示输入的内容
        //如果快递单号为空,则隐藏大号字体盒子con
        // 注意: keydown和keypress在文本框中的特点:这两个事件触发的时候,文字还未进入文本框
        //所以这里用 keyup最合适
        var con = document.querySelector('.con')
        var input_jd = document.querySelector('.jd')
        input_jd.addEventListener('keyup', function () {
            if (this.value == '') {
                con.style.display = 'none'
            } else
                con.style.display = 'block'
            con.innerHTML = this.value;
        })
        //当输入文本框失去焦点时, 上面的大号字体盒子隐藏,反之出现
        input_jd.addEventListener('blur', function () {
            con.style.display = 'none';
        })
        input_jd.addEventListener('focus', function () {
            if (this.value !== '') {
                con.style.display = 'block';
            }
        })
    </script>

 

 

 

posted @ 2022-01-04 20:42  我的猫在哪里  阅读(46)  评论(0)    收藏  举报