前端三剑客 —— 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>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[攻防世界]Reversing-x64Elf-100

1.查壳 无壳&#xff0c;ELF文件 2.用IDA64打开 找到关键部分 这里有坑&#xff0c;看清楚v3是长度为3数组&#xff0c;里面放三个字符串 3.脚本解密 v1"Dufhbmf" v2"pGimos" v3"ewUglpt" v4[v1,v2,v3] a1[0,0,0,0,0,0,0,0,0,0,0,0] for i …

使用cmake进行打包,包含可执行程序和动态依赖库

平常代码开发中&#xff0c;有时候需要将写的程序打包成压缩包放到目标设备上进行运行测试。用CMake管理工程&#xff0c;实现使用make -jnproc package指令可以将工程进行打包&#xff0c;可执行文件存储在bin文件夹中&#xff0c;依赖库存储在lib文件夹中。 示例 1.工程目录结…

算法打卡day41|动态规划篇09| Leetcode198.打家劫舍、213.打家劫舍II、337.打家劫舍 III

算法题 Leetcode 198.打家劫舍 题目链接:198.打家劫舍 大佬视频讲解&#xff1a;198.打家劫舍视频讲解 个人思路 偷还是不偷&#xff0c;这取决于前一个和前两个房是否被偷了&#xff0c;这种存在依赖关系的题目可以用动态规划解决。 解法 动态规划 动规五部曲&#xff1…

B端系统:控制台图表的十大常见类型,附精美案例

大家伙&#xff0c;我是大千UI工场&#xff0c;专注UI分享和项目接单&#xff0c;本期带来控制台图表的常见类型&#xff0c;欢迎大家关注、互动交流。 B端系统控制台的图表类型有很多种&#xff0c;常见的包括&#xff1a; 折线图&#xff1a;用于显示随时间变化的数据趋势&a…

Spring Boot 学习(3)——Spring Initializr 创建项目问题解决

产生问题的原因&#xff0c;各种的版本都较老&#xff0c;所以导致出现问题。目前暂未打到合适的教程&#xff0c;按老教程学起来先。 小白瞎学&#xff0c;大神勿喷&#xff01; 再次强调环境&#xff1a;maven 3.3.9、jdk 1.8、idea 2017、Spring 4.3.13、Spring Boot 1.5.…

【动态规划 区间dp 位运算】100259. 划分数组得到最小的值之和

本文涉及知识点 动态规划 区间dp 位运算 LeetCode100259. 划分数组得到最小的值之和 给你两个数组 nums 和 andValues&#xff0c;长度分别为 n 和 m。 数组的 值 等于该数组的 最后一个 元素。 你需要将 nums 划分为 m 个 不相交的连续 子数组&#xff0c;对于第 ith 个子数…

设计者模式之中介者模式(下)

3&#xff09;中介者与同事类的扩展 1.结构图 新增了具体同事类Label和具体中介者类SubConcreteMediator。 2.代码实现 //文本标签类&#xff1a;具体同事类 public class Label extends Component {public void update() {System.out.println("文本标签内容改变&#…

鉴权设计(一)———— 登录验证

1、概述 网站系统出于安全性的考虑会对用户进行两个层面的校验&#xff1a;身份认证以及权限认证。这两个认证可以保证只有特定的用户才能访问特定的数据的需求。 本文先实现一个基于jwt拦截器redis注解实现的简单登录验证功能。 2、设计思路 jwt用于签发token。 拦截器用于拦…

南京观海微电子---二极管钳位电路

在选择电阻器和电容器时&#xff0c;您必须注意电容器的放电时间&#xff0c;因为它会保持波形的时间段。它必须比时间段的一半大得多&#xff0c;以便电容器放电缓慢。电解电容器不应用于钳位电路&#xff0c;因为它们的充电和放电速度很慢。放电时间&#xff08;&#xff09;…

容器镜像进阶

Dockerfile 编写注意事项&#xff1a; 选择合适的基础镜像&#xff0c;没必要追求镜像的绝对大小。 alpine镜像不推荐&#xff0c;尤其是编译型业务&#xff0c;因为alpine镜像内置的musl libc库与标准的glibc不一样。 如果就是想使用alpine镜像&#xff0c;推荐多阶段构建&am…

2023-2024年科技行业主要变化趋势梳理与总结

一、主要大额并购案例并购原因 &#xff08;一&#xff09;产品线补充与业务市场拓展&#xff08;如VMware、Activision Blizzard并购案&#xff09; &#xff08;二&#xff09;技术整合&#xff08;如Spunk并购案&#xff09;、 &#xff08;三&#xff09;优化运营以期溢…

分类预测 | Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量…

C++ 红黑树模拟实现

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;C知识分享⏪   &#x1f69a;代码仓库:C高阶&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C知识   &#x1f51d;&#x1f51d; 前言 前面我们实现了AVL树&#xff0c;发明AVL树…

AI大模型探索之路-实战篇:基于CVP架构-企业级知识库实战落地

目录 前言 一、概述 二、本地知识库需求分析 1. 知识库场景分析 2. 知识库应用特点 3. 知识库核心功能 三、本地知识库架构设计 1. RAG架构分析 2. 大模型方案选型 3. 应用技术架构选型 4. 向量数据库选型 5. 模型选型 三、本地知识库RAG评估 四、本地知识库代码落地 1. 文件…

一文了解LangChain的记忆模块(理论实战+细节)

大多数LLM应用程序都有一个会话接口。会话的一个重要组成部分是能够参考会话早期的信息&#xff08;上文信息&#xff09;。这种存储过去互动信息的能力就称为“记忆&#xff08;Memory&#xff09;”。LangChain提供了许多用于向系统添加Memory的封装。 目前 LangChain 中大多…

OJ 连续数的和 球弹跳高度的计算【C判断是否为完全平方数】【格式输出%g输出全部小数部分】

连续数的和 判断是否为完全平方数有两种方法 1.遍历所有小于该数的整数&#xff0c;有一个满足平方与该数相等&#xff0c;则是完全平方数 2.用sqrt()或pow()函数对该数开方&#xff0c;取整&#xff08;舍去小数部分&#xff09;&#xff0c;再平方&#xff0c;与该数相等则…

nodejs解析url参数

需要引入 url 模块&#xff1b; var http require(http); var url require(url);http.createServer(function (req, res) {res.writeHead(200, {Content-Type: text/plain});// 解析 url 参数var params url.parse(req.url, true).query;res.write("name: " par…

初学python记录:力扣705. 设计哈希集合

题目&#xff1a; 不使用任何内建的哈希表库设计一个哈希集合&#xff08;HashSet&#xff09;。 实现 MyHashSet 类&#xff1a; void add(key) 向哈希集合中插入值 key 。bool contains(key) 返回哈希集合中是否存在这个值 key 。void remove(key) 将给定值 key 从哈希集合…

Linux部署自动化运维平台Spug

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主机在线终端、文件…

halcon-轴断面检测定位

前言 通常情况下轴检测时&#xff0c;通常会检测轴的各个阶段的长度。但是由于各种原因&#xff0c;在轴断面的区域现实不明显&#xff0c;无法正确提取&#xff0c;这时候需要根据轴断面的突出部分进行检测&#xff0c;但是由于部分轴的粗轴和细轴区域的宽度差距相当接近&…