DOM事件

news2024/9/28 3:22:00

鼠标事件监听

键盘事件监听

表单事件监听 

常见的页面事件监听

事件传播

事件传播顺序:从内到外(冒泡阶段)onxxx这样写法只能监听冒泡阶段

addEventListener()方法第三个参数如果为true监听捕获阶段,false监听冒泡阶段(默认)

最内层盒子跟书写顺序有关(谁写前面谁就先执行),外面的盒子跟书写顺序无关(结果都是先捕获后冒泡)

事件对象e/event 

使用e.offset属性注意点:内部不能再有比它小的元素,否则位置属性会以小元素左上角为原点

keyCode特殊记忆 

e.preventDefault()方法:阻止事件的默认动作

案例:制作一个文本框,只能让用户在其中输入小写字母和数字,其他字符输入没有效果

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <p>
    <input type="text" id="field">
  </p>
<script>
  var oField=document.getElementById('field');
  oField.onkeypress=function (e){
    //根据用户输入的字符的字符码(e.charCode)
    //数字0~9,字符码48~57
    //小写字母a~z,字符码97~122
    if (!(e.charCode>=48&&e.charCode<=57||e.charCode>=97&&e.charCode<=122)){
      e.preventDefault();
    }
  }
</script>
</body>
</html>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #box {
            width: 200px;
            height: 200px;
            background-color: #333;
        }
        body{
            height: 2000px;
        }
    </style>
</head>
<body>
<div id="box"></div>
<h1 id="info">0</h1>

<script>
    var oBox = document.getElementById('box');
    var oInfo = document.getElementById('info');

    // 全局变量就是info中显示的数字
    var a = 0;

    // 给box盒子添加鼠标滚轮事件监听
    oBox.onmousewheel = function (e) {
        // 阻止默认事件:就是说当用户在盒子里面滚动鼠标滚轮的时候,此时不会引发页面的滚动条的滚动
        e.preventDefault();

        if (e.deltaY > 0) {
            a++;
        } else {
            a--;
        }
        oInfo.innerText = a;
    }
</script>
</body>
</html>

e.stopPropagation()阻止事件传播

案例:制作一个弹出层:点击按钮显示弹出层,点击网页任意地方,弹出层关闭

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
  <style>
    *{
      margin: 0;
      padding: 0;
    }
    #box{
      width: 200px;
      height: 140px;
      background-color: #333;
      position: absolute;
      left: 50%;
      top: 50%;
      margin-left: -100px;
      margin-top: -70px;
      display: none;
    }
  </style>
</head>
<body>
  <button id="btn">点我按钮</button>
  <div id="box"></div>
  <script>
    var oBtn=document.getElementById('btn');
    var oBox=document.getElementById('box');
    // 点击按钮盒子显示
    oBtn.onclick=function (e){
      // 阻止事件继续传播到document身上
      e.stopPropagation();
      oBox.style.display='block';
    }
    // 点击页面任何部分时,盒子关闭
    document.onclick=function (){
      oBox.style.display='none';
    }
    // 点击盒子内部时,不能关闭盒子,应该阻止事件
    oBox.onclick=function (e){
      e.stopPropagation();
    }
  </script>
</body>
</html>

事件委托

批量添加事件监听

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件委托</title>
</head>
<body>
  <ul id="list">
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
  </ul>
  <script>
    var oList=document.getElementById('list');
    var lis=oList.getElementsByTagName('li');
    //alert(lis.length);
    //批量给元素添加监听
    for(var i=0;i<lis.length;i++){
      lis[i].onclick=function (){
        this.style.color='red';
      }
    }
  </script>
</body>
</html>

每一个事件监听注册都会消耗一定的系统内存,而批量添加事件会导致监听数量太多,内存消耗非常大,实际上,每个<li>事件处理函数都是不同的函数,这些函数本身也会占用内存

新增元素动态绑定事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件委托</title>
</head>
<body>
<button id="btn">按我添加新的列表项</button>
  <ul id="list"></ul>
  <script>
    var oList=document.getElementById('list');
    var oBtn=document.getElementById('btn');
    //按钮的点击事件
    oBtn.onclick=function (){
      // 创建一个新的li列表项,孤儿节点
      var oLi=document.createElement('li');
      oLi.innerHTML='我是列表项';
      // 上树
      oList.appendChild(oLi);
      // 给新创建的这个li节点添加onclick事件监听
      oLi.onclick=function (){
        this.style.color='red';
      }
    }
  </script>
</body>
</html>

事件委托详解

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件委托2</title>
</head>
<body>
  <ul id="list">
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
  </ul>
<script>
  var oList=document.getElementById('list');
  oList.onclick=function (e){
    //e.target表示用户真正点击的那个元素
    //e.target.style.color='red';
    //e.currentTarget表示事件处理程序附加到的元素,当前指的是oList
    e.currentTarget.style.backgroundColor='red';
  }
</script>
</body>
</html>

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件委托2</title>
</head>
<body>
<button id="btn">按我创建一个新列表项</button>
<ul id="list">
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
</ul>
<script>
    var oList = document.getElementById('list');
    var oBtn = document.getElementById('btn');
    oList.onclick = function (e) {
        //e.target表示用户真正点击的那个元素
        e.target.style.color = 'red';
        //e.currentTarget表示事件处理程序附加到的元素,当前指的是oList
        //e.currentTarget.style.backgroundColor='red';
    }

    oBtn.onclick = function () {
        //创建孤儿节点
        var oLi = document.createElement('li');
        //添加内容
        oLi.innerText = '我是新来的';
        //上树
        oList.appendChild(oLi);
    }
</script>
</body>
</html>

onmouseenter:这个属性天生不冒泡的。相当于你事件处理函数附加给了哪个DOM节点,就是哪个DOM节点自己触发的事件,没有冒泡过程。类似于e.currentTarget属性

onmouseover:这个属性天生是冒泡的。 类似于e.target属性

使用事件委托时要注意:不能委托不冒泡的事件给祖先元素

使用事件委托时需要注意的事项

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件委托2</title>
</head>
<body>
<button id="btn">按我创建一个新列表项</button>
<ul id="list">
    <li><span>我是</span>列表项</li>
    <li><span>我是</span>列表项</li>
    <li><span>我是</span>列表项</li>
</ul>
<script>
    var oList = document.getElementById('list');
    var oBtn = document.getElementById('btn');
    oList.onclick = function (e) {
        //e.target表示用户真正点击的那个元素
        e.target.style.color = 'red';
        //e.currentTarget表示事件处理程序附加到的元素,当前指的是oList
        //e.currentTarget.style.backgroundColor='red';
    }

    oBtn.onclick = function () {
        //创建孤儿节点
        var oLi = document.createElement('li');
        //添加内容
        oLi.innerText = '我是新来的';
        //上树
        oList.appendChild(oLi);
    }
</script>
</body>
</html>

如果最内层元素li还有额外的元素span,则点击span我是 时候,只会执行我是样式为红色

 

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

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

相关文章

C语言及算法设计课程实验二:数据类型、运算符和简单的输入输出

C语言及算法设计课程实验二&#xff1a;数据类型、运算符和简单的输入输出一、实验目的二、实验内容2.1、输入并运行教材第3章第4题给出的程序&#xff1a;2.2、输入第3章第5题的程序2.3、输入以下程序&#xff1a;2.4、程序设计题&#xff1a;假如我国国民生产总值的年增长率为…

遗传算法解决函数优化问题

遗传算法解决函数优化问题 作者: Cukor丘克环境: MatlabR2020a vscode 为什么要学习遗传算法 为什么要学习遗传算法&#xff0c;或者说遗传算法有什么厉害的地方。例如求解以下函数优化问题&#xff1a;minf(x1,x2)x12x1225∗(sin2x1sin2x2),−10≤x1≤10,−10≤x2≤10.min…

【ACWING】【图的深度优先遍历】【846树的重心】

给定一颗树&#xff0c;树中包含 n个结点&#xff08;编号 1∼n&#xff09;和 n−1条无向边。 请你找到树的重心&#xff0c;并输出将重心删除后&#xff0c;剩余各个连通块中点数的最大值。 重心定义&#xff1a;重心是指树中的一个结点&#xff0c;如果将这个点删除后&…

js复习之正则表达式正向肯定与否定预查询

正则表达式(regular expression)描述了一种字符串匹配的模式&#xff08;pattern&#xff09;&#xff0c;可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。 正则表达式_百度百科 除开常用基本匹配模式&#xff0c;偶尔也会用到…

回顾艰难且不失温度的 2022 年 | 文中附「双12免单王」获奖名单

今天是 2022 年最后一天&#xff0c;回忆往昔&#xff0c;这一年经历了太多的不可思议和无可奈何之事。在年末的短短几周&#xff0c;寒气长驱直下以惊人的速度传给每一个人。我们真诚地希望大家都可以平安渡过这一难关。 即使步步难行&#xff0c;亦要踱步前行&#xff01;无…

力扣刷题记录——190. 颠倒二进制位、191. 位1的个数、202. 快乐数

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《190. 颠倒二进制位、191. 位1的个数、202. 快乐数》。 目…

Gradle学习笔记之依赖

文章目录依赖的方式直接依赖项目依赖本地jar包依赖依赖的类型api和implementation的区别依赖冲突及解决方案移除某个依赖不允许依赖传递强制使用某个版本依赖冲突时立刻构建失败依赖的方式 Gradle中的依赖方式有直接依赖、项目依赖和本地jar包依赖三种&#xff1a; dependenc…

【一起从0开始学习人工智能0x02】字典特征抽取、文本特征抽取、中文文本特征抽取

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录什么是特征工程&#xff1f;用什么做&#xff1f;1.特征提取特征值化&#xff1a;特征提取API字典特征提取---向量化---类别--》one-hot编码哑变量one-hot-------直接1234会产生歧义&#xff0c;不公平应用场…

Python 10k+ 面试试题,看看你是否掌握

前言 大家早好、午好、晚好吖 ❤ ~ 面试实战题&#xff1a;采集世界最大旅游平台Tripadvisor 另我给大家准备了一些资料&#xff0c;包括: 2022最新Python视频教程、Python电子书10个G &#xff08;涵盖基础、爬虫、数据分析、web开发、机器学习、人工智能、面试题&#xff…

Python GUI编程:音乐播放器(多线程、爬虫、进度条、文件)

文章目录1. 程序运行结果2.程序实现原理3. GUI布局4. 功能介绍5. 代码实现1. 程序运行结果 Python实现音乐播放器(爬虫、多线程、进度条、文件)2.程序实现原理 本音乐播放器GUI方面运用Python的tkinter实现&#xff0c;播放的音乐来自网络爬虫和本电脑已经有的。为了使整个程序…

Android studio设置全屏显示的两种方式

两种在Androidstudio中设置全屏的方式&#xff0c;推荐第二种 第一种&#xff08;Java文件中设置&#xff09; 直接在onCreate()函数中设置 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);package com.exa…

MARKETS AND MARKET LOGIC——The Market‘s Principles (6)_3

市场的组成——对行为观察的反思 制定市场理解 理解市场逻辑将有助于每个参与者提高其在市场上成功的可能性&#xff0c;因为他将能够阅读市场活动并接收市场生成的信息&#xff0c;这些信息很少有参与者承认或理解。这一信息特别涉及市场如何接受或拒绝随着时间的推移而升高或…

Linux用户标识符UID与GID和用户账号

1.用户标识符UID和GID UID 表示的是用户的标识&#xff08;User Identification&#xff09; GID 表示的是用户组的标识&#xff08;Group Identification&#xff09; 显示用户ID信息。 命令&#xff1a;id username 2.用户账号 用户和用户组的信息都存放在…

RabbitMQ(一)Windows下载安装

目录一、下载安装包二、安装erlang三、安装RabbitMQ四、配置RabbitMQ管理界面官网地址&#xff1a;https://www.rabbitmq.com/ 下载地址&#xff1a;https://www.rabbitmq.com/download.html 一、下载安装包 RabbitMQ Windows下载地址&#xff1a;https://www.rabbitmq.com/in…

001. Nginx场景,优点,组成部分和编译

目录一&#xff1a; Nginx三个重要的使用场景二&#xff1a; Nginx的优点三&#xff1a;Nginx文件的组成部分四&#xff1a;编译Nginx一&#xff1a; Nginx三个重要的使用场景 静态资源服务 疑问&#xff1a;为什么需要静态资源服务&#xff1f;答&#xff1a; 在整个的web请求…

string_string数据类型概括

目录string数据类型创建字符串的三种方式检查字符串的方法常用的字符串方法字符串遍历切割字符串为数组​截取子串判断某个字符串是否出现在当前字符串中文本匹配-match、(es6)matchAll文本替换-replace、(es6)replaceAll(es6)获取某个位置的字符串有关ASCII码的方法获取某字符…

Good Bye 2022: 2023 is NEAR C Koxia and Number Theory

Problem - C - Codeforces 题意&#xff1a; 给定一个数列a&#xff0c;问你是否存在一个数 x 使得所有数加上x之后两两互质 思路&#xff1a; 一、 我们知道一个结论&#xff0c;一些数两两之间互质&#xff0c;就说明所有数之间的质因子都不重合 如果要我们去判断一堆数…

回顾与展望Zebec举办的“Web3.0 TechHive Summit 2022 大会”

随着流支付生态 Zebec 不断的实现商业进展&#xff0c;我们看到&#xff0c;其生态从Solana陆续的迁移到以BNB Chain为代表的EVM链上&#xff0c;并推出了以ZK-Rollup为主要技术手段的公链Zebec Chain&#xff0c;以在未来服务且满足于Web2、Web3世界的发展需求。 Zebec正在成…

若依框架:前端项目结构与初始页面渲染流程

目录 main.js入口文件 前端页面初始化 package.json配置文件 vue-cli&#xff1a;.env模式和环境变量配置 vue-cli三大核心构件 CLI 服务与npm scripts vue-cli-service命令与.env模式配置文件 .env模式和环境变量配置 vue.config.js&#xff1a;项目启动-自动打开默认…

pycharm如何设置python文件模板

pycharm如何设置python文件模板设置文件模板预定义变量设置自定义模板变量设置文件模板 打开设置界面 进入编辑器->文件和代码模板 此处我只写了文件头注释模板&#xff0c;也可以加一些默认代码&#xff0c;比如&#xff1a; python if __name__ "__main__":…