• 前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(二)


    思维导图

    一、事件监听(绑定)

    1.1 事件监听

    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>点击button>
    11. <script>
    12. // 需求: 点击了按钮,弹出一个对话框
    13. // 1. 事件源 按钮
    14. // 2.事件类型 点击鼠标 click 字符串
    15. // 3. 事件处理程序 弹出对话框
    16. const btn = document.querySelector('button')
    17. btn.addEventListener('click', function () {
    18. alert('你早呀~')
    19. })
    20. script>
    21. body>
    22. html>

    1. 李伟兴 09:31:13
    2. html>
    3. <html lang="en">
    4. <head>
    5. <meta charset="UTF-8">
    6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    8. <title>Documenttitle>
    9. <style>
    10. .box {
    11. position: relative;
    12. width: 1000px;
    13. height: 200px;
    14. background-color: pink;
    15. margin: 100px auto;
    16. text-align: center;
    17. font-size: 50px;
    18. line-height: 200px;
    19. font-weight: 700;
    20. }
    21. .box1 {
    22. position: absolute;
    23. right: 20px;
    24. top: 10px;
    25. width: 20px;
    26. height: 20px;
    27. background-color: skyblue;
    28. text-align: center;
    29. line-height: 20px;
    30. font-size: 16px;
    31. cursor: pointer;
    32. }
    33. style>
    34. head>
    35. <body>
    36. <div class="box">
    37. 我是广告
    38. <div class="box1">Xdiv>
    39. div>
    40. <script>
    41. // 1. 获取事件源
    42. const box1 = document.querySelector('.box1')
    43. // 关闭的是大盒子
    44. const box = document.querySelector('.box')
    45. // 2. 事件侦听
    46. box1.addEventListener('click', function () {
    47. box.style.display = 'none'
    48. })
    49. script>
    50. body>
    51. html>

    解惑:

    js垃圾回收机制,函数执行完后,声明的变量回收,下次执行时再创建新的。

    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>点击button>
    11. <script>
    12. const btn = document.querySelector('button')
    13. btn.addEventListener('click', function () {
    14. const num = Math.random()
    15. console.log(num)
    16. })
    17. script>
    18. body>
    19. html>

    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>轮播图点击切换title>
    8. <style>
    9. * {
    10. box-sizing: border-box;
    11. }
    12. .slider {
    13. width: 560px;
    14. height: 400px;
    15. overflow: hidden;
    16. }
    17. .slider-wrapper {
    18. width: 100%;
    19. height: 320px;
    20. }
    21. .slider-wrapper img {
    22. width: 100%;
    23. height: 100%;
    24. display: block;
    25. }
    26. .slider-footer {
    27. height: 80px;
    28. background-color: rgb(100, 67, 68);
    29. padding: 12px 12px 0 12px;
    30. position: relative;
    31. }
    32. .slider-footer .toggle {
    33. position: absolute;
    34. right: 0;
    35. top: 12px;
    36. display: flex;
    37. }
    38. .slider-footer .toggle button {
    39. margin-right: 12px;
    40. width: 28px;
    41. height: 28px;
    42. appearance: none;
    43. border: none;
    44. background: rgba(255, 255, 255, 0.1);
    45. color: #fff;
    46. border-radius: 4px;
    47. cursor: pointer;
    48. }
    49. .slider-footer .toggle button:hover {
    50. background: rgba(255, 255, 255, 0.2);
    51. }
    52. .slider-footer p {
    53. margin: 0;
    54. color: #fff;
    55. font-size: 18px;
    56. margin-bottom: 10px;
    57. }
    58. .slider-indicator {
    59. margin: 0;
    60. padding: 0;
    61. list-style: none;
    62. display: flex;
    63. align-items: center;
    64. }
    65. .slider-indicator li {
    66. width: 8px;
    67. height: 8px;
    68. margin: 4px;
    69. border-radius: 50%;
    70. background: #fff;
    71. opacity: 0.4;
    72. cursor: pointer;
    73. }
    74. .slider-indicator li.active {
    75. width: 12px;
    76. height: 12px;
    77. opacity: 1;
    78. }
    79. style>
    80. head>
    81. <body>
    82. <div class="slider">
    83. <div class="slider-wrapper">
    84. <img src="./images/slider01.jpg" alt="" />
    85. div>
    86. <div class="slider-footer">
    87. <p>对人类来说会不会太超前了?p>
    88. <ul class="slider-indicator">
    89. <li class="active">li>
    90. <li>li>
    91. <li>li>
    92. <li>li>
    93. <li>li>
    94. <li>li>
    95. <li>li>
    96. <li>li>
    97. ul>
    98. <div class="toggle">
    99. <button class="prev"><button>
    100. <button class="next">>button>
    101. div>
    102. div>
    103. div>
    104. <script>
    105. // 1. 初始数据
    106. const data = [
    107. { url: './images/slider01.jpg', title: '对人类来说会不会太超前了?', color: 'rgb(100, 67, 68)' },
    108. { url: './images/slider02.jpg', title: '开启剑与雪的黑暗传说!', color: 'rgb(43, 35, 26)' },
    109. { url: './images/slider03.jpg', title: '真正的jo厨出现了!', color: 'rgb(36, 31, 33)' },
    110. { url: './images/slider04.jpg', title: '李玉刚:让世界通过B站看到东方大国文化', color: 'rgb(139, 98, 66)' },
    111. { url: './images/slider05.jpg', title: '快来分享你的寒假日常吧~', color: 'rgb(67, 90, 92)' },
    112. { url: './images/slider06.jpg', title: '哔哩哔哩小年YEAH', color: 'rgb(166, 131, 143)' },
    113. { url: './images/slider07.jpg', title: '一站式解决你的电脑配置问题!!!', color: 'rgb(53, 29, 25)' },
    114. { url: './images/slider08.jpg', title: '谁不想和小猫咪贴贴呢!', color: 'rgb(99, 72, 114)' },
    115. ]
    116. // 获取元素
    117. const img = document.querySelector('.slider-wrapper img')
    118. const p = document.querySelector('.slider-footer p')
    119. const footer = document.querySelector('.slider-footer')
    120. // 1. 右按钮业务
    121. // 1.1 获取右侧按钮
    122. const next = document.querySelector('.next')
    123. let i = 0 // 信号量 控制播放图片张数
    124. // 1.2 注册点击事件
    125. next.addEventListener('click', function () {
    126. // console.log(11)
    127. i++
    128. // 1.6判断条件 如果大于8 就复原为 0
    129. // if (i >= 8) {
    130. // i = 0
    131. // }
    132. i = i >= data.length ? 0 : i
    133. // 1.3 得到对应的对象
    134. // console.log(data[i])
    135. // 调用函数
    136. toggle()
    137. })
    138. // 2. 左侧按钮业务
    139. // 2.1 获取左侧按钮
    140. const prev = document.querySelector('.prev')
    141. // 1.2 注册点击事件
    142. prev.addEventListener('click', function () {
    143. i--
    144. // 判断条件 如果小于0 则爬到最后一张图片索引号是 7
    145. // if (i < 0) {
    146. // i = 7
    147. // }
    148. i = i < 0 ? data.length - 1 : i
    149. // 1.3 得到对应的对象
    150. // console.log(data[i])
    151. // 调用函数
    152. toggle()
    153. })
    154. // 声明一个渲染的函数作为复用
    155. function toggle() {
    156. // 1.4 渲染对应的数据
    157. img.src = data[i].url
    158. p.innerHTML = data[i].title
    159. footer.style.backgroundColor = data[i].color
    160. // 1.5 更换小圆点 先移除原来的类名, 当前li再添加 这个 类名
    161. document.querySelector('.slider-indicator .active').classList.remove('active')
    162. document.querySelector(`.slider-indicator li:nth-child(${i + 1})`).classList.add('active')
    163. }
    164. // 3. 自动播放模块
    165. let timerId = setInterval(function () {
    166. // 利用js自动调用点击事件 click() 一定加小括号调用函数
    167. next.click()
    168. }, 1000)
    169. // 4. 鼠标经过大盒子,停止定时器
    170. const slider = document.querySelector('.slider')
    171. // 注册事件
    172. slider.addEventListener('mouseenter', function () {
    173. // 停止定时器
    174. clearInterval(timerId)
    175. })
    176. // 5. 鼠标离开大盒子,开启定时器
    177. // 注册事件
    178. slider.addEventListener('mouseleave', function () {
    179. // 停止定时器
    180. if (timerId) clearInterval(timerId)
    181. // 开启定时器
    182. timerId = setInterval(function () {
    183. // 利用js自动调用点击事件 click() 一定加小括号调用函数
    184. next.click()
    185. }, 1000)
    186. })
    187. script>
    188. body>
    189. 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. head>
    9. <body>
    10. <input type="text">
    11. <script>
    12. const input = document.querySelector('input')
    13. input.addEventListener('focus', function () {
    14. console.log('有焦点触发')
    15. })
    16. input.addEventListener('blur', function () {
    17. console.log('失去焦点触发')
    18. })
    19. script>
    20. body>
    21. 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. head>
    9. <body>
    10. <input type="text">
    11. <script>
    12. const input = document.querySelector('input')
    13. // 1. 键盘事件
    14. // input.addEventListener('keydown', function () {
    15. // console.log('键盘按下了')
    16. // })
    17. // input.addEventListener('keyup', function () {
    18. // console.log('键盘谈起了')
    19. // })
    20. // 2. 用户输入文本事件 input
    21. input.addEventListener('input', function () {
    22. console.log(input.value)
    23. })
    24. script>
    25. body>
    26. html>

    focus伪类选择器也可以监听获得焦点事件,但我们需要更改元素内容,使用JS

    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. input {
    10. width: 200px;
    11. transition: all .3s;
    12. }
    13. /* focus伪类选择器 获得焦点 */
    14. input:focus {
    15. width: 300px;
    16. }
    17. style>
    18. head>
    19. <body>
    20. <input type="text">
    21. body>
    22. html>

    三、事件对象

    3.1 获取事件对象

    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. <input type="text">
    11. <script>
    12. // const btn = document.querySelector('button')
    13. // btn.addEventListener('click', function (e) {
    14. // console.log(e)
    15. // })
    16. const input = document.querySelector('input')
    17. input.addEventListener('keyup', function (e) {
    18. // console.log(11)
    19. // console.log(e.key)
    20. if (e.key === 'Enter') {
    21. console.log('我按下了回车键')
    22. }
    23. })
    24. script>
    25. body>
    26. html>

    点击按钮后控制台打印对象:

    3.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. head>
    9. <body>
    10. <input type="text">
    11. <script>
    12. // const btn = document.querySelector('button')
    13. // btn.addEventListener('click', function (e) {
    14. // console.log(e)
    15. // })
    16. const input = document.querySelector('input')
    17. input.addEventListener('keyup', function (e) {
    18. // console.log(11)
    19. // console.log(e.key)
    20. if (e.key === 'Enter') {
    21. console.log('我按下了回车键')
    22. }
    23. })
    24. script>
    25. body>
    26. html>

    去字符串左右空格:trim()

    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. <textarea name="" id="" cols="30" rows="10">textarea>
    11. <script>
    12. const str = ' im a teacher '
    13. // console.log(str.trim()) // 去除字符串左右的空格
    14. const tx = document.querySelector('textarea')
    15. tx.addEventListener('keyup', function (e) {
    16. // console.log(tx.value)
    17. if (e.key === 'Enter') {
    18. // console.log(tx.value)
    19. console.log(tx.value.trim() === '')
    20. }
    21. })
    22. script>
    23. body>
    24. 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>评论回车发布title>
    8. <style>
    9. .wrapper {
    10. min-width: 400px;
    11. max-width: 800px;
    12. display: flex;
    13. justify-content: flex-end;
    14. }
    15. .avatar {
    16. width: 48px;
    17. height: 48px;
    18. border-radius: 50%;
    19. overflow: hidden;
    20. background: url(./images/avatar.jpg) no-repeat center / cover;
    21. margin-right: 20px;
    22. }
    23. .wrapper textarea {
    24. outline: none;
    25. border-color: transparent;
    26. resize: none;
    27. background: #f5f5f5;
    28. border-radius: 4px;
    29. flex: 1;
    30. padding: 10px;
    31. transition: all 0.5s;
    32. height: 30px;
    33. }
    34. .wrapper textarea:focus {
    35. border-color: #e4e4e4;
    36. background: #fff;
    37. height: 50px;
    38. }
    39. .wrapper button {
    40. background: #00aeec;
    41. color: #fff;
    42. border: none;
    43. border-radius: 4px;
    44. margin-left: 10px;
    45. width: 70px;
    46. cursor: pointer;
    47. }
    48. .wrapper .total {
    49. margin-right: 80px;
    50. color: #999;
    51. margin-top: 5px;
    52. opacity: 0;
    53. transition: all 0.5s;
    54. }
    55. .list {
    56. min-width: 400px;
    57. max-width: 800px;
    58. display: flex;
    59. }
    60. .list .item {
    61. width: 100%;
    62. display: flex;
    63. }
    64. .list .item .info {
    65. flex: 1;
    66. border-bottom: 1px dashed #e4e4e4;
    67. padding-bottom: 10px;
    68. }
    69. .list .item p {
    70. margin: 0;
    71. }
    72. .list .item .name {
    73. color: #FB7299;
    74. font-size: 14px;
    75. font-weight: bold;
    76. }
    77. .list .item .text {
    78. color: #333;
    79. padding: 10px 0;
    80. }
    81. .list .item .time {
    82. color: #999;
    83. font-size: 12px;
    84. }
    85. style>
    86. head>
    87. <body>
    88. <div class="wrapper">
    89. <i class="avatar">i>
    90. <textarea id="tx" placeholder="发一条友善的评论" rows="2" maxlength="200">textarea>
    91. <button>发布button>
    92. div>
    93. <div class="wrapper">
    94. <span class="total">0/200字span>
    95. div>
    96. <div class="list">
    97. <div class="item" style="display: none;">
    98. <i class="avatar">i>
    99. <div class="info">
    100. <p class="name">清风徐来p>
    101. <p class="text">大家都辛苦啦,感谢各位大大的努力,能圆满完成真是太好了[笑哭][支持]p>
    102. <p class="time">2022-10-10 20:29:21p>
    103. div>
    104. div>
    105. div>
    106. <script>
    107. const tx = document.querySelector('#tx')
    108. const total = document.querySelector('.total')
    109. const item = document.querySelector('.item')
    110. const text = document.querySelector('.text')
    111. // 1. 当我们文本域获得了焦点,就让 total 显示出来
    112. tx.addEventListener('focus', function () {
    113. total.style.opacity = 1
    114. })
    115. // 2. 当我们文本域失去了焦点,就让 total 隐藏出来
    116. tx.addEventListener('blur', function () {
    117. total.style.opacity = 0
    118. })
    119. // 3. 检测用户输入
    120. tx.addEventListener('input', function () {
    121. // console.log(tx.value.length) 得到输入的长度
    122. total.innerHTML = `${tx.value.length}/200字`
    123. })
    124. // 4. 按下回车发布评论
    125. tx.addEventListener('keyup', function (e) {
    126. // 只有按下的是回车键,才会触发
    127. // console.log(e.key)
    128. if (e.key === 'Enter') {
    129. // 如果用户输入的不为空就显示和打印
    130. if (tx.value.trim()) {
    131. // console.log(11)
    132. item.style.display = 'block'
    133. // console.log(tx.value) // 用户输入的内容
    134. text.innerHTML = tx.value
    135. }
    136. // 等我们按下回车,结束,清空文本域
    137. tx.value = ''
    138. // 按下回车之后,就要把 字符统计 复原
    139. total.innerHTML = '0/200字'
    140. }
    141. })
    142. script>
    143. body>
    144. html>

    四、 环境对象

    五、 回调函数

    为什么不使用hover,而要使用鼠标经过事件?

    鼠标离开后,元素仍处于active状态

    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>tab栏切换title>
    8. <style>
    9. * {
    10. margin: 0;
    11. padding: 0;
    12. }
    13. .tab {
    14. width: 590px;
    15. height: 340px;
    16. margin: 20px;
    17. border: 1px solid #e4e4e4;
    18. }
    19. .tab-nav {
    20. width: 100%;
    21. height: 60px;
    22. line-height: 60px;
    23. display: flex;
    24. justify-content: space-between;
    25. }
    26. .tab-nav h3 {
    27. font-size: 24px;
    28. font-weight: normal;
    29. margin-left: 20px;
    30. }
    31. .tab-nav ul {
    32. list-style: none;
    33. display: flex;
    34. justify-content: flex-end;
    35. }
    36. .tab-nav ul li {
    37. margin: 0 20px;
    38. font-size: 14px;
    39. }
    40. .tab-nav ul li a {
    41. text-decoration: none;
    42. border-bottom: 2px solid transparent;
    43. color: #333;
    44. }
    45. .tab-nav ul li a.active {
    46. border-color: #e1251b;
    47. color: #e1251b;
    48. }
    49. .tab-content {
    50. padding: 0 16px;
    51. }
    52. .tab-content .item {
    53. display: none;
    54. }
    55. .tab-content .item.active {
    56. display: block;
    57. }
    58. style>
    59. head>
    60. <body>
    61. <div class="tab">
    62. <div class="tab-nav">
    63. <h3>每日特价h3>
    64. <ul>
    65. <li><a class="active" href="javascript:;">精选a>li>
    66. <li><a href="javascript:;">美食a>li>
    67. <li><a href="javascript:;">百货a>li>
    68. <li><a href="javascript:;">个护a>li>
    69. <li><a href="javascript:;">预告a>li>
    70. ul>
    71. div>
    72. <div class="tab-content">
    73. <div class="item active"><img src="./images/tab00.png" alt="" />div>
    74. <div class="item"><img src="./images/tab01.png" alt="" />div>
    75. <div class="item"><img src="./images/tab02.png" alt="" />div>
    76. <div class="item"><img src="./images/tab03.png" alt="" />div>
    77. <div class="item"><img src="./images/tab04.png" alt="" />div>
    78. div>
    79. div>
    80. <script>
    81. // 1. a 模块制作 要给 5个链接绑定鼠标经过事件
    82. // 1.1 获取 a 元素
    83. const as = document.querySelectorAll('.tab-nav a')
    84. // console.log(as)
    85. for (let i = 0; i < as.length; i++) {
    86. // console.log(as[i])
    87. // 要给 5个链接绑定鼠标经过事件
    88. as[i].addEventListener('mouseenter', function () {
    89. // console.log('鼠标经过')
    90. // 排他思想
    91. // 干掉别人 移除类active
    92. document.querySelector('.tab-nav .active').classList.remove('active')
    93. // 我登基 我添加类 active this 当前的那个 a
    94. this.classList.add('active')
    95. // 下面5个大盒子 一一对应 .item
    96. // 干掉别人
    97. document.querySelector('.tab-content .active').classList.remove('active')
    98. // 对应序号的那个 item 显示 添加 active 类
    99. document.querySelector(`.tab-content .item:nth-child(${i + 1})`).classList.add('active')
    100. })
    101. }
    102. script>
    103. body>
    104. html>

  • 相关阅读:
    SpringBoot 过滤器和拦截器的区别
    @pytest.mark.dependency依赖跨模块时,当前测试方法自动被跳过
    算法——滑动窗口
    C盘清理教程
    编程语言新特性:instanceof的改进
    【车辆配送】基于模拟退火 (SA)求解车辆配送 (VPR) (Matlab代码实现)
    LeetCode 42. 接雨水
    天文信号处理 Lightkurve 安装教程 报错处理
    c++模板小例子
    【C++学习第六讲】第一章练习题(含源代码)
  • 原文地址:https://blog.csdn.net/upgrade_bro/article/details/133318112