JavaScript 事件处理

事件处理

事件
发生在HTML元素上的事情,可以是用户行为,也可以是浏览器的行为

  • 用户点击了某个HTML元素
  • 用户将鼠标移动到某个HTML元素上
  • 用户输入数据时光标离开
  • 页面加载完成

事件源:时间触发的源头,即触发事件的元素,如按钮,输入框,超链接
事件对象:当一个事件发生时,这个事件相关的详细信息会被保存到一个对象中,称为event对象
事件监听:监听事件的发生,绑定事件函数,当事件触发后执行该事件函数,即回调函数

绑定事件
三种方式:

  • 静态绑定,通过为标签的事件属性赋值
<input type="button" value="按钮" onclick="fn()">
  • 动态绑定,通过为DOM对象的事件属性赋值
    <script>
        var btn = document.getElementById("btn")
        btn.onclick = function(){
            console.log('动态绑定')
        }
    </script>
</head>

<body>
    <input type="button" value="按钮" id="btn">
</body>
  • 动态绑定 通过DOM对象进行事件监听,使用addEventistene(“时间名”,回调函数)
    <script>
        var btn = document.getElementById("btn")
        btn.addEventListener ('click' function(){
            console.log('动态绑定')
        })
    </script>
</head>

<body>
    <input type="button" value="按钮" id="btn">
</body>

事件对象

    <script>
        window.onload=function(){
            var btn = document.getElementById("btn")
            btn.onclick=function(event){ //事件触发时会自动为回调函数传入一个参数,表示event事件对象
                console.log(event,typeof event,event,type)
                console.log(this==event.target) //this表示事件源
            }
        }
       
        function f1(e) {
            console.log(e)
        }
    </script>
</head>

<body>
    <input type="button" value="按钮" id="btn">
     //静态事件绑定 需要在绑定事件回调函数时接收时间对象参数
    <button onclick="f1(event)">click me</button>
</body>

注意
可以通过事件回调函数的第一个参数获取事件对象event

target 事件的目标元素,即事件源
type 事件类型
timestamp 事件生成的日期和时间
clientX 当事件被触发时,鼠标指针的水平坐标
clientY 当事件被触发时,鼠标指针的垂直坐标

在这里插入图片描述

鼠标事件

时间名描述
onclick鼠标单击
ondbclick鼠标双击
onmouseover鼠标移到某元素之上
onmouseout鼠标从某元素上移开
onmouseup鼠标按键被松开
onmousedown鼠标按键被按下
onmousemove鼠标被移动
    <script>
        window.onload = function() {
            var btn = document.getElementById('btn')
                //    btn.onclick=function(){
            btn.onmouseover = function() {
                console.log('点击事件')
            }
        }
    </script>
</head>

<body>
    <input type="button" value="按钮" id="btn">

</body>

键盘事件

事件名描述
onkeydown某个键盘的健被按下
onkeyup某个键盘的键被松开
onkeypress某个键盘的键被按下去且松开
    <script>
        window.onload = function() {
            var username = document.getElementById('username')
            username.onkeydown = function() {
                console.log('111')
            }
            username.onkeypress = function() {
                console.log('222')
            }
            username.onkeyup = function() {
                console.log('333')
            }
            // 获取事件对象
            username.onkeyup = function(e) {
                console.log(e)
            }

        }
    </script>
</head>

<body>
    <input type="button" value="按钮" id="btn"> 用户名:
    <input type="text" id="username">

</body>

在这里插入图片描述
示例
按回车的时候再控制台输出

    <script>
        window.onload = function() {
            var username = document.getElementById('username')
            username.onkeyup = function(e) {
                //按键码
                if (e.keyCode == 13) {
                    console.log(e.keyCode)
                }
            }
        }
    </script>
</head>

<body>
    <input type="button" value="按钮" id="btn"> 用户名:
    <input type="text" id="username">

</body>

表单事件

事件名描述
onfocus元素获得焦点
onblur元素失去焦点
onchange域的内容发生改变,一般用于文件选择器和下拉列表
onselect文本内容被选中
onsubmit表单提交时触发,回调函数返回true表示允许表单提交,返回false表示阻止表单提交

onfocus onblur
示例

    <script>
        window.onload = function() {
            // var username = document.getElementById('username')
            // username.onfocus = function() {
            //     username.classList.add('border')
            // }

            document.getElementById('username').onfocus=function(){
                //this 指事件源
                this.classList.add('border')
            }
            username.onblur = function() {
                username.classList.remove('border')
            }
        }
    </script>
    <style>
        #username {
            outline: 0;
        }
        
        .border {
            border: 1px solid red;
        }
    </style>
</head>

<body>
    <input type="button" value="按钮" id="btn"> 用户名:
    <input type="text" id="username">

</body>

在这里插入图片描述
点击输入框获取焦点,离开输入框失去焦点,进而触发事件,比较常用

onchange

<script>
        window.onload = function() {
            document.getElementById('pro').onchange = function() {
                console.log(this.checked)
            }
        }
    </script>
</head>

<body>
    爱好:<input type="checkbox" name="hobby" id="pro" value="pro" checked>

</body>

在这里插入图片描述

在这里插入图片描述

示例2
头像设置

    <script>
        window.onload = function() {
            document.getElementById('pro').onchange = function() {
                // console.log(this.files[0]) //获取选择的文件数据
                                                                //可以自动获取用户更换图片的路径
                document.getElementById('image').src = window.URL.createObjectURL(this.files[0])
            }
        }
    </script>
    <style>
        #image {
            width: 120px;
            height: 120px;
        }
        
        #pro {
            display: none;
        }
    </style>
</head>

<body>
    头像:<input type="file" id="pro" multiple>
    <label for="pro">
        <img src="../images/baidu.png" id="image">
    </label>
</body>


在这里插入图片描述
默认的baidu图片换成当前的1

onselect
文本选中


    <style>
        #email {
            outline: 0;
        }
        
        .border {
            border: 1px solid red;
        }
    </style>
    <script>
        window.onload = function() {
            document.getElementById('email').onselect = function() {
                this.classList.add('border')
            }
        }
    </script>
</head>

<body>
    邮箱:<input type="text" id="email" value="xxx.com">
</body>

在这里插入图片描述

onsubmit

    <script>
        window.onload = function() {
            document.getElementById('frm').onsubmit = function() {
                //判断表单内容是否符合要求
                var email = document.getElementById('email').value
                if (email == '') {
                    return false
                }
                return true
            }
        }
    </script>
<body>
    <form action="" id="frm">
        用户名: <input type="text" id="username"><br> 邮箱:
        <input type="text" id="email" value="xxx.com" name="email"><br>
        <input type="submit" value="提交">
    </form>

</body>

在这里插入图片描述

案例:实现复选框

    <script>
        window.onload = function() {
            //实现全选和取消全选效果
            var all = document.getElementById('all');
            all.onchange = function() {
                    var items = document.getElementsByName('item')
                    for (var item of items) {
                        // 点击全选按钮,将时间源的改变属性赋值给其他复选框
                        item.checked = this.checked;
                    }
                }
                // 实现当选中下面所有复选框时自动选中全选
            var items = document.getElementsByName('item')
            for (var item of items) {
                item.onchange = function() {
                    //先默认选中全选
                    all.checked = true
                        //判断只要有一个没选中,则不勾选全选
                    for (var ele of items) {
                        if (!ele.checked) {
                            all.checked = false
                            break
                        }
                    }

                }
            }
        }
    </script>
</head>

<body>
    <table id="mytal">
        <thead>
            <tr>
                <th>全选 <input type="checkbox" id="all"></th>
                <th>序号</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>性别</th>
                <th>爱好</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td><input type="checkbox" name="item"></td>
                <td>1</td>
                <td>jibu</td>
                <td>age</td>
                <td>male</td>
                <td>eat</td>
            </tr>
            <tr>
                <td><input type="checkbox" name="item"></td>
                <td>1</td>
                <td>jibu</td>
                <td>age</td>
                <td>male</td>
                <td>eat</td>
            </tr>
            <tr>
                <td><input type="checkbox" name="item"></td>
                <td>1</td>
                <td>jibu</td>
                <td>age</td>
                <td>male</td>
                <td>eat</td>
            </tr>
        </tbody>
    </table>
</body>

在这里插入图片描述

事件操作

事件流
概念:当一个HTML元素产生事件时,该事件会在当前元素与根元素之间按特定的顺序传播,所有经过的节点都会收到该事件并执行,这个传播过程就是DOM事件流
分类:事件冒泡,事件捕获。

  • 事件冒泡:当一个元素上的事件被触发时,事件从事件源开始,往上冒泡直到页面的根元素,这一过程被称为事件冒泡(默认方式)
  • 事件捕获:当一个元素上的事件被触发时,事件从页面根元素开始,往下直到事件目标元素,这一过程被称为事件捕获

事件冒泡示例:


    <script>
        function test(name) {
            console.log(name)

        }
    </script>

    <style>
        div {
            border: 1px solid black;
        }
        
        .div1 {
            width: 200px;
            height: 200px;
        }
        
        .div2 {
            width: 150px;
            height: 150px;
        }
        
        .div3 {
            width: 100px;
            height: 100px;
        }
    </style>

</head>

<body>
    <div class="div1" onclick="test('div1')"> div1
        <div class="div2" onclick="test('div2')"> div2
            <div class="div3" onclick="test('div3')">div3 </div>
        </div>
    </div>
</body>

在这里插入图片描述
事件捕获


    <script>
        function $(id) {
            return document.getElementById(id)
        }

        window.onload = function() {
            $('div1').addEventListener('click', function() {
                    console.log('div1')
                }, true) //第三个参数为true表示采用事件捕获,默认为false表示事件冒泡

            $('div2').addEventListener('click', function() {
                console.log('div2')
            }, true)

            $('div3').addEventListener('click', function() {
                console.log('div3')
            }, true)
        }
    </script>

    <style>
        div {
            border: 1px solid black;
        }
        
        #div1 {
            width: 200px;
            height: 200px;
        }
        
        #div2 {
            width: 150px;
            height: 150px;
        }
        
        #div3 {
            width: 100px;
            height: 100px;
        }
    </style>

</head>

<body>
    <div id="div1"> div1
        <div id="div2"> div2
            <div id="div3">div3 </div>
        </div>
    </div>
</body>

在这里插入图片描述

阻止事件冒泡

<script>
        function $(id) {
            return document.getElementById(id)
        }

        window.onload = function() {
            $('div1').addEventListener('click', function() {
                    console.log('div1')
                }, false) //第三个参数为true表示采用事件捕获,默认为false表示事件冒泡

            $('div2').addEventListener('click', function(event) {
                console.log('div2')
                event.stopPropagation(); //阻止事件冒泡
            }, false)

            $('div3').addEventListener('click', function() {
                console.log('div3')
            }, false)
        }
    </script>

    <style>
        div {
            border: 1px solid black;
        }
        
        #div1 {
            width: 200px;
            height: 200px;
        }
        
        #div2 {
            width: 150px;
            height: 150px;
        }
        
        #div3 {
            width: 100px;
            height: 100px;
        }
    </style>

</head>

<body>
    <div id="div1"> div1
        <div id="div2"> div2
            <div id="div3">div3 </div>
        </div>
    </div>
</body>

在这里插入图片描述
点击div3,执行到div2停止,不让其冒泡

事件代理/事件委托
概念:利用事件冒泡/事件捕获机制,通过给父元素绑定事件,从而实现对所有子元素的事件管理,无需为每个子元素绑定事件
优点:
1)减少事件注册,降低内存占有
2)新增元素时实现动态绑定事件

    <script>
        window.onload = function() {
            var lis = document.querySelectorAll('li')
            for (var li of lis) {
                li.onclick = function() {
                    console.log(this)
                }
            }
        }

        function add() {
            var li = document.createElement('li')
            li.innerText = 'li5'
            document.querySelector('ul').appendChild(li)
        }
    </script>
</head>

<body>
    <button onclick="add()">添加li</button>
    <ul>
        <li>li1</li>
        <li>li2</li>
        <li>li3</li>
        <li>li4</li>
    </ul>
</body>

在这里插入图片描述
新增的元素需要手动绑事件

  <script>
        window.onload = function() {
            // var lis = document.querySelectorAll('li')
            // for (var li of lis) {
            //     li.onclick = function() {
            //         console.log(this)
            //     }
            // }
            // 这里的e指的是点击的li而非ul
            document.querySelector('ul').onclick = function(e) {
                console.log(e.target.innerText)
            }
        }

        function add() {
            var li = document.createElement('li')
            li.innerText = 'li5'
                // li.onclick = function() {
                //     console.log(this)
                // }
            document.querySelector('ul').appendChild(li)
        }
    </script>
</head>

<body>
    <button onclick="add()">添加li</button>
    <ul>
        <li>li1</li>
        <li>li2</li>
        <li>li3</li>
        <li>li4</li>
    </ul>
</body>

在这里插入图片描述
利用事件冒泡原理,给其父元素绑定事件,如此不用给子元素单个绑定事件

这里需要注意一点:之前的理解是this==e.target,但是在这里不是,这里this还是指事件源ul,而e代表的是点击的元素

事件默认行为
概念:当一个事件发生时浏览器自己会默认做的失去,如:点击连接时默认会跳转,邮件点击时默认会弹出菜单
阻止事件的默认行为:e.preventDefault()

    <script>
        function print(e) {
            console.log(111)
            e.preventDefault(); //阻止事件默认行为

        }
    </script>
</head>

<body>
    <button oncontextmenu="print(event)">右键点击</button>
    <br>
    <a href="https://www.baidu.com" onclick="print(event)">百度</a>
    
    <a href="javascript:print(event)" onclick="print(event)">百度</a>
</body>

在这里插入图片描述
上面的示例:超链接默认会跳转,这里阻止其默认行为

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

季布,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值