深入了解JavaScript事件绑定:实现高效可靠的事件处理

news2024/9/24 7:24:45

​🌈个人主页:前端青山
🔥系列专栏:JavaScript篇
🔖人终将被年少不可得之物困其一生

依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript-事件绑定方式

目录

事件绑定方式

什么是事件

DOM0级 事件

DOM0级事件绑定

DOM2级 事件绑定

事件解绑方式

DOM0级事件解绑

DOM2级事件解绑

事件对象的认识

什么是事件对象?(类似于飞机上的黑匣子、汽车上的行车记录仪、教室中的摄像头)

如何获取事件对象?

事件对象内鼠标相关信息

鼠标的相对坐标值:(鼠标相对于所在对象上的坐标值)

鼠标的可视区坐标值:(当前鼠标触发点距离当前窗口左上角的X/Y坐标)

鼠标的绝对坐标值:(当前鼠标触发点距离BODY左上角的X/Y坐标(IE9以下没有这两个属性)

事件对象内键盘相关信息

altKey / shiftKey / ctrlKey / metakey

事件绑定方式

什么是事件

  • 一个事件由什么东西组成

    • 触发谁的事件:事件源

    • 触发什么事件:事件类型

    • 触发以后做什么:事件处理函数

    var oDiv = document.querySelector('div')
    ​
    oDiv.onclick = function () {}
    // 谁来触发事件 => oDiv => 这个事件的事件源就是 oDiv
    // 触发什么事件 => onclick => 这个事件类型就是 click
    // 触发之后做什么 => function () {} => 这个事件的处理函数
    • 我们想要在点击 div 以后做什么事情,就把我们要做的事情写在事件处理函数里面

    var oDiv = document.querySelector('div')
    ​
    oDiv.onclick = function () {
      console.log('你点击了 div')
    }
    • 当我们点击 div 的时候,就会执行事件处理函数内部的代码

    • 每点击一次,就会执行一次事件处理函数

DOM0级 事件

  1. 常用事件

    1. onblur : 失焦事件

    2. onfocus : 得焦事件

    3. onchange : 内容改变事件

  2. 鼠标常用事件

    1. onclick : 点击事件

    2. ondblclick : 双击事件

    3. onmousedown : 鼠标按下事件

    4. onmouseup : 鼠标抬起事件

    5. onmouseenter : 鼠标移入事件

    6. onmouseleave : 鼠标移出事件

    7. onmouseover : 鼠标移入事件

    8. onmouseout : 鼠标移出事件

    9. onmousemove : 鼠标移动事件

  3. 键盘常用事件

    1. onkeydown : 键盘按下

    2. onkeyup : 键盘抬起

    3. onkeypress : 键盘按过(按下时触发)

  4. 其它事件

    1. onload : 加载成功事件

    2. error : 加载失败事件

    3. resize : 大小改变事件

  <script>        
//1. 获取元素对象
        var txt = document.querySelector('input');
        var box = document.querySelector('#box');
        //2. 添加事件
        txt.onfocus = function(){
            this.value = ''; //清空当前文本框
        }
        txt.onblur = function(){
            alert('失焦后:' + this.value);
        }

        txt.onblur = null;
        txt.onchange = function(){
            alert('改变后:' + this.value);
        }
        txt.oninput = function(){
            box.innerText = this.value;
        }
        box.onclick = function(){
            console.log('点击了div');
        }
        box.ondblclick = function(){
            console.log('双击了div')
        }
        box.onmousedown = function(){
            console.log('鼠标在div上按下');
        }
        box.onmouseup = function(){
            console.log('鼠标在div上抬起');
        }
        box.onmouseover = function(){
            console.log('over:','鼠标移入了div中');
        }
        box.onmouseout = function(){
            console.log('out:' + '鼠标移出了div');
        }
        box.onmouseenter = function(){
            console.log('enter:' + '鼠标移入了div');
        }
        box.onmouseleave = function(){
            console.log('leave:鼠标移出了div');
        }
        box.onmousemove = function(){
            console.log('鼠标在div上移动');
        }
        document.onkeydown = function(){
            console.log('按下键盘');
        }
        document.onkeyup = function(){
            console.log('抬起键盘')
        }
        document.onkeypress = function(){
            console.log('按过键盘');
        }
    </script>

DOM0级事件绑定

ele.onclick = function(){}

DOM2级 事件绑定

标准 浏览器: ele.addEventListener('click',function(){},false)

IE 浏览器 :ele.attachEvent('onclick',function(){})

  <script>
        //1. 获取元素
        var box = document.querySelector('#box');
        function fn1(){
            alert('开灯');
        }
        function fn2(){
            alert('开空调');
        }
        function fn3(){
            alert('开热水器');
        }
        2. 绑定事件
        box.onclick = fn1;
        box.onclick = fn2;
        box.onclick = fn3;
        标准浏览器添加事件监听器
        1. 第一个参数:事件类型
        2. 第二个参数:事件处理程序
        3. 第三个参数:是否进行捕获  false(默认) : 冒泡    true(捕获)
        box.addEventListener('click',fn1,false);
        box.addEventListener('click',fn2,false);
        box.addEventListener('click',fn3,false);
        IE浏览器添加事件监听器
        1. 第一个参数:事件驱动
        2. 第二个参数:事件处理程序
        box.attachEvent('onclick',fn1);
        box.attachEvent('onclick',fn2);
        box.attachEvent('onclick',fn3);
        兼容
        function addEventListener(dom,type,fn,bool){
            //1. 处理默认参数的问题
            bool = bool || false;
            //2. 是否支持addEventListener方法
            if(dom.addEventListener){
                dom.addEventListener(type,fn,bool);
            }else if(dom.attachEvent){
                dom.attachEvent('on' + type,fn);
            }
        }

        addEventListener(box,'click',fn1);
        addEventListener(box,'click',fn2);
        addEventListener(box,'click',fn3);


        //标准浏览器移除事件监听器
        // box.removeEventListener('click',fn2,false);
        //IE浏览器移除事件监听器
        // box.detachEvent('onclick',fn2);
        function removeEventListener(dom,type,fn,bool){
            //1. 处理默认参数的问题
            bool = bool || false;
            //2. 是否支持addEventListener方法
            if(dom.removeEventListener){
                dom.removeEventListener(type,fn,bool);
            }else if(dom.detachEvent){
                dom.detachEvent('on' + type,fn);
            }
        }
        removeEventListener(box,'click',fn2);
    </script>
//添加事件监听器
//标准浏览器
//第一个参数:事件类型 (名词)
//第二个参数:事件处理程序
//第三个参数:是否进行事件捕获? false(冒泡-默认值) true(捕获)
// o_btn.addEventListener('click',fn1,false);
// o_btn.addEventListener('click',fn2,false);
// o_btn.addEventListener('click',fn3,false);
//IE浏览器
第一个参数:事件驱动
第二个参数:事件处理程序
​
// o_btn.attachEvent('onclick',fn1);
// o_btn.attachEvent('onclick',fn2);
// o_btn.attachEvent('onclick',fn3);
//兼容
function addEventListener(obj,type,fn,bool){
    //初始化bool参数
    bool = bool || false;
    if(obj.addEventListener){
        obj.addEventListener(type,fn,bool);
    }else if(obj.attachEvent){
        obj.attachEvent('on' + type,fn);
    }
}

事件解绑方式

DOM0级事件解绑

ele.onclick = null;

DOM2级事件解绑

标准 浏览器: ele.removeEventListener('click',function(){},false)

IE 浏览器 :ele.detachEvent('onclick',function(){})

//移除事件监听
//标准浏览器
// o_btn.removeEventListener('click',fn2,false);
//IE浏览器
// o_btn.detachEvent('onclick',fn2);
//兼容
function removeEventListener(obj,type,fn,bool){
    //初始化bool参数
    bool = bool || false;
    if(obj.removeEventListener){
        obj.removeEventListener(type,fn,bool);
    }else if(obj.detachEvent){
        obj.detachEvent('on' + type,fn);
    }
}

事件对象的认识

什么是事件对象?(类似于飞机上的黑匣子、汽车上的行车记录仪、教室中的摄像头)

当绑定事件的对象,在触发事件时,所发生的事情记录在一个地方,而这个地方称为事件对象。

如何获取事件对象?

  1. 标准浏览器获取事件对象的方式: 触发事件后,会自动给事件处理程序传递一个参数,这个参数就是事件对象。

  2. IE浏览器获取事件对象的方式: window.event

  3. 兼容:

  4. arguments : 内置的对象,是一个伪数组,是实参副本.

    function getEvent(){
        return arguments[0] || window.event;
    }

事件对象内鼠标相关信息

鼠标的相对坐标值:(鼠标相对于所在对象上的坐标值)

  1. event.offsetX / event.offsetY

鼠标的可视区坐标值:(当前鼠标触发点距离当前窗口左上角的X/Y坐标)

  1. event.clientX / event.clientY

鼠标的绝对坐标值:(当前鼠标触发点距离BODY左上角的X/Y坐标(IE9以下没有这两个属性)

//兼容处理:
event.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft)
event.clientY + (document.documentElement.scrollTop || document.body.scrollTop)

事件对象内键盘相关信息

  1. onkeydown/onkeyup : event.keyCode

监听整个键盘,其中字母键只返回大写的编码值。

  1. onkeypress : event.keyCode || event.charCode || event.which

监听编辑键区,字母键返回大小的编码值。 低版本浏览器中有可能监听功能键区、回车键出现过10 兼容:

//7. 获取键盘编码值的兼容
function getKeyCode(evt){
    var e = evt || window.event;
    return e.keyCode || e.charCode || e.which;
}

altKey / shiftKey / ctrlKey / metakey

  1. event.metaKey : 返回一个布尔值标识meta键(windows键)是否被按键并被保持。

返回true表示meta键按下并保持

返回false表示没有满足meta键按下并保持的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1285332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】编译器-gcc/g++与调试器-gdb的使用

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.gcc/g语法 2.gcc的使用及…

ArkUI组件--Text组件

1.声明Text组件并设置文本内容 Text(content?:string|Recource) #两种数据类型&#xff0c;字符串和本地资源文件 ①string格式&#xff0c;直接填写文本内容 Text(需要显示的文本) ②Recource格式&#xff0c;读取本地资源文件 Text($r(app.string.width_label)) 读取图…

打开游戏提示缺少(或找不到)XINPUT1_3.DLL怎么解决

在电脑使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是xinput1_3.dll丢失。那么&#xff0c;xinput1_3.dll是什么文件&#xff1f;它对电脑有什么影响&#xff1f;本文将详细介绍xinput1_3.dll丢失的原因以及五个详细的解决方法&#xff0c;帮助大家…

个人测试面试问题总结

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 &#x1f4d1;设计软件测试用例的方…

赛氪网荣膺地理标志语言服务教育与实践基地联盟理事会员单位

随着地理标志产品推介需求的持续扩大&#xff0c;知识产权保护和语言服务行业面临着新的挑战和机遇。在这个背景下&#xff0c;知识产权出版社指导下的地理标志语言服务教育与实践基地联盟应运而生&#xff0c;旨在推动地理标志产品的推广和知识产权保护。赛氪网作为项目运营方…

自动化巡检实现方法 (一)------- 思路概述

一、自动化巡检需要会的技能 1、因为巡检要求一天24小时全天在线&#xff0c;因此巡检程序程序一定会放在服务器上跑&#xff0c;所以要对linux操作熟悉哦 2、巡检的代码要在git上管理&#xff0c;所以git的基本操作要熟悉 3、为了更方便不会代码的同学操作&#xff0c;所以整个…

JFrog Artifactory—高性能软件制品管理仓库

产品概述 JFrog Artifactory是一个可扩展的通用二进制存储库管理器&#xff0c;可在整个应用程序开发和交付过程中自动管理工件和依赖项。JFrog Artifactory支持大多数开发语言&#xff0c;是整个DevOps流水线中大多数软件包、容器映像和Helm图表的单一数据源。Artifactory对元…

马斯克“赛博皮卡”Cybertruck交付!43万起售,性能强如猛兽

原创 | 文 BFT机器人 埃隆马斯克常常被称为是“天才与疯子”的结合&#xff0c;一直是一个争议不断的人物。他九十年代创办电子支付公司&#xff1b;2004年成立特斯拉&#xff0c;开创了一个汽车领域的新时代&#xff1b;人到中年又扬言要发射卫星建立全球无线网…… 许多科技…

台灯选什么样的比较好?适合备考使用的专业台灯分享

台灯虽然每家每股可能都有上一台&#xff0c;但是很多人不知道台灯其实也有很有讲究的&#xff01;一些些劣质的台灯&#xff0c;往往都是不符合国标要求的&#xff0c;所用材质、做工都存在的一定的安全隐患&#xff0c;因此会导致我们因为长期使用的原因导致&#xff0c;然后…

韵达单号查询,韵达快递查询,用表格导出单号的详细物流信息

批量查询韵达快递单号的物流信息&#xff0c;并以表格的形式导出单号的详细物流信息。 所需工具&#xff1a; 一个【快递批量查询高手】软件 韵达快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&…

计算机操作系统1

.11.操作系统的基本定义 2.操作系统的四大特征 2.1.操作系统的虚拟特征 3.操作系统的功能&#xff1a; 1.处理器管理 2.存储器管理 3.文件管理 4.设备管理 4.总结&#xff1a; 1.并发和共享互为存在&#xff0c;没有并发也就没有共享&#xff0c;反之也是。 2.并发和并行的…

ROS opencv PCL Ceres-solver之间版本对应关系

ROS1 : neotic Opencv : 4.6.0 Ceres-solver : 2.0.0

【ACM独立出版、确定的ISBN号】第三届密码学、网络安全和通信技术国际会议(CNSCT 2024)

第三届密码学、网络安全和通信技术国际会议&#xff08;CNSCT 2024&#xff09; 2024 3rd International Conference on Cryptography, Network Security and Communication Technology 随着互联网和网络应用的不断发展&#xff0c;网络安全在计算机科学中的地位越来越重要&…

Python中读写(解析)JSON文件的深入探究

目录 一、引言 二、如何读取JSON文件 三、如何写入JSON文件 四、如何解析JSON字符串 五、错误处理和异常处理 六、使用第三方库提高效率 七、总结 一、引言 在Python中&#xff0c;我们经常使用JSON&#xff08;JavaScript Object Notation&#xff09;格式来存储和传输…

Python中的内省与反射机制及其应用场景

1. 概述 在计算机学中&#xff0c;反射式编程&#xff08;英语&#xff1a;reflective programming&#xff09;或反射&#xff08;英语&#xff1a;reflection&#xff09;&#xff0c;是指计算机程序在运行时&#xff08;runtime&#xff09;可以访问、检测和修改它本身状态或…

如何在Linux环境搭建本地SVN服务器并结合cpolar实现公网访问

目录 前言 1. Ubuntu安装SVN服务 2. 修改配置文件 2.1 修改svnserve.conf文件 2.2 修改passwd文件 2.3 修改authz文件 3. 启动svn服务 4. 内网穿透 4.1 安装cpolar内网穿透 4.2 创建隧道映射本地端口 5. 测试公网访问 6. 配置固定公网TCP端口地址 6.1 保留一个固定…

暂时pass的题目的学习笔记(按类型分类 ):动态规划、递归

动态规划类 学习笔记来自公众号labuladong 动态规划的一般形式就是求最值——其核心问题是穷举但动态规划的穷举有些特别&#xff0c;因为这类问题存在重叠子问题 如果暴力穷举的话效率会极其低下&#xff0c;所以需要**「备忘录」或者「DP table」**来优化穷举过程&#xff…

09.复刻ChatGPT,自我进化,AI多智能体

文章目录 复刻ChatGPT原因准备开整ALpacaVicuna GPT-4 EvaluationDolly 2.0其他合集Self-improve 自我进化表现形式法1&#xff1a;自我催眠法2&#xff1a;Agent交互法3&#xff1a;ReasonAct AI多智能体AI规划角色的一天加入亿点点细节&#xff08;外界刺激&#xff09;Refle…

k8s引用环境变量

一 定义环境变量 ① 如何在k8s中定义环境变量 env、configmap、secret补充&#xff1a; k8s 创建Service自带的环境变量 ② 从pod属性中获取 kubectl explain deploy.spec.template.spec.containers.env.valueFrom关注&#xff1a; configMapKeyRef、fieldRef 和 resour…

15、pytest的fixture调用fixture

官方实例 # content of test_append.py import pytest# Arrange pytest.fixture def first_entry():return "a"# Arrange pytest.fixture def order(first_entry):return [first_entry]def test_string(order):# Actorder.append("b")# Assertassert orde…