JavaScript WebAPI

news2025/1/20 20:08:33

✏️作者:银河罐头
📋系列专栏:JavaEE

🌲“种一棵树最好的时间是十年前,其次是现在”

目录

  • DOM 基本概念
  • 选中页面元素
  • 事件初识
    • 事件三要素
  • 操作元素
    • 获取/修改元素内容
    • 获取/修改元素属性
    • 获取/修改表单元素属性
      • value
      • type
    • 获取/修改样式属性
  • 操作节点
    • 新增元素
    • 删除元素
  • 代码案例:猜数字
  • 代码案例:表白墙

WebAPI 是浏览器给 JS 代码提供的功能。浏览器不同,API 的行为也可能会存在差异。

DOM 基本概念

DOM 全称为 Document Object Model.

文档对象模型

把 html 中的每一个 标签都可以映射到 JS 中的一个对象

标签上显示啥,都可以通过 JS 对象感知到。

JS 对象修改对应属性,能够影响到标签的展示

通过 DOM 就可以让 JS 代码来操作页面元素。

  • DOM 树结构形如:

image-20230223150225218

选中页面元素

querySelector(CSS 选择器)

<body>
    <div class="box">abc</div>
    <div id="id">def</div>
    <h3>
        <span>
            <input type="text">
        </span>
    </h3>
    <script>
        let elem1 = document.querySelector('.box');//类选择器
        //如果有 2 个.box,默认选中第一个
        //如果想选中所有的 .box,可以使用querySelectorAll(返回数组)
        console.log(elem1);
    </script>
</body>
//打印结果
<div class="box">abc</div>
console.dir(elem1);
//打印结果
div.box
let elem2 = document.querySelector('#id');//id 选择器
console.log(elem2);
let elem3 = document.querySelector('h3>span>input');//后代选择器
console.log(elem3);

事件初识

事件就是针对用户的操作进行的一些响应。

要能够和用户交互,就需要知道用户干了啥。用户做的一些动作,就会浏览器中产生了一些事件。代码就需要对事件做出反应。

这里的"事件",比如:鼠标点击,鼠标双击,鼠标移动,键盘按下,调整浏览器窗口…

事件三要素

1.事件源:哪个元素产生的事件。

2.事件类型:点击,双击,移动,键盘按下…

3.事件处理程序:事件发生之后,要执行哪个代码。(要执行的代码都是提前设定好的)(这个设定的过程称之为"时间绑定")

<div class="box" onclick="alert('hello')">abc</div>

最简单的方式,就是在元素中使用 "onXXX"这样的方法,来绑定一个事件处理程序。

image-20230228210903815

操作元素

获取/修改元素内容

先获取到该元素,使用 innerHTML 属性,就能拿到元素里的内容,修改该属性,就能影响到界面的显示。

div.onclick = function(){
    console.log(div.innerHTML);
    div.innerHTML += 'a';
}

image-20230228213458010

chrome 控制台默认会把相邻的相同的日志合并。

image-20230228214031846

如果不想合并就把这个选项去掉。

获取/修改元素属性

html 标签的属性会映射到 JS 对象中。

let img = document.querySelector('img');
console.dir(img);
img.onclick = function(){
    console.log(img.src);
    console.log(img.alt);
    console.log(img.title);
    console.log(img.width);
    console.log(img.height);
    img.src = '美女小姐姐.jpg';
}

获取/修改表单元素属性

表单元素(input, textarea, select…)有一些特别的属性,普通标签没有的。

表单(主要是指 input 标签)的以下属性都可以通过 DOM 来修改:

value: input 的值.

disabled: 禁用

checked: 复选框会使用

selected: 下拉框会使用

type: input 的类型(文本, 密码, 按钮, 文件等)

value

	<input type="text">
    <button>点我一下</button>
    <script>
        let input = document.querySelector('input');
        let button = document.querySelector('button');
        button.onclick = function(){
            console.log(input.value);
            console.log(input.innerHTML);
        }
    <script>

innerHTML 得到的是标签的内容(是开始标签和结束标签中间夹着的内容)

而 input 是个单标签,没有内容。

  • 下面来实现一个功能。

给 input 里面放 1 个数字,每次点击按钮,数字 + 1 并显示出来。

let input = document.querySelector('input');
let button = document.querySelector('button');
button.onclick = function(){
    let value = input.value;
    value += 1;
    input.value = value;
}

image-20230301194918546

因为 input.value 是 String 类型,所以呈现出来的是字符串拼接的效果,和预期不符。

所以就需要把字符串转成整数。

let value = parseInt(input.value);

type

切换按钮的文本。

button.onclick = function(){
    if(input.type == 'text'){
        input.type = 'password';
        button.innerHTML = '显示密码';
    }else{
        input.type = 'text';
        button.innerHTML = '隐藏密码';
    }
}

获取/修改样式属性

1.修改内联样式(修改 style 属性的值)

<div style="font-size: 20px;">这是一个 div, 点击之后字体放大</div>
    <script>
        let div = document.querySelector('div');
        div.onclick = function() {
            //先获取到字体大小
            let fontSize = parseInt(div.style.fontSize);
            fontSize += 10;
            div.style.fontSize = fontSize + 'px';
        }
	</script>

image-20230301204019451

style 里面的属性名字都是和 css 的一样,只不过是脊柱命名改驼峰。

2.修改元素应用的 CSS 类名

  • 切换夜间模式
<div id= "one" class="light" style="font-size: 20px; height: 500px;">这是一个 div, 点击之后字体放大</div>
    <style>
        .light {
            /* 日间模式 */
            color: black;
            background-color: white;
        }
        .dark {
            /* 夜间模式 */
            color: white;
            background-color: black;
        }
    </style>
    <script>
        let div = document.querySelector('#one');
        div.onclick = function() {
            //点击 div 切换到日间模式和夜间模式
            if(div.className == 'dark'){
                div.className = 'light';
            }else{
                div.className = 'dark';
            }
        }
	</script>

上述这些操作都是针对当前页面已有的元素展开的。

操作节点

新增元素

1.创建一个元素

在 JS 里提供了 createElement 来创建元素。

2.把这个元素加到 DOM 树里

<div class="one">
        这是一个 div
</div>
<script>
    let input = document.createElement('input');
    //让输入框里默认显示'hello'
    input.value = 'hello';
    let div = document.querySelector('.one');
    div.appendChild(input);
</script>
//新增一个输入框
<ul>
        <li>11</li>
        <li>22</li>
</ul>
<script>
    let ul = document.querySelector('ul');
    for (let n = 3; n < 10; n++){
        let li = document.createElement('li');
        li.innerHTML = n + '' + n;
        ul.appendChild(li);//
    }
</script>
//往无序列表尾增元素
appendChild//加到子元素末尾
insertBefore//把元素加到指定子元素前面

删除元素

parentElem.removeChild(childElem);

//删除 33 这个元素
let toDelete = document.querySelectorAll('li')[2];
console.log(toDelete);
ul.removeChild(toDelete);

代码案例:猜数字

网页版本猜数字

1.生成一个 1-100 之间的随机整数

2.让用户来输入一个数字

3.根据输入数字的大小关系,给出提示:高了/低了/猜对了

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>猜数字</title>
</head>
<body>
    <div>请输入要猜的数字</div>
    <input type="text">
    <button>提交</button>
    <!-- 使用这个 div 来显示结果 -->
    <div class="result">

    </div>
    <script>
        //1.先生成一个随机1-100的整数
        let toGuess = parseInt(100 * Math.random()) + 1;
        console.log(toGuess);
        //2.进行猜数字操作
        let button = document.querySelector('button');
        let resultDiv = document.querySelector('.result');
        let input = document.querySelector('input');
        button.onclick = function() {
            //3.取出输入框的内容
            if(input.value == ''){
                // 用户啥都没输入
                return;
            }
            let inputNum = parseInt(input.value);
            //4.比较大小关系
            if(inputNum < toGuess){
                // 低了
                resultDiv.innerHTML = '低了';
            }else if(inputNum > toGuess){
                // 高了
                resultDiv.innerHTML = '高了';
            }else{
                // 猜对了
                resultDiv.innerHTML = '猜对了';
            }
        }
    </script>
</body>
</html>

image-20230302104218274

代码案例:表白墙

image-20230302103825709

image-20230302105254838

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>表白墙</title>
    <style>
        /*  * 是通配符选择器,选中页面所有元素 */
        * {
            /* 消除浏览器的默认样式 */
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        .container {
            width: 600px;
            margin: 20px auto;
            /* 水平方向左右外边距是 auto, 垂直方向上是 0 */
        }
        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;
        }
    </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 class="row">
            xx 对 xx 说 xxxxx
        </div> -->
    </div>
    <script>
        // 实现提交操作, 点击提交按钮, 把用户输入的内容提交到页面显示
        // 点击的时候获取到 3 个输入框的内容
        // 创建一个新的 div.row, 把内容构造到这个 div 即可
        let containerDiv = document.querySelector('.container');
        let inputs = document.querySelectorAll('input');
        let button = document.querySelector('#submit');
        button.onclick = function() {
            //1.获取到 3 个输入框的内容
            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 = 'row message';
            rowDiv.innerHTML = from + ' 对 ' + to + ' 说: ' + msg;
            containerDiv.appendChild(rowDiv);
            for(let input of inputs){
                input.value = '';
            }
        }
        let revertButton = document.querySelector("#revert");
        revertButton.onclick = function() {
            //删除最后 1 条消息
            //选中所有的 row, 找出最后一条 row 然后删掉
            let rows = document.querySelectorAll('.message');
            if(rows == null || rows.length == 0){
                return;
            }
            containerDiv.removeChild(rows[rows.length - 1]);
        }
    </script>
</body>
</html>

实现功能 :

提交一次后清空三个输入框。

三个输入框其中有一个为空就无法提交。

撤回一条消息。

(此处有 bug,多按几次撤销,撤销按钮也会被删除)

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

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

相关文章

JS小知识,如何将 CSV 转换为 JSON 字符串

大家好&#xff0c;今天和大家聊一聊&#xff0c;在前端开发中&#xff0c;我们如何将 CSV 格式的内容转换成 JSON 字符串&#xff0c;这个需求在我们处理数据的业务需求中十分常见&#xff0c;你是如何处理的呢&#xff0c;如果你有更好的方法欢迎在评论区补充。一、使用 csvt…

手写防抖和节流函数

一、认识防抖debounce函数 我们用一副图来理解一下它的过程&#xff1a; 当事件触发时&#xff0c;相应的函数并不会立即触发&#xff0c;而是会等待一定的时间&#xff1b;当事件密集触发时&#xff0c;函数的触发会被频繁的推迟&#xff1b;只有等待了一段时间也没有事件触…

【前端进阶】-TypeScript高级类型 | 交叉类型、索引签名类型、映射类型

前言 博主主页&#x1f449;&#x1f3fb;蜡笔雏田学代码 专栏链接&#x1f449;&#x1f3fb;【TypeScript专栏】 上篇文章讲解了TypeScript部分高级类型 详细内容请阅读如下&#xff1a;&#x1f53d; 【前端进阶】-TypeScript高级类型 | 类的初始化、构造函数、继承、成员可…

nvm安装node,配置npm 、cnpm

nvm 是什么&#xff1f; nodejs的版本管理工具&#xff0c;为了解决node.js各种版本存在不兼容现象可以通过它安装和切换不同版本的node.js 重要&#xff1a;完全卸载本地node&#xff0c; 下载链接 卸载完成之后&#xff0c;点击nvm-setup.exe安装版&#xff0c;直接运行n…

不是吧,阿sir,还有人不会制作影院订票系统前端页面吗?(拿来就用)

影院订票系统前端页面&#x1f389;案例分析&#x1f389;详细设计✨座位数据与样式定义✨座位的事件处理及相关的代码✨监听与数据格式化✨电影信息展示&#x1f389;动态操作演示图&#x1f389;源码&#xff08;附图片素材&#xff09;引言&#xff1a;大家好&#xff0c;欢…

npm和cnpm下载安装及VUE的创建

npm和cnpm下载安装及VUE的创建 1. node.js下载 node.js官网&#xff1a; http://nodejs.cn/download/ 下载安装后cmd输入以下命令查看版本 2. 配置npm 打开node.js的安装目录&#xff0c;我这里是D:\nodejs&#xff0c;在此目录下创建两个文件夹”node_global“和”node_ca…

【申请加入New Bing遇到的问题:当前无法使用此页面,cn.bing.com 重定向次数过多】

目录一.前言二.问题描述三.解决方案解决方案1:解决方案2:四.总结一.前言 前面的文章我们详细的讲解了如何加入New Bing&#xff0c;之前我们直接加入还可以直接访问&#xff0c;但是现在访问过多就会出现当前无法使用此页面&#xff0c;cn.bing.com 重定向次数过多的问题&…

eslint常见报错及解决

eslint常见报错问题1&#xff1a;Component name "index" should always be multi-word问题2&#xff1a;Newline required at end of file but not found问题3&#xff1a;Strings must use singlequote问题4&#xff1a;Expected indentation of 2 spaces but foun…

json-server|0编码实现REST API

欢迎来到我的博客 &#x1f4d4;博主是一名大学在读本科生&#xff0c;主要学习方向是前端。 &#x1f36d;目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 &#x1f6e0;目前正在学习的是&#x1f525;React框架React框架React框架&#x1f525…

uniapp中的renderjs使用

需求是用openlayers在uniapp框架下做一个移动gis类的软件&#xff0c;选择用renderjs实现地图与dom的交互&#xff0c;一开始也是小白&#xff0c;通过百度资料以及一步步测试后掌握了renderjs的使用&#xff0c;以及地图功能的实现。 一、renderjs的作用是什么&#xff1f; r…

初始vue3

如今新vue项目首选用vue3 typescript vite pinia……模式。在使用Vue2时&#xff0c;使用的是选项式api进行vue项目的开发&#xff0c;vue3在这里做了重大的更新&#xff0c;vue3使用组合式api进行对项目实例化和构建。另外需要注意vue项目需要nodeJS环境的支持&#xff0c;…

LaTex(1):使用在线表格生成器工具生成LaTex表格

目录 0 在线工具 1 常用命令&#xff1a; 1.0 编辑表格 1.1 Table—set size可以改变表格大小&#xff1a; 1.2 合并表格和拆分表格&#xff1a; 1.3 生成latex代码与复制代码&#xff1a; 2 示例 0 在线工具 表格生成器网页&#xff1a;Create LaTeX tables online –…

BootStrap基本使用

目录 BootStrap框架 BootStrap特点 bootstrap的使用 布局容器 固定宽度 完整宽度 栅格网格系统 前言 列的形式 列组合和列偏移 列排序 列嵌套 排版 标题 段落 强调 对齐效果 列表 去点列表 内联列表 定义列表 代码 表格 表单标签 文本框和文本域 单…

【web服务】nginx为什么这么受企业欢迎?看完这边文章你就懂了

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是小鹏linux&#xff0c;运维领域创作者&#xff0c;阿里云ACE认证高级工程师&#x1f61c; &#x1f4dd; 个人主页&#xff1a;小鹏linux&#x1f525; &#x1f389; 支持我&#xff1a;点赞…

【ES6丨前端进阶基础 】ES6的关键字,新特性以及解构赋值

&#x1f482; 个人主页&#xff1a;Aic山鱼 个人社区&#xff1a;山鱼社区 &#x1f4ac; 如果文章对你有所帮助请点个&#x1f44d;吧!欢迎关注、点赞、收藏(一键三连)和订阅专目录 前言 什么是ecmascrpit 一&#xff0c;let关键字的特点 1.不能重复声明变量 2.块级作用…

Http协议之Content-Type理解

Content-Type&#xff0c;翻译过来就是”内容类型“&#xff0c;在互联网中就是”互联网媒体类型“。 在互联网中&#xff0c;两台计算机经常会传输数据&#xff0c;客户端会给服务器发数据&#xff0c;服务器也会给客户端发数据。数据的类型也是有很多种的&#xff0c;我们把所…

【微信小程序系列:四】前端利用wx.setStorageSync缓存设置有效时间

先言&#xff1a; 简单来说&#xff0c;就是利用缓存&#xff0c;进行有效期的保存&#xff0c;以此前端加以判断&#xff0c;在如登录状态过期&#xff0c;操作过期等场景使用&#xff0c;扩展性还蛮多的。 官方文档 实现&#xff1a; 原理&#xff1a;就是先设置一个缓存&…

项目实战 之 vue3 + vite + pinia

目录 一、创建项目 1. 安装vite 2. 创建项目 3. 安装过程 二、项目基本配置 1. 项目icon 2. 项目标题 3. 配置 jsconfig.json 4. 设置 .prettierrc 文件 5. 生成代码片段 01 - 网址 02 - 生成 03 - 配置 04 - 使用 三、项目目录 结构划分 1. assets 2. compo…

require.context()的用法详解

require.context&#xff08;&#xff09;的用法详解&#x1f334;require.context()的介绍&#x1f33a;用法一&#xff1a;在组件内引入多个组件&#x1f33c;用法二&#xff1a;在main.js中引入大量公共组件&#x1f342;用法三&#xff1a;使用插件注册全局组件&#x1f33…

axios+vue 请求时如何携带cookie

axiosvue 请求时如何携带cookie 1&#xff0c;当符合同源策略时&#xff0c;可以直接设置 document.cookie " 你要设置的内容 " mounted() {document.cookie "ioiopipoadiasdasdbasdbas"; // 非跨域传递cookie 直接设置cookie即可this.getData(); /…