当前位置: 首页 > article >正文

前端学习-事件监听以及案例(二十四)

目录

文章目录

前言

事件监听

目标

什么是事件?

语法:

事件监听三要素

示例代码

注意

案例一:广告的关闭

案例二:随机点名

案例三:轮播图

事件监听版本

DOM L0

DOM L2

区别

事件类型

鼠标事件

鼠标触发

焦点事件

​ 表单获得光标

键盘事件

​ 键盘触发

文本事件

​ 表单输入触发

总结


前言

晚上好各位,今天是长文,讲述了事件监听的基本原理并附带三个案例,各位酌情学习


事件监听

目标

能够给DOM元素添加事件监听

什么是事件?

事件是在编程时系统内发生的动作或者发生的事情比如用户在网页上单击一个按钮

什么是事件监听?就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应,也称为 绑定事件或者注册事件比如鼠标经过显示下拉菜单,比如点击可以播放轮播图等等

语法:

元素对象.addEventListener('事件类型',要执行的函数)

事件监听三要素

事件源: 那个dom元素被事件触发了,要获取dom元素

事件类型:用什么方式触发,比如鼠标单击click、鼠标经过 mouseover等

事件调用的函数:要做什么事

示例代码

<button id="myButton">按钮</button>

<script> // 使用ID选择器来选取按钮元素 const btn = document.querySelector('#myButton');

// 为按钮添加点击事件监听器 btn.addEventListener('click', function() { // 当按钮被点击时,弹出警告框 alert('点击了~'); ​ // 修改按钮样式(例如改变背景颜色) btn.style.backgroundColor = 'lightblue'; });</script>

注意

事件类型要加引号

函数是点击之后再去执行,每次点击都会执行一次

案例一:广告的关闭

详细代码:

<!DOCTYPE html>
​
<html lang="en">
​
<head>
​
  <meta charset="UTF-8">
​
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
​
  <title>Event Listeners</title>
​
  <style>
​
    .ad-container {
​
      width: 50%;
​
      height: 50%;
​
      position: absolute;
​
      top: 30%;
​
      left: 50%;
​
      transform: translate(-50%, -50%);
​
      background-color: yellow;
​
      padding: 20px;
​
      border: 1px solid black;
​
      text-align: center;
​
      display: flex;
​
      justify-content: center;
​
      align-items: center;
​
      position: relative;
​
      /* 添加相对定位 */
​
    }
​
    .close-button {
​
      position: absolute;
​
      top: 10px;
​
      right: 10px;
​
      cursor: pointer;
​
      font-size: 20px;
​
      background-color: red;
​
      color: white;
​
      border-radius: 50%;
​
      width: 20px;
​
      height: 20px;
​
      display: flex;
​
      justify-content: center;
​
      align-items: center;
​
    }
​
  </style>
​
</head>
​
<body>
​
  <button id="btn">Click Me</button>
​
  <div class="ad-container">
​
    <div class="close-button">X</div>
​
    这是广告
​
  </div>
​
  <script>
​
    const bin = document.querySelector('#btn');
​
    bin.addEventListener('click', function () {
​
      alert('You Clicked Me!');
​
      bin.style.backgroundColor = 'green';
​
      let one = prompt('What is your name?');
​
      console.log(one);
​
    });
​
    // 添加关闭广告的事件监听器
​
    const closeButton = document.querySelector('.close-button');
​
    closeButton.addEventListener('click', function () {
​
      const adContainer = document.querySelector('.ad-container');
​
      adContainer.style.display = 'none'; // 隐藏广告块
​
    });
​
  </script>
​
</body>
​
</html>
​

案例二:随机点名

详细代码:

<!DOCTYPE html>
​
<html lang="en">
​
<head>
​
  <meta charset="UTF-8">
​
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
​
  <title>Event Listeners</title>
​
  <style>
​
    .question-container {
​
      margin-top: 20px;
​
      text-align: center;
​
    }
​
    .button-container {
​
      text-align: center;
​
      margin-top: 20px;
​
    }
​
    .button-container button {
​
      margin: 0 30px;
​
      width: 100px;
​
      height: 40px;
​
      border: 1px solid #ccc;
​
      font-size: 14px;
​
      padding: 0;
​
    }
​
  </style>
​
</head>
​
<body>
​
  <div class="question-container">
​
    <h2>随机问答</h2>
​
    <p id="random-question"></p>
​
  </div>
​
  <div class="button-container">
​
    <button id="start-btn">开始</button>
​
    <button id="end-btn">结束</button>
​
  </div>
​
  <script>
​
    // 定义问题数组
​
    const questions = [
​
      "开始和结束之间的关系是什么?",
​
      "如何在JavaScript中生成随机数?",
​
      "CSS中的position属性有哪些值?",
​
      "HTML中的<meta>标签有什么作用?",
​
      "JavaScript中的闭包是什么?"
​
    ];
​
    let currentQuestion = null;
​
    let intervalId = null;
​
    function getRandomQuestion() {
​
      if (questions.length === 0) {
​
        alert('没有问题可以抽取了!');
​
        return null;
​
      }
​
      const randomIndex = Math.floor(Math.random() * questions.length);
​
      currentQuestion = questions[randomIndex];
​
      return currentQuestion;
​
    }
​
    function displayQuestion() {
​
      const randomQuestionElement = document.getElementById('random-question');
​
      randomQuestionElement.textContent = getRandomQuestion();
​
    }
​
    document.getElementById('start-btn').addEventListener('click', function () {
​
      if (questions.length === 1) {
​
        alert('只剩最后一个数据不用抽了!');
​
        document.getElementById('start-btn').disabled = true;
​
        document.getElementById('end-btn').disabled = true;
​
        displayQuestion();
​
        return;
​
      }
​
      if (intervalId) {
​
        clearInterval(intervalId);
​
      }
​
      intervalId = setInterval(displayQuestion, 100); // 每秒展示一个新问题
​
    });
​
    // 结束按钮点击事件
​
    document.getElementById('end-btn').addEventListener('click', function () {
​
      if (currentQuestion) {
​
        const index = questions.indexOf(currentQuestion);
​
        if (index !== -1) {
​
          questions.splice(index, 1);
​
        }
​
        currentQuestion = null;
​
        clearInterval(intervalId);
​
        intervalId = null;
​
        displayQuestion();
​
      }
​
      if (questions.length === 1) {
​
        alert('只剩最后一个数据不用抽了!');
​
        document.getElementById('start-btn').disabled = true;
​
        document.getElementById('end-btn').disabled = true;
​
      }
​
    });
​
    // 初始化显示
​
    displayQuestion();
​
  </script>
​
</body>
​
</html>
​

案例三:轮播图

示例代码:

<!DOCTYPE html>
<html lang="en">
​
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>轮播图点击切换</title>
  <style>
    * {
      box-sizing: border-box;
      margin: 0;
      padding: 0;
    }
​
    body,
    html {
      height: 100%;
      margin: 0;
    }
​
    .slider {
      width: 500px;
      height: 500px;
      overflow: hidden;
      position: relative;
    }
​
    .slider-wrapper {
      width: 100%;
      height: 100%;
    }
​
    .slider-wrapper img {
      width: 100%;
      height: 100%;
      object-fit: cover;
      display: block;
    }
​
    .slider-footer {
      position: absolute;
      bottom: 0;
      width: 100%;
      height: 80px;
      background-color: rgba(0, 255, 255, 0.5);
      padding: 12px 12px 0 12px;
      box-sizing: border-box;
    }
​
    .slider-footer .toggle {
      position: absolute;
      right: 0;
      top: 12px;
      display: flex;
    }
​
    .slider-footer .toggle button {
      margin-right: 12px;
      width: 28px;
      height: 28px;
      appearance: none;
      border: none;
      background: rgba(255, 255, 255, 0.1);
      color: #fff;
      border-radius: 4px;
      cursor: pointer;
    }
​
    .slider-footer .toggle button:hover {
      background: rgba(255, 255, 255, 0.2);
    }
​
    .slider-footer p {
      margin: 0;
      color: #fff;
      font-size: 18px;
      margin-bottom: 10px;
    }
​
    .slider-indicator {
      margin: 0;
      padding: 0;
      list-style: none;
      display: flex;
      align-items: center;
      justify-content: center;
      width: 100%;
      position: absolute;
      bottom: 12px;
    }
​
    .slider-indicator li {
      width: 8px;
      height: 8px;
      margin: 4px;
      border-radius: 50%;
      background: #fff;
      opacity: 0.4;
      cursor: pointer;
    }
​
    .slider-indicator li.active {
      width: 12px;
      height: 12px;
      opacity: 1;
    }
  </style>
</head>
​
<body>
  <div class="slider">
    <div class="slider-wrapper">
      <img src="./image/1.jpg" alt="Image 1">
    </div>
    <div class="slider-footer">
      <p>下午好啊卷芯小狗</p>
      <ul class="slider-indicator">
        <li class="active"></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
      </ul>
      <div class="toggle">
        <button class="prev">&lt;</button>
        <button class="next">&gt;</button>
      </div>
    </div>
  </div>
  <script>
    const sliderData = [{
        url: './image/1.jpg',
        title: ''
      },
      {
        url: './image/2.jpg',
        title: ''
      },
      {
        url: './image/3.jpg',
        title: ''
      },
      {
        url: './image/4.jpg',
        title: '菜'
      },
      {
        url: './image/5.jpg',
        title: '狗'
      }
    ];
​
    let currentIndex = 0;
    let autoPlayInterval;
​
    function showSlide(index) {
      const img = document.querySelector('.slider-wrapper img');
      img.src = sliderData[index].url;
      document.querySelectorAll('.slider-indicator li').forEach((li, i) => {
        li.classList.toggle('active', i === index);
      });
    }
​
    function nextSlide() {
      currentIndex = (currentIndex + 1) % sliderData.length;
      showSlide(currentIndex);
    }
​
    function prevSlide() {
      currentIndex = (currentIndex - 1 + sliderData.length) % sliderData.length;
      showSlide(currentIndex);
    }
​
    // 添加指示器项的点击事件监听器
    document.querySelectorAll('.slider-indicator li').forEach((li, index) => {
      li.addEventListener('click', () => {
        currentIndex = index;
        showSlide(currentIndex);
      });
    });
​
    document.querySelector('.next').addEventListener('click', nextSlide);
    document.querySelector('.prev').addEventListener('click', prevSlide);
​
    // 自动播放
    function startAutoPlay() {
      autoPlayInterval = setInterval(nextSlide, 1000);
    }
​
    function stopAtuoPlay() {
      clearInterval(autoPlayInterval);
    }
    const sliderElement = document.querySelector('.slider');
    sliderElement.addEventListener('mouseenter', stopAtuoPlay);
    sliderElement.addEventListener('mouseleave', startAutoPlay);
  </script>
</body>
​
</html>

事件监听版本

DOM L0

事件源.on事件=function(){}

DOM L2

事件源.addEventListener(事件,事件处理函数)

区别

on方式会被覆盖,addEventListener方式可绑定多次,拥有事件更多特性,推荐使用

因为DOM L0相当于赋值,后面的覆盖前面的

事件类型

鼠标事件

鼠标触发

  1. click-鼠标点击

  2. mouseenter-鼠标经过

  3. mouseleave-鼠标离开

焦点事件

​ 表单获得光标

  1. focus-获得焦点

  2. blur-失去焦点

键盘事件

​ 键盘触发

  1. Keydown-键盘按下触发

  2. Keyup-键盘抬起触发

文本事件

​ 表单输入触发

​ 1.input-用户输入事件


总结

各位晚安


http://www.kler.cn/a/499912.html

相关文章:

  • 数据结构之双向链表
  • Python 正则表达式完全指南
  • 【redis】ubuntu18安装redis7
  • fastadmin插件wanlshop使用方法
  • C++语言的文件操作
  • 《探秘开源多模态神经网络模型:AI 新时代的万能钥匙》
  • Virtualbox7.1.4安装Proxmox
  • React(二)——Admin主页/Orders页面/Category页面
  • Flutter项目适配鸿蒙
  • 微前端介绍
  • 索引页与B+树的关系
  • halcon三维点云数据处理(十)locate_cylinder_3d
  • VS Code的设置功能以及多层级的设置方式与解密
  • 海康机器人IPO,又近了一步
  • 青稞Talk预告!面向自动驾驶与物理世界对齐的视频生成模型
  • PY_11_07
  • 深入详解自然语言处理(NLP)中的语言模型:BERT、GPT及其他预训练模型的原理与应用
  • Qt学习笔记第81到90讲
  • SpringBoot日常:集成Kafka
  • 【深度学习】数据预处理
  • vue3的v-for 与 v-if
  • React setState详细使用总结
  • Bytebase 3.1.0 - 通过 Google / GitHub SSO 功能开放给专业版