JavaScript WebAPI 实战

news2024/12/24 2:26:57

  • 博主简介:想进大厂的打工人
  • 博主主页:@xyk:
  • 所属专栏: JavaEE初阶

本篇文章为大家带来JavaScript WebAPI的使用,请各位过目~~


目录

文章目录

一、什么是JavaScript WebAPI

1.1 什么是DOM

二、常用的DOM API

2.1 获取元素

2.2 什么是事件

2.2.1 获取/修改元素

三、简单的代码示例

3.1 计数器

3.2 全选/取消全选按钮

3.3 点击图片切换

3.4 点击文字放大

3.5 实现夜间/日间模式的切换

四、操作页面节点

4.1 新增节点

 4.2 删除节点

五、综合案例

5.1 猜数字

5.2 表白墙


一、什么是JavaScript WebAPI

前面学习的 JS 分成三个大的部分

  • ECMAScript: 基础语法部分
  • DOM API: 操作页面结构
  • BOM API: 操作浏览器

WebAPI 就包含了 DOM + BOM.
这个是 W3C 组织规定的.

1.1 什么是DOM

DOM 全称为 Document Object Model,页面文档对象模型,html中的每个标签都是可以映射到JS中的一个对象中的, 标签中的内容都可以通过JS对象感知到, JS对象修改对应的属性能够影响到标签的展示, 通过这样的DOM API就可以让JS代码来操作页面元素.

一个页面的结构是一个树形结构, 称为 DOM 树:

二、常用的DOM API

2.1 获取元素

这部分工作类似于 CSS 选择器的功能.任何一个页面都有一个document对象,其中document对象中的querySelectorquerySelectorAll函数可以用来选择元素, 通过传入CSS选择器来达到目的, 选择的范围是位于该函数之前所存在的选择器, 没找到返回值为null.

var element = document.querySelector(selectors);
var element = document.querySelectorAll(selectors);

document相当于整个页面的对象,通过它可以使用一些方法获取HTML元素

<div class="box">abc</div>
<div id="id">def</div>
<h3><span><input type="text"></span></h3>
<script>
var elem1 = document.querySelector('.box');
console.log(elem1);
var elem2 = document.querySelector('#id');
console.log(elem2);
var elem3 = document.querySelector('h3 span input');
console.log(elem3);
</script>

如果想把符合选择的元素都选中就需要使用querySelectorAll函数了, 在使用上和和querySelector 是一样的.

<div class="box">abc</div>
<div id="id">def</div>
<script>
var elems = document.querySelectorAll('div');
console.log(elems);
</script>

2.2 什么是事件

JS 要构建动态页面, 就需要感知到用户的行为.
用户对于页面的一些操作(点击, 选择, 修改等) 操作都会在浏览器中产生一个个事件, 被 JS 获取到, 从而进行更复杂的交互操作.

事件的三要素:

  1. 事件源, 哪个HTML元素产生的事件.
  2. 事件类型, 比如鼠标点击, 鼠标移动, 键盘输入等.
  3. 事件处理程序, 当事件发生之后, 要执行哪个代码.

代码示例:

<button id="btn">点我一下</button>
<script>
var btn = document.getElementById('btn');
btn.onclick = function () {
alert("hello world");
}
</script>

  • btn 按钮就是事件源.
  • 点击就是事件类型
  • function 这个匿名函数就是事件处理程序
  • 其中 btn.onclick = function() 这个操作称为 注册事件/绑定事件

2.2.1 获取/修改元素

在选中元素后, 就可以使用innerHTML属性来获取/修改一个标签里面的内容了.

<div>
<span>hello world</span>
<span>hello world</span>
</div>
<script>
var div = document.querySelector('div');
// 读取 div 内部内容
console.log(div.innerText);
// 修改 div 内部内容, 界面上就会同步修改
div.innerText = 'hello js <span>hello js</span>';
</script>

可见,innerText只能获取文本内容, 并不能获取html结构,通过innerHTML是可以获取到div内部的html结构的,会将div标签中的html代码也获取到.

那么可以通过innerHTML来显示写入的HTML标签, innerHTML用的场景是要比innerText更多的.

<div>
<span>hello world</span>
<span>hello world</span>
</div>
<script>
var div = document.querySelector('div');
// 读取页面内容
console.log(div.innerHTML);
// 修改页面内容
div.innerHTML = '<span>hello js</span>'
</script>

 修改元素也是一样的~

<div>
    <span>hello world</span>
    <span>hello world</span>
</div>
<button class="but">点一下试试</button>
<script>
    let but = document.querySelector('.but');
    but.onclick = function () {
        let div = document.querySelector('div');
        div.innerHTML = '<h1>这是一个一级标题</h1>>';
        console.log(div.innerHTML)
    }
</script>

三、简单的代码示例

3.1 计数器

<div id='count'>0</div>
<button id='countAdd'>计数器:点击+1</button>
<script>
    let counterAdd = document.querySelector('#countAdd');
    counterAdd.onclick = function () {
    let num = document.querySelector('#count');
    let num1 = parseInt(num.innerHTML);
    console.log(num1);
    num1++;
    num.innerHTML = num1;
    };
</script>

这个代码要注意的是, num.innerHTML这里拿到的元素内容是字符串类型的, 直接进行加法运算就是字符串拼接的效果了, 而要完成算数相加的效果就需要将字符串转换为整数, 和Java中类似, 可以使用parseInt方法将字符串转换为整数, 而如果是浮点数就使用parseFloat方法

3.2 全选/取消全选按钮

<input type="checkbox" id="all">我全都要 <br>
<input type="checkbox" class="girl">貂蝉 <br>
<input type="checkbox" class="girl">小乔 <br>
<input type="checkbox" class="girl">安琪拉 <br>
<input type="checkbox" class="girl">妲己 <br>
<script>
    // 1. 获取到元素
    var all = document.querySelector('#all');
    var girls = document.querySelectorAll('.girl');
    // 2. 给 all 注册点击事件, 选中/取消所有选项
    all.onclick = function () {
    for (var i = 0; i < girls.length; i++) {
    girls[i].checked = all.checked;
    }
}
    // 3. 给 girl 注册点击事件
    for (var i = 0; i < girls.length; i++) {
    girls[i].onclick = function () {
    // 检测当前是不是所有的 girl 都被选中了.
    all.checked = checkGirls(girls);
    }
}
    // 4. 实现 checkGirls
    function checkGirls(girls) {
    for (var i = 0; i < girls.length; i++) {
    if (!girls[i].checked) {
    // 只要一个 girl 没被选中, 就认为结果是 false(找到了反例)
    return false;
    }
}
    // 所有 girl 中都没找到反例, 结果就是全选中
    return true;
}
</script>

1.点击全选按钮, 则选中所有选项
2. 只要某个选项取消, 则自动取消全选按钮的勾选状态

3.3 点击图片切换

我们还可以在代码中使用DOM直接获取元素的属性并修改元素的属性, 比如这里实现一个效果, 就是点击一个图片就可以切换到另一张图片, 然后再点击就能再切换回来, 这个案例我们只需要设置点击事件为修改图片的路径即可, 也就是修改src属性.

    <style>
        img {
            height: 500px;
        }
    </style>
    <img src="https://wallpaperm.cmcm.com/fedea52c7f796c3eeeb8598d4a09a3e7.jpg" alt="">
    <script>
        let img = document.querySelector("img");
            console.dir(img);
        img.onclick = function() {
            if (img.src.indexOf('a3e7.jpg') !== -1) {
                img.src = 'https://ts1.cn.mm.bing.net/th/id/R-C.aa013700cacbd3db5776611cc7d786f4?rik=TrvmCRz42t76Dw&riu=http%3a%2f%2fimg.mm4000.com%2ffile%2fd%2fcf%2fc2faf5b719.jpg&ehk=mrYQeWJ8fZTs0fQ26qK%2buqQpLix4fOW4LAP3z3pF35E%3d&risl=&pid=ImgRaw&r=0';
            } else {
                img.src = 'https://wallpaperm.cmcm.com/fedea52c7f796c3eeeb8598d4a09a3e7.jpg';
            }
        }
    </script>

3.4 点击文字放大

CSS 中指定给元素的属性, 都可以通过 JS 来修改.
行内样式操作:

element.style.[属性名] = [属性值];
element.style.cssText = [属性名+属性值];
<div style="font-size:20px;">
    这是一段文本,点击之后字体放大
</div>
<script>
    let div = document.querySelector("div");
    div.onclick = function() {
        //1.获取文字大小属性
        let size = parseInt(div.style.fontSize);
        console.log("修改前" + size);
        //2.修改文字大小
        size += 5;
        //3.写回到属性
        div.style.fontSize = size + "px";
        console.log("修改后" + size);
    }
</script>

3.5 实现夜间/日间模式的切换

实现点击界面, 切换日间模式和夜间模式

    <div class="container light">
        这是一大段话. <br>
        这是一大段话. <br>
        这是一大段话. <br>
        这是一大段话. <br>
    </div>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        html, body {
            width: 100%;
            height: 100%;
        }
        .container {
            width: 100%;
            height: 100%;
    
        }
        .light {
            background-color: #f3f3f3;
            color: #333;
        }
        .dark {
            background-color: #333;
            color: #f3f3f3;
        }
    </style>
    <script>
        let div = document.querySelector('div');
        div.onclick = function () {
            console.log(div.className);
            if (div.className.indexOf('light') != -1) {
                div.className = 'container dark';
            } else {
                div.className = 'container light';
            }
        }
    </script>

四、操作页面节点

述涉及的操作都是针对页面已有的元素进行操作的, 利用DOM API还可以完成添加/删除元素的操作.

4.1 新增节点

添加元素主要有两个步骤, 首先需要创建一个新的创建元素节点, 然后把这个元素节点插入到父元素中就能完成元素的的添加(依赖于DOM树).

可以使用creatElement方法来创建一个新的元素:

let element = document.createElement('元素标签名');

插入到DOM树中:

父元素.appendChild(创建的子元素);

代码示例:

<div class="container">
</div>
<script>
var div = document.createElement('div');
div.id = 'mydiv';
div.className = 'box';
div.innerHTML = 'hehe';
var container = document.querySelector('.container');
container.appendChild(div);
</script>

 4.2 删除节点

父元素.removeChild(需要删除的子元素);

五、综合案例

5.1 猜数字

查看mdn文档:

生成一个1到10的随机数,利用Math.random()函数来获取随机数, 该函数生成随机数的范围是[0,1)区间内的一个小数, 我们需要的是[1,10]之间的整数, 我们可以乘上10后再拿到整数部分+1就能得到目标区间的数了.

    <div>
        <h2>猜数字游戏</h2>
        玩家输入一个 1-10 数字:<input id="input_num" type="text"><p></p>
        <input type="button" value=" 查看结果 " onclick="selectResult()">
        <div id="result_div">

        </div>
    </div>

    <script>
        // 原生js猜数字游戏
       function selectResult(){
        // 产生随机数 1-10
        var randomNum = 1+Math.floor(Math.random()*10);
        var userInputNum = document.getElementById("input_num").value;
        var msg;
        if(randomNum==userInputNum){
            msg="<h4>恭喜:猜对了</h4>"
        }else{
            msg="<h4>抱歉:猜错了,正确的数字是:"+randomNum+"</h4>";
        }
        document.getElementById("result_div").innerHTML = msg;
       }
    </script>

5.2 表白墙

目标页面如下, 点击提交, 能够把用户输入的话, 显示在页面中, 点击撤销, 能够撤回最后一条显示在页面的话.

 代码示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>表白墙</title>
    <style>
        * {
            /* 消除浏览器的默认样式 */
            margin: 0;
            padding: 0;
            /* 保证盒子不被撑大 */
            box-sizing: border-box;
        }

        .container {
            width: 600px;
            margin: 20px auto;
        }

        h1 {
            text-align: center;
        }

        p {
            text-align: center;
            color: #666;
            margin: 20px 0;
        }

        .row {
            /* 开启弹性布局 */
            display: flex;
            height: 40px;
            /* 水平方向居中 */
            justify-content: center;
            /* 垂直方向居中 */
            align-items: center;
        }

        .row span {
            width: 80px;
        }

        .row input {
            width: 200px;
            height: 30px;
        }

        .row button {
            width: 280px;
            height: 30px;
            color: white;
            background-color: orange;
            /* 去掉边框 */
            border: none;
            border-radius: 5px;
        }

        /* 点击的时候有个反馈 */
        .row button:active {
            background-color: grey;
        }
        .message{
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>表白墙</h1>
        <p>输入内容后点击提交, 信息会显示到下方表格中</p>
        <div class="row">
            <span>是谁: </span>
            <input type="text">
        </div>
        <div class="row">
            <span>对谁: </span>
            <input type="text">
        </div>
        <div class="row">
            <span>说: </span>
            <input type="text">
        </div>
        <div class="row">
            <button id="submit">提交</button>
        </div>
        <div class="row">
            <button id="revert">撤销</button>
        </div>
      
    </div>

    <script>
        // 实现提交操作. 点击提交按钮, 就能够把用户输入的内容提交到页面上显示.
        // 点击的时候, 获取到三个输入框中的文本内容
        // 创建一个新的 div.row 把内容构造到这个 div 中即可.
        let containerDiv = document.querySelector('.container');
        let inputs = document.querySelectorAll('input');
        let button = document.querySelector('#submit');
        button.onclick = function() {
            // 1. 获取到三个输入框的内容
            let from = inputs[0].value;
            let to = inputs[1].value;
            let msg = inputs[2].value;
            if (from == '' || to == '' || msg == '') {
                return;
            }
            // 2. 构造新 div
            let rowDiv = document.createElement('div');
            rowDiv.className = 'message';
            rowDiv.innerHTML = from + ' 对 ' + to + ' 说: ' + msg;
            containerDiv.appendChild(rowDiv);
            // 3. 清空之前的输入框内容
            for (let input of inputs) {
                input.value = '';
            }
        }
        let revertButton = document.querySelector('#revert');
        revertButton.onclick = function() {
            // 删除最后一条消息.
            // 选中所有的 row, 找出最后一个 row, 然后进行删除
            let rows = document.querySelectorAll('.message');
            if (rows == null || rows.length == 0) {
                return;
            }
            containerDiv.removeChild(rows[rows.length - 1]);
        }
    </script>
</body>
</html>

效果展示: 

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

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

相关文章

Hive数据分层有哪些优点?具体每一层含义是什么?

为什么要分层? 作为一名数据的规划者&#xff0c;我们肯定希望自己的数据能够有秩序地流转&#xff0c;数据的整个生命周期能够清晰明确被设计者和使用者感知到。直观来讲就是如图这般层次清晰、依赖关系直观。 但是&#xff0c;大多数情况下&#xff0c;我们完成的数据体系却…

深度学习基础知识-误差反向传播+训练技巧(无代码仅用来理解)

参考书籍&#xff1a;&#xff08;找不到资源可以后台私信我&#xff09; 《深度学习入门&#xff1a;基于Python的理论与实现 (斋藤康毅)》 《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition (Aurelien Geron [Gron, Aurlien])》 神经网络…

Delphi日薄西山?不仅用户300万,还大佬无数,转身就风靡全球

主人公名叫David Vacanti&#xff0c;是Delphi的长期开发人员&#xff0c;已有接近30年以上的编程经验。 我之所以注意到他&#xff0c;一是因为Delphi属实一波回忆杀。 二是不可思议&#xff1a;他在1983年&#xff0c;便开启了自己的副业。 开了一家叫做“Vacanti Yacht D…

成功加冕!用友大易获评2023最佳招聘管理软件供应商

人力资源服务业旗帜性商业奖项2023金帜奖(HRFLAG AWARDS)颁奖典礼于近日隆重举行。经过3个月的评选&#xff0c;用友大易从615家人力资源服务机构中脱颖而出&#xff0c;最终荣获「2023最佳招聘管理软件供应商」奖项。 2023金帜奖(HRFLAG AWARDS)是人力资源服务行业旗帜性的商业…

STM32cubemx配置驱动DHT11模块

文章目录 前言一、DHT11模块介绍二、DHT11引脚连接及cubemx配置三、DHT11时序分析四、DHT11代码编写总结 前言 本篇文章将带大家学习使用DHT11湿温度模块&#xff0c;使用这个模块可以获取当前的温度和湿度数据。DHT11可以用于智能家居&#xff0c;蔬菜大棚等项目当中适用范围…

SpringBoot+layUI实现表格的某一列数据刷新功能案例分享

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

mysql执行计划explain

mysql 执行计划 explain 介绍 mysql8.0为例&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/explain-output.html EXPLAIN为语句中使用的每个表返回一行信息 SELECT。它按照 MySQL 在处理语句时读取它们的顺序列出输出中的表。这意味着 MySQL 从第一个表中读取一行&…

四维轻云平台常见问题及解决方法

1、在地图中看不见加载的点云或倾斜摄影模型数据&#xff1f; 若点云或模型数据加载后&#xff0c;在地图中看不见&#xff0c;可能是地形的高度高于倾斜模型的高度&#xff0c;导致数据漂浮在空中或者在地形以下&#xff0c;可通过增加数据的移动值Y来调整点云或者模型数据的…

《Java并发编程实战》课程笔记(一)

并发领域的全景图 并发编程的三个核心问题 并发编程可以总结为三个核心问题&#xff1a;分工、同步、互斥。 分工指的是如何高效地拆解任务并分配给线程&#xff1b; Java SDK 并发包里的 Executor、Fork/Join、Future 本质上都是⼀种分工方法。除此之外&#xff0c;并发编程…

吉时利 Keithley 2700数据采集器技术参数

概述&#xff1a; 每个 2700 系列系统均将精密测量、开关和控件集于一个紧凑集成的机箱中&#xff0c;适用于机架安装或台式应用。虽然所有三个系统的核心功能和编程是相同的&#xff0c;但各个主机都具有独特的功能。例如&#xff0c;2701 型具有 10/100BaseTX 以太网接口&am…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(5月24日论文合集)

文章目录 一、检测相关(7篇)1.1 Learning Remote Sensing Object Detection with Single Point Supervision1.2 Online Open-set Semi-supervised Object Detection via Semi-supervised Outlier Filtering1.3 Generalizable Synthetic Image Detection via Language-guided Co…

代码随想录训练营Day51| 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 总结

目录 目录 学习目标 学习内容 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 学习目标 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 总结 学习内容 309.最佳买卖股票时机含冷冻期 309. 最佳买卖股票时机含冷冻期 - 力扣&#xff0…

大模型知识Out该怎么办?浙大团队探索大模型参数更新的方法—模型编辑

夕小瑶科技说 原创 作者 | 小戏、Python 大模型在其巨大体量背后蕴藏着一个直观的问题&#xff1a;“大模型应该怎么更新&#xff1f;” 在大模型极其巨大的计算开销下&#xff0c;大模型知识的更新并不是一件简单的“学习任务”&#xff0c;理想情况下&#xff0c;随着世界…

网络协议 — IPSec 安全隧道协议族

目录 文章目录 目录IPSec 安全隧道协议族封装协议Authentication HeaderEncapsulating Security Payload 封装模式传输模式隧道模式 安全偶联协商Security AssociationInternet Key ExchangeIKE 的交换过程 IPSec Virtual Private NetworkIPSec NAT-TTransport 模式Tunnel 模式…

mjpg-streamer框架分析

mjpg-streamer框架分析 文章目录 mjpg-streamer框架分析框架maininput_initinput_runoutput_init 框架 main 这个函数是一个C程序的主函数&#xff0c;接受命令行参数并执行相应的操作。下面是这个函数的要点&#xff1a; 定义了一些变量&#xff0c;包括输入插件数组input、输…

知识点滴 - dBm和mW的转换

分贝毫瓦dBm&#xff0c;decibel-milliwatts&#xff0c;全写为“decibel relative to one milliwatt”&#xff0c;为一个指代功率的绝对值&#xff0c;而不同于dB只是一个相对值。 dBm或dBmW&#xff08;分贝-毫瓦&#xff09;用于表示功率的水平或级别&#xff0c;以分贝&am…

Android | 关于 OOM 的那些事

前言 Android 系统对每个app都会有一个最大的内存限制&#xff0c;如果超出这个限制&#xff0c;就会抛出 OOM&#xff0c;也就是Out Of Memory 。本质上是抛出的一个异常&#xff0c;一般是在内存超出限制之后抛出的。最为常见的 OOM 就是内存泄露(大量的对象无法被释放)导致…

精准数据分析,TeeChart为企业量身定制可视化退休预估方案

TeeChart for .NET是优秀的工业4.0 WinForm图表控件&#xff0c;官方独家授权汉化&#xff0c;集功能全面、性能稳定、价格实惠等优势于一体。TeeChart for .NET 中文版还可让您在使用和学习上没有任何语言障碍&#xff0c;至少可以节省30%的开发时间。 点击立即下载最新版Tee…

docker下不同容器的网络互相访问问题

目录 背景 ​编辑 docker网络模式 解决方法 mysql下 docker-compose下网络设置 nacos 效果 背景 我这边有两个容器&#xff0c;宿主机ip为 192.168.1.115&#xff0c;一个mysql&#xff0c;一个nacos&#xff0c;部署在主机上&#xff0c;使用的默认网络bridge&#xff…

学习SpringBoot入门知识,附带教程源码分享,快速掌握开发技巧-【imooc-java2021】体系课-Java工程师 2022版

学习SpringBoot入门知识&#xff0c;附带教程源码分享&#xff0c;快速掌握开发技巧 目录福利&#xff1a;文末有分享SpringBoot教程及源码哦 一、Spring Boot 是什么二、为什么要使用 Spring Boot三、快速入门3.1 创建 Spring Boot 项目3.1.1 通过 Spring Initializr 来创建1、…