JavaScript的第九天

目录

一、注册事件的两种方式

        1、传统的注册事件

        2、事件侦听注册事件:addEventListener('click',function(){})

二、删除事件的两种方式

        1、传统方式删除方式

        2、删除事件:removeEventListener

三、dom事件流的三个阶段

        1、DOM事件流的三个阶段是捕获阶段、目标阶段和冒泡阶段。

        2、冒泡阶段是由内向外

        3、捕获阶段是由外向内

四、事件对象:event

五、事件对象:e.target

        1、e.target 返回的是触发事件的对象(元素)

        2、this 返回的是绑定事件的对象(元素)

六、事件对象阻止默认行为:e.preventDefault()

        1、阻止默认行为(事件) 让链接不跳转 或者让提交按钮不提交        

        2、使用return false来阻止默认行为,没有兼容性问题

阻止事件冒泡的案例:

七、事件委托 

        原理在于使用侦听器检测父节点点击事件和点击位置,然后通过冒泡来影响子节点,完成点击时单独触发的效果

 完整代码如下:

八、常见鼠标事件 

        1. contextmenu 禁用右键菜单

        2、selectstart  禁止选中

        3、鼠标事件对象

                (1)在进行上下距离测量时,文档页面需额外测量

                (2)可以使用事件对象检测来改变鼠标样式

九、常见的键盘事件

        1、keyup:按键弹起时触发

        2、keydown:按键落下时触发

        3、keypress:功能键时事件不会发生

        keyCode属性可以的到相应的ASCII码值

案例模拟: 

        1.模拟京东按键输入内容

        2、模拟京东快递单号查询案例


一、注册事件的两种方式

        1、传统的注册事件

                事件源+事件类型+事件处理程序

        btn.onclick = function () {
            console.log(1);
        }

        btn.onclick = function () {
            console.log(2);
        }

        2、事件侦听注册事件:addEventListener('click',function(){})

                (1) 里面的事件类型是字符串,必定加引号,而且不带on

                (2) 同一个元素 同一个事件可以添加多个侦听器(事件处理程序)

        btn1.addEventListener("click", function () {
            console.log(2);
        })
        btn1.addEventListener("click", function () {
            console.log(4);
        })

        btn1.addEventListener("mouseout", function () {
            console.log(3);
        })

二、删除事件的两种方式

        1、传统方式删除方式

                将一个空白纸赋值给事件源,达到删除事件的效果

    var divs = document.querySelectorAll("div")
    divs[0].onclick = function () {
      console.log(1);
      this.onclick = null
    }

        2、删除事件:removeEventListener

                        divs.removeEventListener('click',fn)

    divs.addEventListener("click", fn)
    function fn() {
      console.log(2);
      this.removeEventListener("click", fn)
    }



    divs.removeEventListener("click", fn)

三、dom事件流的三个阶段

        1、DOM事件流的三个阶段是捕获阶段目标阶段冒泡阶段。

                JS 代码中只能执行捕获或者冒泡其中的一个阶段,onclick 只能得到冒泡阶段。即在使用onclick作为事件类型时,只能执行冒泡阶段。

        2、冒泡阶段是由内向外

                如果addEventListener的第三个参数是 false 或者省略那么则处于冒泡阶段,此时的顺序为son -> father ->body -> html -> document。

        3、捕获阶段是由外向内

                如果addEventListener的第三个参数是 true 那么则处于捕获阶段。

                此时的顺序为document -> html -> body -> father -> son

        var father = document.querySelector(".father ")
        var son = document.querySelector(".son ")

        father.addEventListener("click", function () {
            console.log("father");
        }, true)

        son.addEventListener("click", function () {
            console.log("son");
        }, true)

        document.body.addEventListener("click", function () {
            console.log("body");
        }, true)

        document.documentElement.addEventListener("click", function () {
            console.log("document");
        }, true)

四、事件对象:event

        事件对象只有有了事件才会存在,它是系统给我们自动创建的,不需要我们传递参数,event 就是一个事件对象,需写到我们侦听函数的小括号里面当形参来看,在目前阶段形参内写入任何字符都会作为事件对象。

        事件对象是我们事件的一系列相关数据的集合跟事件相关的,比如鼠标点击里面就包含了鼠标的相关信息,鼠标坐标,如果是键盘事件里面就包含的键盘事件的信息。比如判断用户按下了哪个键。

        这个事件对象我们可以自己命名 比如 event 、 evt、 e、或者更多的字符


        div.addEventListener("click", function (event) {
            console.log(event);
            // console.log(e.pageX);
        })

五、事件对象:e.target

        1、e.target 返回的是触发事件的对象(元素)

                e.target 点击了那个元素,就返回那个元素

        2、this 返回的是绑定事件的对象(元素)

                哪个元素绑定了这个点击事件,就返回该元素  

        var ul = document.querySelector("ul")
        var li = document.querySelector("li")
        li.addEventListener("click", function (e) {
            console.log(e.target);
        })

        ul.addEventListener("click", function (e) {
            console.log(e.target);
        })

六、事件对象阻止默认行为:e.preventDefault()

        1、阻止默认行为(事件) 让链接不跳转 或者让提交按钮不提交        

            var a = document.querySelector("a")
            var ipt = document.querySelector("input")
            a.addEventListener("click", function (e) 
            {
                console.log(e);
                e.preventDefault()
            })

        2、使用return false来阻止默认行为,没有兼容性问题

                特点: return 后面的代码不执行了, 而且只限于传统的注册方式

        var a = document.querySelector("a")
        var ipt = document.querySelector("input")
        ipt.onclick = function (e) {
            console.log(e);
            return false
        }

阻止事件冒泡的案例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .father {
            overflow: hidden;
            width: 300px;
            height: 300px;
            margin: 100px auto;
            background-color: red;
            text-align: center;
        }

        .son {
            width: 200px;
            height: 200px;
            margin: 50px;
            background-color: purple;
            line-height: 200px;
            color: #fff;
        }
    </style>
</head>

<body>
    <div class="father">
        <div class="son">son儿子</div>
    </div>
    <script>
        // 常见事件对象的属性和方法
        // 阻止冒泡  dom 推荐的标准 e.stopPropagation() 
        var father = document.querySelector(".father ")
        var son = document.querySelector(".son ")

        father.addEventListener("click", function () {
            console.log("father");
        })

        son.addEventListener("click", function (e) {
            console.log("son");
            e.stopPropagation();

        })

        document.body.addEventListener("click", function (e) {
            console.log("body");
        })

        document.documentElement.addEventListener("click", function () {
            console.log("document");
        })


    </script>
</body>

</html>

七、事件委托 

        原理在于使用侦听器检测父节点点击事件和点击位置,然后通过冒泡来影响子节点,完成点击时单独触发的效果

        var ul = document.querySelector("ul")
        // 利用冒泡原理  委托父级去执行
        ul.addEventListener("click", function (e) {
            e.target.style.color = "#0f0"
        })

        // var lis = document.querySelectorAll("li")
        // for (var i = 0; i < lis.length; i++) {
        //     lis[i].addEventListener("click", function () {
        //         this.style.color = "#0f0"
        //     })
        // }

 完整代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <ul>
        <li>知否知否,点我应有弹框在手!1</li>
        <li>知否知否,点我应有弹框在手!2</li>
        <li>知否知否,点我应有弹框在手!3</li>
        <li>知否知否,点我应有弹框在手!4</li>
        <li>知否知否,点我应有弹框在手!5</li>
    </ul>
    <script>
        // 事件委托的核心原理:给父节点添加侦听器, 利用事件冒泡影响每一个子节点
        // var lis = document.querySelectorAll("li")
        // for (var i = 0; i < lis.length; i++) {
        //     lis[i].addEventListener("click", function () {
        //         this.style.color = "#0f0"
        //     })
        // }

        var ul = document.querySelector("ul")
        // 利用冒泡原理  委托父级去执行
        ul.addEventListener("click", function (e) {
            e.target.style.color = "#0f0"
        })


    </script>
</body>

</html>

八、常见鼠标事件 

        1. contextmenu 禁用右键菜单

    var div = document.querySelector("div")
    div.addEventListener("contextmenu", function (e) {
      e.preventDefault()
    })

        2、selectstart  禁止选中

    div.addEventListener("selectstart", function (e) {
      e.preventDefault()
    })

        3、鼠标事件对象

                (1)在进行上下距离测量时,文档页面需额外测量
                (2)可以使用事件对象检测来改变鼠标样式
        // 鼠标事件对象 MouseEvent
        document.addEventListener('click', function (e) {

            // 1.浏览器窗口可视区 clientX clientY
            // console.log(e.clientX);
            console.log(e.clientY);
            console.log("--------------");

            // 2.文档页面  pageX  pageY
            // console.log(e.pageX);
            console.log(e.pageY);
            console.log("--------------");

            // 3.电脑屏幕  screenX  screenY
            // console.log(e.screenX);
            console.log(e.screenY);
            console.log("--------------");
        })

九、常见的键盘事件

        1、keyup:按键弹起时触发

        2、keydown:按键落下时触发

        在使用这两种键盘事件时,移动光标也会在控制台产生事件

    var ipt= document.querySelector("input")

    ipt.addEventListener("keyup",function(e)
    {
        if (e.keyCode==13)
        //判断ASCII码值是否为13
        console.log(this.value);
    }
            )

        3、keypress:功能键时事件不会发生

        相较于上面的键盘事件,keypress事件在移动光标时不会产生新的事件

       ipt.addEventListener("keypress",function(e)
        {
            console.log(this.value);
            if(e.keyCode==13) console.log(this.value);
        }
                            )

        keyCode属性可以的到相应的ASCII码值

                1. 我们的keyup 和keydown事件不区分字母大小写  a 和 A 得到的都是65

                2. 我们的keypress 事件 区分字母大小写  a  97 和 A 得到的是65

        var ipt =document.querySelector("input")
            ipt.addEventListener("keyup",function(e)
            {
                console.log(e.keyCode)
            }
                )
        ipt.addEventListener("keypress",function(e)
            {console.log(e.keyCode);
            })

案例模拟: 

        1.模拟京东按键输入内容

       var ipt=document.querySelector("input")
       document.body.addEventListener("keyup",function(e)
            {
               console.log("e.keyCode")
                if(e.keyCode == 83) ipt.focus()
            }
            )
    // 核心思路: 检测用户是否按下了s 键,如果按下s 键,就把光标定位到搜索框里面  
        //e.keyCode == 83
    // 使用键盘事件对象里面的keyCode 判断用户按下的是否是s键

        2、模拟京东快递单号查询案例

        // 快递单号输入内容时, 上面的大号字体盒子(con)显示(这里面的字号更大)
        // 表单检测用户输入: 给表单添加键盘事件
        // 同时把快递单号里面的值(value)获取过来赋值给 con盒子(innerText)做为内容
        // 如果快递单号里面内容为空,则隐藏大号字体盒子(con)盒子

        // 1.考虑事件源  input keyup  focus blur
        // 2.focus 有值和空值
        // 有值:div显示 并且将value值给div
        // 空值:div不显示
        // 3.blur  div 不显示
        // 4.keyup
        // 有值:div显示 并且将value值给div
        // 空值:div不显示 

    var ipt=document.querySelector("input")
    var div =document.querySelector(".con")
        ipt.addEventListener("focus",function()
        {
                 if (this.value) {
                div.style.display = "block"
                div.innerHTML = this.value
            }
        })

        ipt.addEventListener("blur", function () {
            div.style.display = "none"
        })

        ipt.addEventListener("keyup", function () {
            if (this.value) {
                div.style.display = "block"
                div.innerHTML = this.value
            } else {
                div.style.display = "none"
            }
        })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值