• 【第五部分 | JS WebAPI】4:八千字详解 “事件·高级篇”


    目录

    | 概述

    | 注册事件的两种方式

    | 删除事件的两种方式

    | 事件对象【重要】

    事件对象简介和声明

    e.target 和 this 的区别

    [ 事件对象 的常用属性方法 ]

    | Dom事件流

    什么是Dom事件流?

    阻止默认行为

    阻止事件冒泡

    利用事件冒泡进行事件委托

    | 常用的鼠标和键盘事件 & 事件对象

    1-1 鼠标基本事件

    1-2 鼠标事件对象:禁用鼠标右键和选中

    1-2 鼠标基本事件:返回鼠标坐标

    1-3 案例:图片跟随鼠标

    2-1 键盘基本事件

    2-2 键盘事件对象:获取ASCII值

    2-3 案例:当我们按下 s 键, 光标就定位到搜索框

    2-3 案例:当我们在文本框中输入内容时,文本框上面自动显示大字号的内容


    | 概述

    目标

    目录

     

    | 注册事件的两种方式

    • 给元素添加事件,称为注册事件或者绑定事件

    传统方式注册事件

    • 就是我们之前学的最原始的事件方式: 元素对象.onXXXX = function(){ //... }

    • 特点:所注册的事件有唯一性

    • 唯一性,即:同一个元素同一个事件只能设置一个处理函数,最 后注册的处理函数将会覆盖前面注册的处理函数

    监听方式注册事件(W3C标准 推荐使用)

    • addEventListener() 它是一个方法

    • IE9 之前的 IE 不支持此方法,可使用 attachEvent() 代替

    • 同一个元素,可以添加多个事件函数。且会同一个元素同一个事件可以注册多个监听器  按注册顺序依次执行

    语法

    eventTarget.addEventListener(type, listener[, useCapture])

     

    上述代码示例

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. head>
    9. <body>
    10. <button class="btn1">传统方法注册事件button>
    11. <script>
    12. var traditional = document.querySelector('.btn1');
    13. traditional.onclick = function(){
    14. alert('我是第一个弹窗');
    15. }
    16. traditional.onclick = function(){
    17. alert('我是第二个弹窗'); //只弹出了这个,说明传统方法注册的事件有唯一性
    18. }
    19. script>
    20. <button class="btn2">监听方法注册事件button>
    21. <script>
    22. var listener = document.querySelector('.btn2');
    23. listener.addEventListener('click',function(){//注意:千万不要在click前面加on
    24. alert('我是第一个弹窗'); //弹出
    25. })
    26. listener.addEventListener('click',function(){
    27. alert('我是第二个弹窗'); //弹出 说明监听的事件不会覆盖之前的,而是按顺序执行
    28. })
    29. script>
    30. body>
    31. html>


    | 删除事件的两种方式

    代码示例

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <style>
    9. div {
    10. width: 100px;
    11. height: 100px;
    12. background-color: pink;
    13. margin: 10px ;
    14. border: 1px solid black;
    15. }
    16. span {
    17. display: block;
    18. width: 100px;
    19. height: 100px;
    20. background-color: black;
    21. margin: 10px;
    22. border: 1px solid black;
    23. }
    24. style>
    25. head>
    26. <body>
    27. <div>div>
    28. <div>div>
    29. <div>div>
    30. <span>span>
    31. <span>span>
    32. <script>
    33. // 传统方式删除事件:点击div第一次弹窗,之后就不弹了
    34. var divs = document.getElementsByTagName('div');
    35. for(var i=0 ; ilength ; i++) {
    36. divs[i].onclick = function(){
    37. alert('这是一个弹窗');
    38. this.onclick = null;
    39. }
    40. }
    41. // 监听方式删除事件
    42. var spans = document.getElementsByTagName('span');
    43. for(var i=0 ; ilength ; i++){
    44. //两个注意点:监听方式删除事件的removeEventListener不能写在匿名函数中。 监听事件方法的参数的函数调用不需要打括号。
    45. spans[i].addEventListener('click',f);
    46. function f(){
    47. alert('这是span窗口');
    48. this.removeEventListener('click',f);
    49. }
    50. }
    51. script>
    52. body>
    53. html>

     

    | 事件对象【重要】

    事件对象简介和声明

    事件对象是一个JS内置对象,不同的事件都有自己的事件对象,对象中包含了不同的属性、方法

    • event 就是一个事件对象 写到我们侦听函数的 小括号里面 当形参来看

    • 事件对象只有有了事件才会存在,它是系统给我们自动创建的,不需要我们传递参数,我们只需要在事件响应函数的参数写上变量名表示事件对象即可

    • 事件对象 是 我们事件的一系列相关数据的集合 跟事件相关的 比如鼠标点击里面就包含了鼠标的相关信息,鼠标坐标啊,如果是键盘事件里面就包含的键盘事件的信息 比如 判断用户按下了那个键

    • 这个事件对象我们可以自己命名 比如 event 、 evt、 e

    • 事件对象也有兼容性问题 ie678 通过 window.event 兼容性的写法 e = e || window.event;

    代码示例

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
    7. <title>Documenttitle>
    8. <style>
    9. div {
    10. width: 100px;
    11. height: 100px;
    12. background-color: pink;
    13. }
    14. style>
    15. head>
    16. <body>
    17. <div>123div>
    18. <script>
    19. // 事件对象【再次强调:有了事件,才有事件对象!且不需要我们传实参进去。】
    20. var div = document.querySelector('div');
    21. div.onclick = function(e) {
    22. console.log(e);
    23. console.log(window.event);
    24. console.log(e);
    25. }
    26. div.addEventListener('click', function(e) {
    27. console.log(e);
    28. })
    29. script>
    30. body>
    31. html>

    e.target 和 this 的区别

    代码示例

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
    7. <title>Documenttitle>
    8. <style>
    9. div {
    10. width: 100px;
    11. height: 100px;
    12. background-color: pink;
    13. }
    14. style>
    15. head>
    16. <body>
    17. <div>123div>
    18. <ul>
    19. <li>abcli>
    20. <li>abcli>
    21. <li>abcli>
    22. ul>
    23. <script>
    24. // 常见事件对象的属性和方法
    25. // 1. e.target 返回的是触发事件的对象(元素) this 返回的是绑定事件的对象(元素)
    26. // 区别 : e.target 点击了那个元素,就返回那个元素 this 那个元素绑定了这个点击事件,那么就返回谁
    27. var div = document.querySelector('div');
    28. div.addEventListener('click', function(e) {
    29. console.log(e.target);
    30. console.log(this);
    31. })
    32. var ul = document.querySelector('ul');
    33. ul.addEventListener('click', function(e) {
    34. // 我们给ul 绑定了事件 那么this 就指向ul
    35. console.log(this); //ul 绑定的事件
    36. console.log(e.currentTarget); //ul 绑定的事件(e.currentTarget 相当于 this)
    37. // e.target 指向我们点击的那个对象 谁触发了这个事件 我们点击的是li e.target 指向的就是li
    38. console.log(e.target); //li 点击的对象
    39. })
    40. // 了解兼容性
    41. // div.onclick = function(e) {
    42. // e = e || window.event;
    43. // var target = e.target || e.srcElement;
    44. // console.log(target);
    45. // }
    46. // 2. 了解 跟 this 有个非常相似的属性 currentTarget ie678不认识
    47. script>
    48. body>
    49. html>


    [ 事件对象 的常用属性方法 ]


    | Dom事件流

    什么是Dom事件流?


    说人话,就是:如果listener第三个参数写的是true,则按照捕获顺序依次查看对应元素(document → html → body → ... → 当前元素对象)的监听方法,只要有一个执行了,就不会继续往下寻找;若第三个参数写的是false,则按照冒泡顺序一次查看对应元素(当前元素对象 → ... → body → html → document)。 一般情况下,参数可以不写,默认是false,即从当前对象开始寻找监听对象。


    阻止默认行为

    作用:禁用标签的默认行为。比如给标签 a 声明一个监听器:点击的时候让其无法跳转。则通过其 点击的事件对象 调用preventDefault()方法,禁用跳转

     

    阻止事件冒泡

    • 事件冒泡:开始时由最具体的元素接收,然后逐级向上传播到到 DOM 最顶层节点。

    • 事件冒泡本身的特性,会带来的坏处,也会带来的好处,需要我们灵活掌握。

    e 是“事件对象”,请参见本章的下一节


    利用事件冒泡进行事件委托

    说人话就是:不在每一条路都设置收费站,而是让不同道路上的车继续通行(冒泡),直到全部行驶到总道,在总道路上设置一个收费站即可

    代码示例(给父元素设置点击响应函数,让用户在点击父元素的子元素的时候,子元素背景色产生变化)

    需要纠正一个误区:拿下面这段代码举例而言:即使我们没有给div的子元素span添加点击事件click,但是我们点击子元素,仍然会触发这个事件!只不过我们没有给这个事件编写响应函数,我们看不到反应而已! 根据冒泡原理,会继续向上冒泡到父元素div,由于我们给div写了点击事件的响应函数,因此我们会看到有变化发生。后续,由于我们没有阻止冒泡,因此这个事件会继续冒泡到body html document……但是我没有给它们编写响应函数,所以也没有任何反应

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <style>
    9. div {
    10. width: 400px;
    11. height: 100px;
    12. background-color: pink;
    13. }
    14. span {
    15. display: block;
    16. float: left;
    17. width: 150px;
    18. height: 80px;
    19. background-color: yellow;
    20. margin: 10px 25px;
    21. }
    22. style>
    23. head>
    24. <body>
    25. <div>
    26. <span>1span>
    27. <span>2span>
    28. div>
    29. <script>
    30. var div = document.querySelector('div');
    31. div.addEventListener('click',function(e){
    32. e.target.style.backgroundColor = 'blue';
    33. //e.target代表触发事件的元素
    34. })
    35. script>
    36. body>
    37. html>


    | 常用的鼠标和键盘事件 & 事件对象

    1-1 鼠标基本事件


    1-2 鼠标事件对象:禁用鼠标右键和选中


    代码示例

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <style>
    9. div {
    10. width: 100px;
    11. height: 100px;
    12. background-color: pink;
    13. margin: 200px auto;
    14. }
    15. style>
    16. head>
    17. <body>
    18. <div>我是文本div>
    19. <script>
    20. //禁止鼠标右键菜单
    21. document.addEventListener('contextmenu',function(e){
    22. e.preventDefault(); //设置了这个之后,鼠标右键失效
    23. })
    24. //禁止选中文本
    25. var div = document.querySelector('div');
    26. div.addEventListener('selectstart',function(e){
    27. e.preventDefault(); //设置了这个之后,鼠标无法选中div的文本
    28. })
    29. script>
    30. body>
    31. html>


    1-2 鼠标基本事件:返回鼠标坐标

    1-3 案例:图片跟随鼠标

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <style>
    9. img {
    10. display: block;
    11. position: absolute;
    12. width: 100px;
    13. height: 100px;
    14. }
    15. style>
    16. head>
    17. <body>
    18. <img src="imgs/pic.png">
    19. <script>
    20. var pic = document.querySelector('img');
    21. document.addEventListener('mousemove', function(e) {
    22. var x = e.pageX;
    23. var y = e.pageY;
    24. pic.style.top = y + 'px';
    25. pic.style.left = x + 'px';
    26. })
    27. script>
    28. body>
    29. html>


    2-1 键盘基本事件


    2-2 键盘事件对象:获取ASCII值



    2-3 案例:当我们按下 s 键, 光标就定位到搜索框

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <style>
    9. * {
    10. margin: 0;
    11. padding: 0;
    12. }
    13. form {
    14. display: block;
    15. width: 300px;
    16. height: 30px;
    17. margin: 200px auto;
    18. }
    19. form input {
    20. width: 200px;
    21. height: 30px;
    22. background-color: lightcyan;
    23. }
    24. form button {
    25. width: 50px;
    26. height: 30px;
    27. background-color: lightblue;
    28. }
    29. style>
    30. head>
    31. <body>
    32. <form action="#">
    33. <input type="text" name="search" placeholder="搜索">
    34. <button>搜索button>
    35. form>
    36. <script>
    37. var search = document.querySelector('input');
    38. document.addEventListener('keyup',function(e){
    39. if(e.keyCode == 83){
    40. search.focus();
    41. }
    42. })
    43. script>
    44. body>
    45. html>


    2-3 案例:当我们在文本框中输入内容时,文本框上面自动显示大字号的内容

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
    7. <title>Documenttitle>
    8. <style>
    9. * {
    10. margin: 0;
    11. padding: 0;
    12. }
    13. .search {
    14. position: relative;
    15. width: 178px;
    16. margin: 100px;
    17. }
    18. .con {
    19. display: none;
    20. position: absolute;
    21. top: -40px;
    22. width: 171px;
    23. border: 1px solid rgba(0, 0, 0, .2);
    24. box-shadow: 0 2px 4px rgba(0, 0, 0, .2);
    25. padding: 5px 0;
    26. font-size: 18px;
    27. line-height: 20px;
    28. color: #333;
    29. }
    30. .con::before {
    31. content: '';
    32. width: 0;
    33. height: 0;
    34. position: absolute;
    35. top: 28px;
    36. left: 18px;
    37. border: 8px solid #000;
    38. border-style: solid dashed dashed;
    39. border-color: #fff transparent transparent;
    40. }
    41. style>
    42. head>
    43. <body>
    44. <div class="search">
    45. <div class="con">123div>
    46. <input type="text" placeholder="请输入您的快递单号" class="jd">
    47. div>
    48. <script>
    49. // 快递单号输入内容时, 上面的大号字体盒子(con)显示(这里面的字号更大)
    50. // 表单检测用户输入: 给表单添加键盘事件
    51. // 同时把快递单号里面的值(value)获取过来赋值给 con盒子(innerText)做为内容
    52. // 如果快递单号里面内容为空,则隐藏大号字体盒子(con)盒子
    53. var con = document.querySelector('.con');
    54. var jd_input = document.querySelector('.jd');
    55. jd_input.addEventListener('keyup', function() {
    56. // console.log('输入内容啦');
    57. if (this.value == '') {
    58. con.style.display = 'none';
    59. } else {
    60. con.style.display = 'block';
    61. con.innerText = this.value;
    62. }
    63. })
    64. // 当我们失去焦点,就隐藏这个con盒子
    65. jd_input.addEventListener('blur', function() {
    66. con.style.display = 'none';
    67. })
    68. // 当我们获得焦点,就显示这个con盒子
    69. jd_input.addEventListener('focus', function() {
    70. if (this.value !== '') {
    71. con.style.display = 'block';
    72. }
    73. })
    74. script>
    75. body>

  • 相关阅读:
    Go 初识微信订阅号(测试号)
    这份阿里内部绝密Java面试八股文手册 谁还没有
    java集合练习,模拟扑克牌发牌。打印最后每个玩家的手牌信息。地主用随机数生成。
    阿里云混合云密码应用分析
    大数据与Hadoop入门理论
    docker高级篇(大厂进阶):安装redis集群
    duilib 实现登录界面 之 样式设计
    【C语言深入理解指针(3)】
    python文件中设置环境变量
    【限免】杂波环境下线性调频脉冲、巴克码、频率步进脉冲雷达MTI、脉冲压缩【附MATLAB代码】
  • 原文地址:https://blog.csdn.net/m0_57265007/article/details/127981458