前端三剑客 —— JavaScript (第八节)

目录

内容回顾:

事件对象

事件对象

事件对象的方法和属性

案例-移动DIV

案例-图片轮换

Ajax


内容回顾:

事件对象

        1.1 什么是事件驱动

        1.2 事件绑定

                事件源:发生事件的源对象

                事件对象:它包含了事件所有的信息,它是以回调函数的第一个参数形式出现的(event)

                事件处理函数:也叫回调函数,它是对事件源产生的事件进行处理

                对于事件绑定而言有两种种方式:

                        1.2.1 DOM0:它是以“事件源对象.事件类型=事件处理函数”的方式进行绑定的

                        1.2.2 DOM2:它是以"事件源对象.addEventListener(‘事件类型’,事件处理函数,捕获/冒泡)“的方式进行绑定。第三个参数是一个布尔值,如果是true表示捕获,如果是false表示冒泡,默认值为false。

                        捕获:是从window > document >body > 目标对象 的一个过程

                        冒泡:是从 目标对象 > body >document >window 的一个过程

        1.3 事件类型

                1.3.1 窗口事件 > window 相关 ,如 window.onload

                1.3.2 键盘事件 > 事件源对象,如:xx.onkeyup,xxx.onkeydowm,xx.onkeypress

                1.3.3 鼠标事件 > 事件源对象,如:xx.onmouseover,xx.onmouseout,xx.onmousemove,xxx.ondrag,..

                1.3.4 表单事件 > 表单元素对象,如:onfocus,onblur,onchange,…

                1.3.5 多媒体事件

事件对象

事件对象包含了事件的各种信息,使我们处理事件时经常需要使用的,使用标签绑定方式获取不到事件对象,DOM0和DOM2模型中事件对象的获取都默认是处理函数的第一个参数

事件对象中有些重要的方法和属性,需要熟悉。

鼠标事件中:事件对象提供了两组来获取浏览器坐标的属性,一组是页面可视区左边,另一组是屏幕坐标。

判断是否存在组合键

键盘事件中:判断键码是什么?字符编码的什么?

事件对象的方法和属性

在标准的 DOM事件中,event对象包含与创建它的特定事件有关的属性和方法。触发的事件类型不一样,可用的属性和方法也不一样。

案例-移动DIV

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>案例-移动div</title>

    <style>

        .box {

            width: 150px;

            height: 150px;

            background-color: blueviolet;

            position: absolute;

        }

        .box:hover {

            cursor: move;

        }

    </style>

</head>

<body>

<div class="box"></div>

<script>

    // 1. 获取事件源对象

    const boxObj = document.querySelector('.box')

    // 2. 给事件源绑定事件(DOM0DOM2

    boxObj.addEventListener('mousedown', function (e) {

        // 获取对象的初始位置

        let w = e.clientX - boxObj.offsetLeft

        let h = e.clientY - boxObj.offsetTop

        // 2.2 添加移动事件,开始移动

        //document.addEventListener('mousemove', function (ev) {

        //    boxObj.style.top = (ev.clientY - h) + 'px'

        //    boxObj.style.left = (ev.clientX - w) + 'px'

        //})

        document.onmousemove = function (ev) {

            boxObj.style.top = (ev.clientY - h) + 'px'

            boxObj.style.left = (ev.clientX - w) + 'px'

        }

    })

    // 3. 添加放开鼠标事件

    boxObj.addEventListener('mouseup', function (e) {

        document.onmousemove = null

    })

</script>

</body>

</html>

案例-图片轮换

功能实现:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>案例 - 图片轮换</title>

    <style>

        * {

            padding: 0;

            margin: 0;

        }

        .banner {

            width: 400px;

            height: 267px;

            overflow: hidden;

            position: relative;

            margin: 50px auto 0;

        }

        ul {

            width: 2000px;

            height: 100%;

            background-color: #C44F00;

            list-style: none;

            display: flex;

        }

        ul li {

            width: 400px;

            height: 100%;

            display: none;

        }

        ol {

            width: 130px;

            height: 20px;

            position: absolute;

            left: 35%;

            bottom: 20px;

            background: rgba(0, 0, 0, .6);

            border-radius: 10px;

            display: flex;

            justify-content: space-between;

            /*align-items: center;*/

            list-style: none;

        }

        ol li {

            margin: 3px 6px 0;

            width: 13px;

            height: 13px;

            border-radius: 50%;

            background: rgba(255, 255, 255, .5);

            cursor: pointer;

        }

        img {

            width: 400px;

            height: 267px;

        }

        .page_left {

            position: absolute;

            top: 0;

            right: 0;

            width: 50px;

            height: 267px;

            line-height: 267px;

            color: white;

            text-align: center;

            background: rgba(0, 0, 0, .5);

            cursor: pointer;

            display: none;

        }

        .page_right {

            position: absolute;

            top: 0;

            left: 0;

            width: 50px;

            height: 267px;

            line-height: 267px;

            color: white;

            text-align: center;

            background: rgba(0, 0, 0, .5);

            cursor: pointer;

            display: none;

        }

        .current {

            background: rgba(255, 0, 0, .8);

        }

    </style>

</head>

<body>

<div class="banner">

    <ul>

        <li class="photo_change" style="display: block;"><img src="./images/1.jpg"></li>

        <li class="photo_change"><img src="./images/2.jpg"></li>

        <li class="photo_change"><img src="./images/3.jpg"></li>

        <li class="photo_change"><img src="./images/4.jpg"></li>

        <li class="photo_change"><img src="./images/5.jpg"></li>

    </ul>

    <ol>

        <li class="pointers current"></li>

        <li class="pointers"></li>

        <li class="pointers"></li>

        <li class="pointers"></li>

        <li class="pointers"></li>

    </ol>

    <i class="page_left">&gt;</i>

    <i class="page_right">&lt;</i>

</div>

<script>

    window.onload = function () {

        // 判断定时器的变量

        let timer = null

        // 定义一个索引变量,代表是第几张图,默认是从第一张开始显示

        let index = 0

        // 获取所有图的数组

        let photos = document.querySelectorAll('.photo_change')

        // 获取中间显示的小圆点

        let pointers = document.querySelectorAll('.pointers')

        // 获取左箭头

        let leftArrow = document.querySelector('.page_right')

        // 获取右箭头

        let rightArrow = document.querySelector('.page_left')

        // 定义一个函数,用于定时切换图片,假设 3 秒切换一次

        let init = function () {

            return setInterval(function () {

                photos[index].style.display = 'none'

                pointers[index].style.background = 'rgba(255, 255, 255, .5)'

                if (index >= photos.length - 1) {

                    index = 0

                } else {

                    index++

                }

                photos[index].style.display = 'block'

                pointers[index].style.background = 'rgba(255, 0, 0, .8)'

            }, 3000)

        }

        // 执行函数

        timer = init()

        // 小圆点的点击事件

        for (let i = 0; i < pointers.length; i++) {

            // 为每一个小圆点添加一个 index 的属性,并赋值

            pointers[i].index = i

            // 给小圆点添加点击事件

            pointers[i].onclick = function (event) {

                // 清除定时器

                clearInterval(timer)

                for (let j = 0; j < photos.length; j++) {

                    if (j === this.index) {

                        photos[j].style.display = 'block'

                        this.style.background = 'rgba(255, 0, 0, .8)'

                    } else {

                        photos[j].style.display = 'none'

                        pointers[j].style.background = 'rgba(240, 240, 240, .5)'

                    }

                }

                // 重新开启定时器来切换图片

                timer = init()

                // 将要轮换的图片指定为点击后的那张图片

                index = this.index

            }

        }

        // 左面的箭头点击事件

        leftArrow.onclick = function () {

            // 清除定时器

            clearInterval(timer)

            photos[index].style.display = 'none'

            if (index <= 0) {

                index = photos.length - 1

            } else {

                index--

            }

            photos[index].style.display = 'block'

            setColor()

            // 重新开启定时器

            timer = init()

        }

        // 自定义的 setColor 函数,作用是点击后图片变化

        let setColor = function () {

            for (let i = 0; i < photos.length; i++) {

                if (i === index) {

                    pointers[i].style.background = 'rgba(255, 0, 0, .8)'

                } else {

                    photos[i].style.display = 'none'

                    pointers[i].style.background = 'rgba(240, 240, 240, .5)'

                }

            }

        }

        // 右面的箭头点击事件

        rightArrow.onclick = function (event) {

            // 清除定时器

            clearInterval(timer)

            photos[index].style.display = 'none'

            if (index >= photos.length - 1) {

                index = 0

            } else {

                index++

            }

            photos[index].style.display = 'block'

            setColor()

            // 重新开启定时器

            timer = init()

        }

        // 当鼠标悬停在图片上时不切换

        let banner = document.querySelector('.banner')

        banner.onmousemove = function (e) {

            // 显示左右箭头

            leftArrow.style.display = 'block'

            rightArrow.style.display = 'block'

            // 让图片不再切换,其实就是清除定时器

            clearInterval(timer)

        }

        banner.onmouseout = function (e) {

            // 隐藏左右箭头

            leftArrow.style.display = 'none'

            rightArrow.style.display = 'none'

            // 重新开启定时器来切换图片

            timer = init()

        }

    }

</script>

</body>

</html>

Ajax

Ajax 需要使用到 XMLHttpRequest()

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>原生Ajax的使用</title>

    <style>

        .box {

            width: 700px;

            height: 300px;

            border: 1px solid #317FE5;

            margin-top: 10px;

        }

    </style>

</head>

<body>

<button class="btn">点击获取笑话</button>

<div class="box">

</div>

<script>

    // 获取到 div 对象

    let div = document.querySelector('.box')

    // 1. 获取按钮

    let btn = document.querySelector('.btn')

    btn.addEventListener('click', function () {

        getData()

    })

    // 获取数据

    let getData = function (method, url) {

        // 1. 创建 XMLHttpRequest 对象

        let xhr = new XMLHttpRequest()

        // 2. 打开连接

        /*

         打开连接是通过调用 XMLHttpRequest 对象的 open() 方法来完成的,这个方法有三个参数:

         1. 第一个参数是请求方式:如果请求方式为 GET 时,参数可以直接写在 URL 上,例如:xxx?id=1&name=lisi;如果是POST的话,一般我们需要封装到对象

         2. 第二个参数是访问的服务器 URL

         3. 第三个参数是一个布尔值,true 表示异步,false 表示同步。默认为 true

         */

        xhr.open('GET', 'https://autumnfish.cn/api/joke/list?num=5', true)

        // 3. 发送请求

        /**

         * 调用 XMLHttpRequest 对象的 send() 方法来发送请求。如果没有数据,则可以不传参数, send(null)

         * 如果是 post 请求,则需要写 xhr.send(id=1&name=lisi)

         */

        xhr.send()

        // 4. 处理数据

        xhr.onreadystatechange = function () {

            /* 注意:为了避免反复执行,我们通常是当 readState的值为 4 时表示要处理数据,这个属性的值有以下几个:

             * 0 表示请求未初始,即调用 open() 方法之前

             * 1 表示请求已经提交,即调用 send() 方法之前

             * 2 表示请求已经发送

             * 3 表示请求处理中,但是服务器还没有响应

             * 4 表示请求已经完成,即服务器已经响应

             * console.log(xhr.readyState)

             *

             * 除了 XMLHttpRequest 对象中有 readyState 属性外,还有一个 status 属性,它表示服务器响应的状态:

             * 200 表示成功的正常响应

             * 404 表示请求的资源没有找到(1.资源确实没有;2.资源名称不对;3.资源路径不对)

             * 500 表示服务器端错误

             */

            if (xhr.readyState < 3) {

                console.log('---------------------')

                div.innerHTML = '数据加载中。。。。。。'

            }

            if (xhr.readyState === 4 && xhr.status === 200) {

                // 获取到服务器响应回来的数据

                //console.log(xhr.responseText, typeof xhr.responseText)

                let content = xhr.responseText

                //alert(content)

                // 将服务器接收的数据转换为 JSON 格式的数据,使用 JSON.parse(),如果希望将 JSON 对象转换为字符串

                // 则使用 JSON.stringify() 方法来实现。

                let result = JSON.parse(content)

                let data = result.data

                //console.log(data.length);

                let s = ''

                let index = 1

                for (let text of data) {

                    // 将每一条笑话前加上一个序号

                    s += index++ + '. ' + text + '<br>'

                }

                // 把处理好的数据放到容器中显示

                div.innerHTML = s

            }

        }

    }

</script>

</body>

</html>

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

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

相关文章

(2024,FLOPs 动态分配,MoD,MoDE,top-k 路由,块丢弃)在基于 Transformer 的语言模型中动态分配计算

Mixture-of-Depths: Dynamically allocating compute in transformer-based language models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 注&#xff1a;Transformer 由于其注意力机制&…

mysql查看数据库表容量大小

【推荐】单表行数超过 500 万行或者单表容量超过 2GB&#xff0c;才推荐进行分库分表。 说明&#xff1a;如果预计三年后的数据量根本达不到这个级别&#xff0c;请不要在创建表时就分库分表。 1. 查询所有数据库记录数和容量 SELECTtable_schema AS 数据库,SUM(table_rows) …

Handler——小白能懂的原理,老鸟需要的面经

1.机制学习 1.1Handler定义 发送并处理 与线程的消息队列关联的Message和Runnable 1.2基本用法 1、Message.obtain() 从消息池取得Message 2、Handler().sendMessage(msg) 发送消息 3、Handler().post 将Runnable包装成Message发送 以下提供一个结构代码 import android.os.H…

用于扩展Qt本身的插件(上)

Qt自身插件 引言示例插件与应用插件的程序作为整体插件和应用插件的程序单独存在实现插件编写测试插件的程序应用插件运行结果引言 用于扩展qt自身的插件按照我的理解分为两种: 1. 直接扩展Qt自身,无需在QtCreator的设计器中加载; 2. 扩展Qt自身,同时需要在QtCreator的设计…

sonar搭建(linux系统)

前景 静态代码扫描是CI/CD中重要的一环&#xff0c;可以在代码提交到代码仓库之后&#xff0c;在CI/CD流程中加入代码扫描步骤&#xff0c;从而及时地对代码进行质量的检查。这可以有效地降低后期维护成本&#xff0c;优化产品质量&#xff0c;提高产品交付速度。同时&#xf…

分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进麻雀优化算法优化最小二乘支持向量机分类预测

分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进麻雀优化算法优化最小二乘支持向量机分类预测 目录 分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进麻雀优化算法优化最小二乘支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述…

C语言中的数据结构--链表的应用2(3)

前言 上一节我们学习了链表的应用&#xff0c;那么这一节我们继续加深一下对链表的理解&#xff0c;我们继续通过Leetcode的经典题目来了解一下链表在实际应用中的功能&#xff0c;废话不多说&#xff0c;我们正式进入今天的学习 单链表相关经典算法OJ题4&#xff1a;合并两个…

【分享】各大框架都在使用的Unsafe类

前言 几乎每个使用 Java开发的工具、软件基础设施、高性能开发库都在底层使用了sun.misc.Unsafe&#xff0c;比如Netty、Cassandra、Hadoop、Kafka等。 Unsafe类在提升Java运行效率&#xff0c;增强Java语言底层操作能力方面起了很大的作用。但Unsafe类在sun.misc包下&#x…

大型语言模型有什么用?

大型语言模型有什么用&#xff1f; 大型语言模型识别、总结、翻译、预测、生成文本和其他内容。 AI 应用程序正在总结文章、撰写故事和进行长时间对话——而大型语言模型正在承担繁重的工作。 大型语言模型或 LLM 是一种深度学习算法&#xff0c;可以根据从海量数据集中获得…

linux进阶篇:下载工具wget的安装以及应用

1 wget工具介绍 wget是一个下载文件的工具&#xff0c;它用在命令行下。对于Linux用户是必不可少的工具&#xff0c;我们经常要下载一些软件或从远程服务器恢复备份到本地服务器。 wget支持HTTP&#xff0c;HTTPS和FTP协议&#xff0c;可以使用HTTP代理。所谓的自动下载是指&a…

【C语言基础】:文件操作详解(后篇)

文章目录 一、文件的顺序读写1.1 顺序函数读写函数介绍1.2 fgetc函数和fputc函数1.3 fputs函数和fgets函数1.4 fprintf函数和fscanf函数1.5 fwrite函数和fread函数 二、文件的随机读写2.1 fseek函数2.2 ftell函数2.3 rewind函数 三、文件读取结束的判定3.1 feof函数 四、文件缓…

Linux mmap

目录 内存映射概念&#xff1a; 函数原型&#xff1a; 内存映射步骤&#xff1a; 主要功能 &#xff1a; 系统调用mmap用于共享内存的两种方式&#xff1a; 使用普通文件提供的内存映射&#xff1a; 使用特殊文件提供匿名内存映射&#xff1a; 注意事项 &#xff1a; …

【漏洞复现】潍微科技-水务信息管理平台 ChangePwd SQL注入漏洞

0x01 产品简介 潍微科技-水务信息管理平台主要帮助水务企业实现水质状态监测、管网运行监控、水厂安全保障、用水实时监控以及排放有效监管,确保居民安全稳定用水、环境有效保护,全面提升水务管理效率。 0x02 漏洞概述 潍微科技-水务信息管理平台 ChangePwd 接口存在SQL注…

YOLOv8改进 | 检测头篇 | 自研超分辨率检测头HATHead助力超分辨率检测(混合注意力变换器检测头)

一、本文介绍 本文给大家带来的改进机制是由由我本人利用HAT注意力机制&#xff08;超分辨率注意力机制&#xff09;结合V8检测头去掉其中的部分内容形成一种全新的超分辨率检测头。混合注意力变换器&#xff08;HAT&#xff09;的设计理念是通过融合通道注意力和自注意力机制…

Windows Edge 兼容性问题修复:提升用户体验的关键步骤

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

【随笔】Git 基础篇 -- 远程仓库 git clone(二十五)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

FTP所有操作

产生告警原理&#xff1a; 告警中出现 FTP STOP 关键字。Hawkeye keylogger木马名

iPad 无法解锁?修复 iPad 滑动解锁不起作用的 9 个解决方案

“我的 iPad Pro 一整天都工作正常&#xff0c;直到 20 分钟前。当我解锁它时&#xff0c;它不让我向上滑动。屏幕有响应&#xff0c;但我的 iPad 无法解锁。是否有其他人遇到过这种情况并找到了解决方法&#xff1f;解决方案&#xff1f;” ——来自 Apple 支持社区 iPad 屏幕…

前端开发攻略---根据音频节奏实时绘制不断变化的波形图。深入剖析如何通过代码实现音频数据的可视化。

1、演示 2、代码分析 逐行解析 JavaScript 代码块&#xff1a; const audioEle document.querySelector(audio) const cvs document.querySelector(canvas) const ctx cvs.getContext(2d)这几行代码首先获取了 <audio> 和 <canvas> 元素的引用&#xff0c;并使用…

Quartz + SpringBoot 实现分布式定时任务

文章目录 前言一、分布式定时任务解决方案二、Quartz是什么&#xff1f;1.quartz简介2.quartz的优缺点 二、Quartz分布式部署总结 前言 因为应用升级&#xff0c;由之前的单节点微服务应用升级为集群微服务应用&#xff0c;所以之前的定时任务Spring Scheduled不再适用了&…