事件监听和this的拓展

一、事件监听

1.以前写的代码都是自动执行的,我们希望一段代码在某个特定的时机才去执行,比如   点击按钮可以弹出警示框 ;  比如鼠标经过显示下拉菜单等等;那我们怎么实现事件触发时 JavaScript 可以执行一些代码呢?---事件监听

2.事件发生后,想要执行的代码写到事件处理函数里面 ;当触发指定的事件时,则事件处理函数就会被执行 ;事件监听是将事件处理函数注册到元素对象身上 。

3.事件监听也称为: 事件注册、事件绑定。事件监听就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应。比如鼠标经过显示下拉菜单,比如点击可以播放轮播图等等 就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应,也称为绑定事件或者注册事件比如鼠标经过显示下拉菜单,比如点击可以播放轮播图等等

4.语法:元素对象.addEventListener('事件类型' , 事件处理函数)

5.注意:

(1)事件类型要加引号,小写

(2)函数是点击之后再去执行,每次点击都会执行一次

二、事件类型

事件类型的大小写敏感的字符串,统一用小写字母

1.鼠标事件类型:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>鼠标事件类型</title>
    <style>
        .box {
      width: 200px;
      height: 200px;
      background-color: pink;
    }
    </style>
</head>
<body>
    <div class="box"></div>

    <script>
        // 1.获取事件源
        const box = document.querySelector('.box')

        // 2.绑定事件
        // 1.鼠标点击  click
        box.addEventListener('click' , function(){
            console.log('鼠标点击了盒子')
        })

            // 2.鼠标进入   mouseenter
            box.addEventListener('mouseenter' , function(){
                console.log('鼠标进入了')
            })

            // 3.mouseleave
            box.addEventListener('mouseleave' , function(){
                console.log('鼠标移出')
            })

    </script>
</body>
</html>

2.键盘事件:

input事件和键盘事件代码

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>input事件和键盘事件</title>
    <style>
        textarea {
            width: 300px;
            height: 30px;
            padding: 10px;
            border-color: transparent;
            outline: none;
            resize: none;
            background: #f5f5f5;
            border-radius: 4px;
        }
    </style>
</head>

<body>
    <textarea id="tx" placeholder="发一条友善的评论" rows="2"></textarea>
    <script>
        // 获取元素
        const tx = document.querySelector('#tx')

        // 1. 键盘事件 
        // 1.1 键盘按下事件  keydown  当我们按下键盘的时候就触发
        tx.addEventListener('keydown', function () {
            console.log('我是keydown事件' + tx.value)
        })

        // 1.2 键盘弹起事件  keyup 当我们键盘弹起的时候就触发
        tx.addEventListener('keyup', function () {
            console.log('我是keyup事件' + tx.value)
        })

        // 2. 用户输入事件 input ,是表单value的值发生变化的时候触发
        tx.addEventListener('input', function () {
            console.log('我是input事件' + tx.value)
        })

    // 3. 注意事项
    // 3.1 执行顺序  keydown →  input   →  keyup
    // 3.2 keydown 无法获取最新的value, keyup和input可以得到用户输入内容

    </script>
</body>

</html>

3.焦点事件类型

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>点击事件</title>
    <style>
        [type=text] {
            width: 245px;
            height: 50px;
            padding-left: 20px;
            border: 1px solid #ccc;
            font-size: 17px;
            outline: none;
        }
    </style>
</head>

<body>
    <input type="text" class="search-text">
    <input type="text" class="search">

    <script>
        // 获取焦点 fous
        // 1.获取事件源
        const search_text = document.querySelector('.search-text')

        // 1.2 绑定事件
        search_text.addEventListener('focus', function () {
            console.log('我获取焦点了')
        })

        // 1.3 失去焦点 blur
        search_text.addEventListener('blur', function () {
            console.log('失去了焦点')
        })

        // 2. 拓展 自动获得焦点 focus()    自动失去焦点 blur()
        // 2.1 语法: 元素.focus()  比如百度首页搜索框自动获得焦点
        const search = document.querySelector('.search')
        search.focus()
    </script>
</body>

</html>

三、事件对象 

1.事件对象是什么?

也是个对象,这个对象里有事件触发时的相关信息,包含属性和方法 ;例如:鼠标点击事件中,事件对象就存了鼠标点在哪个位置等信息

2.使用场景

(1)可以判断用户按下哪个键,比如按下回车键可以发布新闻

(2)可以判断鼠标点击了哪个元素,从而做相应的操作

3.语法:

(1)注册事件中,回调函数的第一个参数就是事件对象

(2)一般命名为event、ev、e

4.事件对象-常见属性

四、拓展知识

4.1 环境对象-this

1.环境对象:指的是函数内部特殊的 this , 它指向一个对象,并且受当前环境影响

2.作用:弄清楚this的指向,可以让我们代码更简洁

3.函数的调用方式不同,this 指代的对象也不同

4.【谁调用, this 就是谁】 是判断 this 指向的粗略规则

5.直接调用函数,其实相当于是 window.函数,所以 this 指代 window

4.2 排他思想

排他思想是一种思路,目的是突出显示某个元素 ;比如,有多个元素,当鼠标经过时,只有当前元素会添加高亮样式,其余的元素移除样式

口诀:注意顺序

①:排除其他人

②:保留我自己

4.3 伪类选择器在全选上的应用

注意:伪类选择器只有一个冒号

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>伪类选择器的应用</title>
    <style>
        /* 选择被勾选的复选框 */
        .ck:checked{
            width: 50px;
            height: 50px;
        }
    </style>
</head>
<body>
    <input type="checkbox" name="" id="" class="ck">
    <input type="checkbox" name="" id="" class="ck">
    <input type="checkbox" name="" id="" class="ck">
    <input type="checkbox" name="" id="" class="ck">
    <input type="checkbox" name="" id="" class="ck">
</body>
</html>

效果展示:

伪类选择器的案例-全选

需求:

1.点击大的全选按钮时,小全选按钮会自动全部被选中

2.小的全选按钮都被选中以后,大的全选按钮也会自动被选中

代码展示:

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>全选按钮</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        table {
            border: 1px solid #ccc;
            margin: 200px auto;
            border-collapse: collapse;
        }

        th {
            font-size: 20px;
            font-weight: 900;
            background-color: pink;
        }

        th,
        td {
            width: 100px;
            height: 30px;
            text-align: center;
            line-height: 50px;
            border: 1px solid #d0d0d0;
            color: #404060;
            padding: 10px;
        }

        .all {
            margin-left: 10px;
        }

        .allCheck {
            width: 80px;
        }
    </style>
    <script>

    </script>
</head>

<body>
    <table>
        <tr>
            <th class="allCheck">
                <input type="checkbox" name=" " id="checkAll"><span class="all">全选</span>

            </th>
            <th>商品</th>
            <th>商家</th>
            <th>价格</th>
        </tr>
        <tr>
            <td>
                <input type="checkbox" name="check" class="ck">
            </td>
            <td>小米手机</td>
            <td>小米</td>
            <td>¥1999</td>
        </tr>
        <tr>
            <td>
                <input type="checkbox" name="check" class="ck">
            </td>
            <td>小米净水器</td>
            <td>小米</td>
            <td>¥4999</td>
        </tr>
        <tr>
            <td>
                <input type="checkbox" name="check" class="ck">
            </td>
            <td>小米电视</td>
            <td>小米</td>
            <td>¥5999</td>
        </tr>

    </table>

    <script>
        // 1.获取复选框
        const checkAll = document.querySelector('#checkAll')
        const cks = document.querySelectorAll('.ck')

        // 2.点击大复选框
        checkAll.addEventListener('click', function () {
            // 得到当前大复选框的选中状态---检查
            // console.log(this.checked);  // true 或者 false
            // 3.便利小复选框,让小复选框的checked等于大复选框的checked
            for (let i = 0; i < cks.length; i++) {
                cks[i].checked = checkAll.checked
            }
        })

        // 3.小复选框全选时,大复选框也被选中,利用css的伪类选择器
        // 3.1 给所有的小复选框添加点击事件
        for(let i = 0 ; i < cks.length ; i++){
            cks[i].addEventListener('click' , function(){
                // 判断小复选框的个数是否等于总的小复选框个数
                // console.log(document.querySelectorAll('.ck:checked').length);
                checkAll.checked =document.querySelectorAll('.ck:checked').length === cks.length

            })
        }


    </script>

</body>

</html>

效果展示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值