事件代理?

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>Document</title>
  <script>
    // 延迟代码执行 页面加载完毕后再执行
    window.onload = function () {
      var ul = document.querySelector('ul');
      console.log(ul, '头部获取');
    }
  </script>
</head>

<body>
  <ul>
    <li>我是第1个li</li>
    <li>我是第2个li</li>
    <li>我是第3个li</li>
    <li>我是第4个li</li>
    <li>我是第5个li</li>
    <li>我是第6个li</li>
    <li>我是第7个li</li>
    <li>我是第8个li</li>
    <li>我是第9个li</li>
    <li>我是第10个li</li>
  </ul>
  <script>
    /**
     * 什么是事件委托/事件代理*******************
     * 只指定一个事件处理程序 就可以管理某一类型的事件
     * 将本应该绑定给子元素事件绑定父元素代理
     * 优点:减少事件的执行,减少浏览器重排和重绘,优化页面性能,可以给新增元素绑定事件
    */
    var ul = document.querySelector('ul');
    // children获取元素所有子元素节点
    var lis = ul.children;
    // console.log(lis,'获取子元素节点');
    // for(var i=0;i<lis.length;i++){
    //   lis[i].onclick = function(){
    //     this.style.backgroundColor = 'red';
    //   }
    // }
    // 给父元素绑定事件
    ul.onclick = function () {
      console.log(event.target, '事件对象');
      event.target.style.backgroundColor = 'red';
    }
    var newLi = document.createElement('li');
    newLi.innerHTML = '我是新增li';
    ul.appendChild(newLi);
  </script>
</body>

</html>

浏览器运行结果如下:

<!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>Document</title>
</head>

<body>
  <ul>
    <li id="one">第一个li标签</li>
    <li id="two">第二个li标签</li>
    <li id="three">第三个li标签</li>
  </ul>
  <script>
    // var one = document.getElementById('one');
    // var two = document.getElementById('two');
    // var three = document.getElementById('three');
    // one.onclick = function(){
    //   this.innerHTML = 'hello html'
    // }
    // two.onclick = function(){
    //   this.innerHTML = 'hello css'
    // }
    // three.onclick = function(){
    //   this.innerHTML = 'hello js'
    // }
    /**
     * 将li的事件代理给ul
    */
    var ul = document.querySelector('ul');
    ul.onclick = function () {
      // console.log(event.target)
      // 获取点击的某一个li元素 
      var target = event.target;
      switch (target.id) {
        case 'one':
          target.innerHTML = 'hello html';
          break;
        case 'two':
          target.innerHTML = 'hello css';
          break;
        case 'three':
          target.innerHTML = 'hello js';
          break;
        default:
          target.innerHTML = '我是li标签';
      }
    }
  </script>
</body>

</html>

浏览器运行结果如下:

 


2.事件类型

        select 输入框选择字符触发    resize 窗口缩放触发    scroll 滚动事件     获取滚动条距离上方位置 document.documentElement.scrollTop || window.pageYoffset;
        鼠标事件
            mouseenter    mousemove    mouseleave    mouseup    mousedown    mousewheel
        键盘事件
            keyup 键盘抬起    keydown 键盘按下    keypress 键盘持续按下
        输入框事件
            focus 聚焦    blur失焦    input 监听输入框事件    textInput 监听输入框事件 使用dom2级事件进行绑定

<!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>Document</title>
  <style>
    div {
      width: 100px;
      height: 100px;
      background-color: red;
    }
  </style>
</head>

<body>
  <input type="text">
  <div>我是一个div</div>
  <!-- <div style="height: 5000px;"></div> -->
  <script>
    var input = document.querySelector('input');
    /**
     * 1.select 当选择输入框字符时候触发 火狐不支持
    */
    input.onselect = function () {
      console.log(window.getSelection().toString(), '我被触发了');
    }
    /**
     * 2.当页面发生缩放时候触发
    */
    // window.onresize = function(){
    //   console.log(window.outerWidth,window.outerHeight)
    // }
    /**
     * 3.滚动事件 scroll
    */
    window.onscroll = function () {
      // console.log(window.pageYOffset,'获取距离上方位置')
      console.log(document.documentElement.scrollTop, '获取距离上方位置')
    }
    /**
     * 4.监听输入框值事件
    */
    input.oninput = function () {
      console.log(event.target.value, '输入框输入的值')
    }
    /**
     *5. 聚焦事件 focus
    */
    // input.onfocus = function () {
    //   this.style.backgroundColor = 'red'
    // }
    /**
     * 6.失焦事件 blur
    */
    input.onblur = function () {
      // this.style.backgroundColor = 'blue';
    }
    /**
     * 鼠标事件 
     * mouseenter 鼠标移入 
     * mouseleave 鼠标移除
     * mousemove  鼠标一直移动
     * mousedown 
     * mouseup 
     * mousewheel 
     * click 
     * dbclick
    */
    var div = document.querySelector('div');
    div.onmouseenter = function () {
      console.log('鼠标移入');
    }
    div.onmouseleave = function () {
      console.log('鼠标移出');
    }
    div.onmousemove = function () {
      console.log('鼠标一直移动');
    }
    div.onmousedown = function () {
      console.log('鼠标按下');
    }
    div.onmouseup = function () {
      console.log('鼠标抬起')
    }
    div.onmousewheel = function () {
      console.log('鼠标滚轮');
    }
    div.ondblclick = function () {
      console.log('鼠标双击');
    }
    /**
     * 键盘事件 
     * keydown 键盘按下事件
     * keyup   键盘抬起事件
     * keypress 键盘持续按下事件
    */
    // input.onkeydown = function () {
    //   console.log(event.keyCode, '键盘keyCode我被按下了');
    // }
    // input.onkeyup = function () {
    //   console.log('键盘抬起');
    // }
    // input.onkeypress = function () {
    //   console.log('键盘持续按下事件');
    // }
    
    input.addEventListener('textInput', function (event) {
      console.log(event.data,'00000');
    })
  </script>
</body>

</html>

浏览器运行结果如下:

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

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

相关文章

【技术干货】宇视IPC音频问题解决步骤

近期技术人员从宇视官网下载sdk进行二次开发时&#xff0c;在启动实时直播&#xff0c;并通过回调函数拿到流数据&#xff0c;发现没有音频流数据。 通过下面的数据发现&#xff0c;codeType此字段一直是28&#xff0c;代表的是H.264数据&#xff0c;但未没发现有音频的数据包…

2. 两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

常见气体爆炸下限

国标中关于常见气体爆炸下限说明&#xff0c;特此记录 特此记录 anlog 2023年11月29日

LeetCode Hot100 739.每日温度

题目&#xff1a; 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 方法&…

AWS连甩3项Serverless创新,高效创建和操作缓存,用AI优化资源配置性价比

云创科技11月28日拉斯维加斯报道&#xff0c;在一年一度的AWS re:Invent首日&#xff0c;AWS实用计算高级副总裁Peter DeSantis延续Monday Night Live的传统&#xff0c;发表主题演讲并分享了AWS数据库和分析产品组合中的3项Serverless创新&#xff0c;以帮助客户在任何规模下分…

Java——》线性数据结构

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

Linux系统编程 day06 进程间通信

进程间通信 1. 进程间通信的概念2. 匿名管道pipe3. 命名管道FIFO4. 内存映射区 1. 进程间通信的概念 在Linux的环境下&#xff0c;进程地址空间是相互独立的&#xff0c;每个进程有着各自不同的用户地址空间。一个进程不能访问另一个进程中的内容&#xff0c;要进行数据交换必…

elFinder ZIP 参数注入导致命令注入 (CVE-2021-32682)

漏洞描述 elFinder 是一个用于 Web 的开源文件管理器&#xff0c;使用 jQuery UI 用 JavaScript 编写。 在 elFinder 2.1.48 及更早版本中发现一个参数注入漏洞。此漏洞可能允许攻击者在托管 elFinder PHP 连接器的服务器上执行任意命令&#xff0c;即使配置最少也是如此。这…

SpringBoot : ch11 整合RabbitMQ

前言 在当今的互联网时代&#xff0c;消息队列成为了构建高可靠、高性能系统的重要组件之一。RabbitMQ作为一个可靠、灵活的消息中间件&#xff0c;被广泛应用于各种分布式系统中。 本篇博客将介绍如何使用Spring Boot整合RabbitMQ&#xff0c;实现消息的发送和接收。通过这种…

浅析函数防抖节流

防抖和节流都是前端开发中常用的优化性能的技术。 一、定义 防抖&#xff1a; 防抖指的是在事件触发后&#xff0c;在规定的时间内若再次触发&#xff0c;则重新计时&#xff0c;直到规定时间内没有再次触发事件&#xff0c;才执行事件处理。这样可以避免在短时间内频繁地触发…

SSL证书实惠品牌——JoySSL

随着互联网的普及和发展&#xff0c;网络安全问题日益严重。为了保护网站数据的安全&#xff0c;越来越多的网站开始使用SSL证书。JoySSL证书作为一款高性价比的SSL证书&#xff0c;受到了广泛的关注和好评。 目前市面上主流的证书基本上都是国外证书&#xff0c;也就是说你在验…

爬虫程序为什么一次写不好?需要一直修改BUG?

从我学习编程以来&#xff0c;尤其是在学习数据抓取采集这方面工作&#xff0c;经常遇到改不完的代码&#xff0c;我毕竟从事了8年的编程工作&#xff0c;算不上大佬&#xff0c;但是也不至于那么差。那么哪些因素导致爬虫代码一直需要修改出现BUG&#xff1f;下面来谈谈我的感…

一种新的基于物理的AlGaN/GaN HFET紧凑模型

标题&#xff1a;A new physics-based compact model for AlGaN/GaN HFETs (IEEE MTT-S International Microwave Symposium) 摘要 摘要 - 针对AlGaN/GaN HFET&#xff0c;提出了一种无拟合参数的物理解析模型。对于非饱和操作&#xff0c;建立了两个接入区和栅极下方I-V特性的…

【MVP矩阵】裁剪空间、NDC空间、屏幕空间

裁剪空间概述 裁剪空间是一个顶点乘以MVP矩阵之后所在的空间&#xff0c;Vertex Shader的输出就是在裁剪空间上&#xff08;划重点&#xff09; NDC空间概述 接上面&#xff0c;由GPU自己做透视除法将顶点转到NDC空间 两者的转换 透视除法将Clip Space顶点的4个分量都除以…

selenium 工具 的基本使用

公司每天要做工作汇报&#xff0c;汇报使用的网页版&#xff0c; 所以又想起 selenium 这个老朋友了。 再次上手&#xff0c;发现很多接口都变了&#xff0c; 怎么说呢&#xff0c; 应该是易用性更强了&#xff0c; 不过还是得重新看看&#xff0c; 我这里是python3。 pip安装…

双音多频的通信(数字信号处理实验3)

&#xff08;1&#xff09;从数字信号处理的角度分析双音多频通信&#xff0c;查阅资料了解双音多频通信的原理及工作过程&#xff0c;总结在实验报告中。 &#xff08;2&#xff09;了解DTMF接收信号时&#xff0c;离散傅立叶变化的过程。 &#xff08;3&#xff09;在程序中改…

人工智能 -- 技术概览

1、我们身处人工智能的时代 人们从早期做web开发&#xff0c;到移动端的开发&#xff1b;之后随着数据量的增大&#xff0c;人们开始研究高并发的问题&#xff1b;当数据量不断的增大&#xff0c;而人们希望数据不被浪费时&#xff0c;产生了大数据的技术&#xff0c;包括&…

真空工艺腔内潮湿有什么危害?

在半导体制程中&#xff0c;真空工艺腔被广泛使用。薄膜沉积&#xff0c;干法刻蚀&#xff0c;光刻&#xff0c;退火&#xff0c;离子注入等工序均需要在相应的真空腔室中完成相应制程。真空工艺腔在半导体制程中起着至关重要的作用&#xff0c;它能够提供一个高度控制的环境&a…

河北中洺科技-数据标注是怎样工作的?

由于人工智能系统的普及&#xff0c;各种智能场景在生活中变得普遍。然而&#xff0c;在这些极大方便我们生活的智能背后&#xff0c;数据标注似乎从未被人们所重视。数据标注是怎样的工作&#xff1f;为什么被称为人工智能训练师&#xff1f; 要想了解这些问题&#xff0c;我…

npm-工具包

npm-工具包 npm 介绍 npm&#xff08;Node Package Manager&#xff09;是用于管理和共享Node.js包&#xff08;包括代码、工具和资源&#xff09;的包管理工具 常用命令 局部安装包 npm install <package-name>: 安装指定的包 npm install <package-name> --save…