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

​🌈个人主页:前端青山
🔥系列专栏: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键按下并保持的情况。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PCB走线要“尽量”短_笔记

PCB走线要“尽量”短_笔记 关键影响要素作为“走线要尽量短”这条规则的补充的理论依据方波信号控制走线的特征阻抗 大家都知道两点之间直线最短&#xff0c;但是假如两点之间没有直线路径怎么办? 你会绕过去好还是换层好&#xff0c;尽量短就行&#xff1f;又有问题来了 究竟…

数据结构与算法编程题39

数组A[]中有 n 个整数&#xff0c;没有次序&#xff0c;数组从下标1开始存储&#xff0c;请写出顺序查找任一元素k的算法 &#xff0c;若查找成功&#xff0c;则返回元素在数组中的位置&#xff1b;若查找不成功&#xff0c;则返回 0。 /*数组A[]中有 n 个整数&#xff0c;没有…

分页存储管理系统的计算

在做题之前&#xff0c;一定要把逻辑地址和物理块号之间的关系弄清楚&#xff0c;可以看这篇&#xff1a; http://t.csdnimg.cn/92EmM 如果有时间&#xff0c;后续我也会进行整理&#xff01; 例题1&#xff1a; 在一个分页储存管理系统中&#xff0c;进程的逻辑地址空间占…

使用 javascript 模拟 git diff 命令实现文本文件差异比较

diff.html&#xff1a; <!DOCTYPE html> <html> <head><title>文件比较</title><meta charset"UTF-8"> </head> <body> <h1>文件比较</h1> <form><label for"file1">版本1&…

Python中读写CSV文件的深入探讨

目录 一、引言 二、如何读取CSV文件 三、如何写入CSV文件 四、处理大型CSV文件 五、总结 一、引言 CSV&#xff08;Comma-Separated Values&#xff09;文件是一种常见的逗号分隔值格式的文件&#xff0c;常用于存储和传输数据。在Python中&#xff0c;我们可以使用内置的…

手机充电器市场分析:预计2028年将达到82亿美元

在5G时代飞速发展的今天&#xff0c;随着科技的进步、应用的发展以及人们对以智能手机、平板电脑、智能穿戴设备为代表的智能终端设备追求越来越高的品质和功能&#xff0c;智能终端设备产品的更新换代的速度越来越快&#xff0c;这也将给全球智能终端充储电产品市场带来更大的…

计算机基础知识64

ForeignKey属性 to&#xff1a;设置要关联的表 related_name&#xff1a; 反向操作时&#xff0c;使用的字段名&#xff0c;用于代替原反向查询时的’表名_set’ related_query_name:反向查询操作时&#xff0c;使用的连接前缀&#xff0c;用于替换表名 to_field:设置要关联的表…

【黑马甄选离线数仓day09_会员主题域开发_DWD和DWM层】

拉链表流程 1.从ODS层获取增量数据(上一天新增和更新的数据) 2.拿着DWD原始拉链表数据 left join 增量数据 ,修改原始拉链中历史数据的结束时间 3.拿着left join 的结果集 union all 增量数据 4.把最新的拉链数据优先保存到DWD对应的临时表中 5.使用insertselect 方式把临时表中…

8000元投影仪值得买吗?选择一步到位当贝X5 Ultra不用担心白天看不见

随着生活方式的变化&#xff0c;现在越来越多家用将家里的电视机换成屏幕更大的投影仪&#xff0c;投影仪似乎要逐渐取代电视机在家庭中的位置&#xff1b;然而近日在抖音刷到河南广播电视台民生频道的一个视频&#xff1a;河南郑州一小伙花了八千多买了极米投影仪&#xff0c;…

Scala 从入门到精通

Scala 从入门到精通 数据类型 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:…

LeetCode [中等]全排列(回溯算法)

46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 回溯法 采用试错的思想&#xff0c;它尝试分步的去解决一个问题。在分步解决问题的过程中&#xff0c;当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候&#xff0c;它将取消上一步甚至是上几步的计算&…

怎么对文件加密?文件加密软件操作保姆式演示!

大家是不是遇到过这种情况&#xff0c;文件一个不小心就被别人轻易外发出去&#xff0c;并且还是特别重要的内容。在企业中这种现象已经非常常见啦。 今天就给友友们&#xff0c;分享一款神器&#xff0c;它可以让你点点鼠标&#xff0c;就对企业的重要文件进行加密。 1、获取…

学习php中使用composer下载安装firebase/php-jwt 以及调用方法

学习php中使用composer下载安装firebase/php-jwt 以及调用方法 1、安装firebase/php-jwt2、封装jwt类 1、安装firebase/php-jwt composer require firebase/php-jwt安装好以后出现以下文件: 2、封装jwt类 根据所使用的php框架&#xff0c;在指定目录创建 Token.php <?ph…

llama.cpp部署(windows)

一、下载源码和模型 下载源码和模型 # 下载源码 git clone https://github.com/ggerganov/llama.cpp.git# 下载llama-7b模型 git clone https://www.modelscope.cn/skyline2006/llama-7b.git查看cmake版本&#xff1a; D:\pyworkspace\llama_cpp\llama.cpp\build>cmake --…

Angular 进阶之四:SSR 应用场景与局限

应用场景 内容丰富&#xff0c;复杂交互的动态网页&#xff0c;对首屏加载有要求的项目&#xff0c;对 seo 有要求的项目&#xff08;因为服务端第一次渲染的时候&#xff0c;已经把关键字和标题渲染到响应的 html 中了&#xff0c;爬虫能够抓取到此静态内容&#xff0c;因此更…

修改python打包后的窗体图标、任务栏图标、exe图标

前言 我python开发的GUI界面(图形用户界面)一直是tkinter&#xff0c;打包exe一直是Pyinstaller。但是打包出来的exe图标、状态栏图标、窗体左上角图标一直是默认的羽毛&#xff0c;我想自定义。 效果 最后使用base64创建临时ico解决了该问题 步骤 创建icoToBase64.py&am…

如何使用 Oracle SQL Developer 连接 pgvector

如何使用 Oracle SQL Developer 连接 pgvector 1. 下载 postgresql 的 jdbc 驱动2. Oracle SQL Developer 配置第三方驱动3. Oracle SQL Developer 配置 postgres 连接 1. 下载 postgresql 的 jdbc 驱动 访问 https://jdbc.postgresql.org/download/&#xff0c;下载驱动&…

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…

STM32存储左右互搏 SPI总线读写FRAM MB85RS16

STM32存储左右互搏 I2C总线读写FRAM MB85RS16 在中低容量存储领域&#xff0c;除了FLASH的使用&#xff0c;&#xff0c;还有铁电存储器FRAM的使用&#xff0c;相对于FLASH&#xff0c;FRAM写操作时不需要预擦除&#xff0c;所以执行写操作时可以达到更高的速度&#xff0c;其…

【教程】苹果推送证书的创建和使用流程详解

摘要 本篇博客主要介绍了苹果推送证书的使用流程。首先&#xff0c;在苹果开发者中心创建推送证书&#xff0c;然后在应用程序中使用该证书进行消息推送。文章详细说明了创建推送证书的步骤&#xff0c;并提供了在应用程序中注册推送服务、发送推送消息以及处理推送消息的相关…