JavaScript(WebAPI)

文章目录

    • 什么是WebAPI
    • DOM 基本概念
      • DOM 树
      • 事件
    • 操作元素
      • 获取/修改元素内容
      • 获取/修改元素属性
      • 获取/修改表单元素属性
      • 获取/修改样式属性
    • 网页版猜数字游戏
    • 实现一个表白墙

什么是WebAPI

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

  • ECMAScript: 基础语法部分
  • DOM API: 操作页面结构
  • BOM API: 操作浏览器
    WebAPI 就包含了 DOM + BOM.

什么是 API

API 是一个更广义的概念. 而 WebAPI 是一个更具体的概念, 特指 DOM+BOM
所谓的 API 本质上就是一些现成的函数/对象, 让程序员拿来就用, 方便开发.

DOM 基本概念

DOM就是文档对象模型
把 html 的每个标签, 都映射到 js 中的一个对应对象

  • 标签上显示啥, 都可以通过 js 对象感知到
  • js 对象修改对应属性, 能够影响标签的显示

通过 dom 就可以让 js 代码操作页面元素

DOM 树

在这里插入图片描述

DOM API 有很多, 在这里只介绍几个常用的.

  1. 选中页面元素
    querySelector (CSS 选择器)
        let elem1 = document.querySelector();

这个 document 是浏览器中的全局变量, 任何一个页面都会有一个 document 对象
所有的dom api 都是通过 document 对象来展开的.

<body>
    <div class="box">abc</div>
    <div id="id">def</div>
    <h3>
        <span>
            <input type="text">
        </span>
    </h3>

    <script>
        let elem1 = document.querySelector('.box');
        console.log(elem1);
    </script>
</body>

在这里插入图片描述
我们也可以把这个对象的所有属性都打印出来

<script>
        let elem1 = document.querySelector('.box')
        // console.log(elem1);
        console.dir(elem1);

    </script>

在这里插入图片描述

<script>
        let elem1 = document.querySelector('.box');
        // console.log(elem1);
        console.dir(elem1);

        let elem2 = document.querySelector('#id');
        console.log(elem2);
        
        let elem3 = document.querySelector('h3>span>input') ;
        console.log(elem3);
    </script>

我们前面 css 中学的所有选择器都可以在 querySelector 中使用


事件

事件就是针对用户的一些操作进行的一些响应
要能够和用户交互, 就需要用户干了啥, 用户做的一些动作, 就会在浏览器中产生一些事件(鼠标点击, 鼠标双击, 鼠标按下, 鼠标移动, 调整浏览器窗口… ), 代码就需要针对事件做出反应.

事件的三个要素:

  1. 事件源: 那个元素产生的事件
  2. 事件类型: 点击, 双击, 按下…
  3. 事件处理程序: 事件发生后, 要执行哪个代码. (要执行的代码都是提前设定好的)

前端页面中, 针对事件也是要有不同的处理方式, 都是最开始的时候就设定好的(事件绑定)

最简单的方式, 直接在元素中使用 on… 这样的方法, 来绑定一个事件处理程序

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

但是一般不建议这样写, 容易乱, 特别是一些复杂的事件

<div class="box">abc</div>
    <script>
        let div = document.querySelector('.box');
        div.onclick = function() {
            alert('hello');
        }
   </script>

这样分离开是更好的选择

操作元素

获取/修改元素内容

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

<div class="box">abc</div>
    <script>
        let div = document.querySelector('.box');
        div.onclick = function() {
          console.log(div.innerHTML);
         }
   </script>

在这里插入图片描述
chrome 控制台, 默认会把相邻的相同的日志合并
也可以把它关闭
在这里插入图片描述

我们也可以修改这个innerHTML

console.log(div.innerHTML); 
div.innerHTML += 'a';

在这里插入图片描述

获取/修改元素属性

html 的属性也会映射到 js 对象中

    <img src="向日葵.jpg" alt="">
    <script>
        let img = document.querySelector('img');
        img.onclick = function() {
            console.log(img.src);
            img.src ='美女小姐姐.jpg'; 
        }
   </script>

在这里插入图片描述
其他属性也是都可以设置的.

获取/修改表单元素属性

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

value 属性就是获取到元素里用户填写的值.

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

在这里插入图片描述

下面我们写一个例子
给 input 里放个数字, 每次点击按钮, 让数字+1, 并显示出来

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

在这里插入图片描述

隐藏密码, 显示密码

<input type="text">
    <button>隐藏密码</button>
    <script>
        let input = document.querySelector('input');
        let button = document.querySelector('button');
        button.onclick = function() {
            if(input.type == 'text') {
                input.type = 'password';
                button.innerHTML = '显示密码'
            } else {
                input.type = 'text';
                button.innerHTML = '隐藏密码'
            }
        }
    </script>

在这里插入图片描述
在这里插入图片描述

获取/修改样式属性

  1. 修改内联样式 (修改style 的值)
    我们举个例子
    写一个div, 每次点击后字体都放大.
 <div style="font-size: 20px;">这是一个div, 点击之后字体放大</div>
    <script>
        let div = document.querySelector('div');
        div.onclick = function() {
            // 选获取到当前的字体大小
            let fontSize =  parseInt(div.style.fontSize);
            fontSize += 10;
            // 设置字体大小的时候, 不要忘记px这个单位
            div.style.fontSize = fontSize + 'px'; 
        }
    </script>

这里我们要注意的是, style 里的属性名字都是和 CSS 中一致的(脊柱命名法改成驼峰命名法即可)

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

这里我们也写一个例子, 切换夜间模式

<div id = "one"  class="light"   style="font-size: 20px; height: 500px;">切换夜间模式和日间模式</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. 新增元素
    a. 创建一个元素
    b. 把这个元素放到 dom 树种

使用 createElement 方法来创建一个元素

	<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 i = 3; i < 10; i++) {
            let li = document.createElement('li');
            li.innerHTML = i + '' + i;
            ul.appendChild(li);
        }
     </script>

在这里插入图片描述

  1. 删除元素

使用 removeChild 删除子节点

		<ul>
            <li>11</li>
            <li>22</li>
        </ul>        
    <script>
        let ul = document.querySelector('ul')
        for (let i = 3; i < 10; i++) {
            let li = document.createElement('li');
            li.innerHTML = i + '' + i;
            ul.appendChild(li);
        }
        // 删除 44 这个元素
        let toDelete = document.querySelectorAll('li')[3];
        console.log(toDelete);
        ul.removeChild(toDelete)
  </script>

在这里插入图片描述


网页版猜数字游戏

生成一个 1~100 之间的随机数
让用户来输入一个数字
根据输入的数字的大小关系给出提示(猜大了, 猜小了, 猜对了)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <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的随机整数
        // Math.random() 生成的是[0,1) 之间的随机数, 把随机数设为N
        // 100*N的范围是[0,100), 这是一个挺长的小数
        // 使用parseInt 把小数去掉得到的就是[0~100)的整数了
        // 再 +1 就是[1,100]之间的整数了
        let toGuess = parseInt(100 * Math.random()) + 1;
        console.log(toGuess);
        // 2. 进行猜数字操作
        let button = document.querySelector('button');
        let input = document.querySelector('input');
        let resultDiv = document.querySelector('.result')
        button.onclick = function() {
            // 3. 取出输入框的内容
            if (input == '' ) {
                // 用户啥都没输入, 直接返回
                return;
            }
            let inputNum = parseInt(input.value);
            // 4. 比较大小关系
            if (inputNum < toGuess) {
                // 猜小了
                resultDiv.innerHTML = '猜小了';
            } else if (inputNum > toGuess) {
                // 猜大了
                resultDiv.innerHTML = '猜大了';

            } else {
                // 猜对了
                resultDiv.innerHTML = '恭喜你猜对了';

            }
        }
    </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>
        /* * 是一个通配符选择器, 是选中页面所有元素 */
        * {
            /* 消除浏览器的默认样式 */
            margin: 0;
            padding: 0;
            box-sizing: 0;
        }
         .container {
            width: 600px;
            /*  垂直方形为20px  水平方向左右外边距为 auto */
            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: 60px;
         }
         .row input {
            width: 200px;
            height: 30px;
         }
         .row button {
            width: 262px;
            height: 30px;
            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="cancel">撤销</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 = 'row message';
             rowDiv.innerHTML = from + ' 对 ' + to + ' 说: ' +msg;
            containerDiv.appendChild(rowDiv);
             // 3. 清空之前的输入框内容  
            for (let input of inputs) {
                input.value = '';
            }
        }
        let cencelButton = document.querySelector('#cancel');
        cencelButton.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.mfbz.cn/a/115545.html

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

相关文章

两天实现思维导图的协同编辑?用Yjs真的可以

最近使用 Yjs 给自己开源的一个思维导图加上了协同编辑的功能&#xff0c;得益于该框架的强大&#xff0c;一直觉得很复杂的协同编辑能力没想到实现起来异常的简单&#xff0c;所以通过本文来安利给各位。 要实现协同编辑&#xff0c;目前主要有两种算法&#xff0c;一是 OT&a…

关于Intel Press出版的《Bedyong BIOS》第2版的观后感

文章目录 此书的背景UEFI运行时DXE基础CPU架构协议PCI协议UEFI驱动的初始化串口DXE驱动示例 《Beyond BIOS》首先介绍一个简单的UEFI应用程序模块&#xff0c;用于展示UEFI应用程序的行为。作者为Waldo。该模块名为“InitializeHelloApplication”&#xff0c;它接受两个参数&a…

【Mysql】Mysql中表连接的原理

连接简介 在实际工作中&#xff0c;我们需要查询的数据很可能不是放在一张表中&#xff0c;而是需要同时从多张表中获取。下面我们以简单的两张表为例来进行说明。 连接的本质 为方便测试说明&#xff0c;&#xff0c;先创建两个简单的表并给它们填充一点数据&#xff1a; …

保障效率与可用,分析Kafka的消费者组与Rebalance机制

系列文章目录 上手第一关&#xff0c;手把手教你安装kafka与可视化工具kafka-eagle Kafka是什么&#xff0c;以及如何使用SpringBoot对接Kafka 架构必备能力——kafka的选型对比及应用场景 Kafka存取原理与实现分析&#xff0c;打破面试难关 防止消息丢失与消息重复——Kafka可…

react+canvas实现横跨整个页面的动态的波浪线(贝塞尔曲线)

本来写这个特效 我打算用css实现的&#xff0c;结果是一波三折&#xff0c;我太难了&#xff0c;最终没能用css实现&#xff0c;转战了canvas来实现。来吧先看效果图 当然这个图的波浪高度、频率、位置、速度都是可调的&#xff0c;请根据自己的需求调整&#xff0c;如果你讲波…

windows10系统-17-文献管理软件

参考诸多文献管理软件的优劣比较如何&#xff1f;你有哪些使用心得&#xff1f; 参考我愿称之为目前最好用的文献管理和阅读软件&#xff01;readpaper 1 文献总结 文献总结是非常重要的一项技能&#xff0c;不知道大家看完文献后有没有总结文献的习惯&#xff0c;有的话那挺…

数据仓库-拉链表

在数据仓库中制作拉链表&#xff0c;可以按照以下步骤进行&#xff1a; 确定需求&#xff1a;首先明确需要使用拉链表的场景和需求。例如&#xff0c;可能需要记录历史数据的变化&#xff0c;以便进行时间序列分析等。设计表结构&#xff1a;在数据仓库中&#xff0c;拉链表通…

Web自动化测试 —— PageObject设计模式!

一、page object 模式简介 1.1、传统 UI 自动化的问题 无法适应 UI 频繁变化无法清晰表达业务用例场景大量的样板代码 driver/find/click 二、page object 设计原则 2.1、POM 模式的优势 降低 UI 变化导致的测试用例脆弱性问题让用例清晰明朗&#xff0c;与具体实现无关 2.…

JVM常用命令

jps —查看pid jstat -gcutil 4364 1000 2000 —查看堆内存占用百分比&#xff0c;每秒打印1次&#xff0c;总共打印2000次 S0&#xff1a;幸存1区当前使用比例 S1&#xff1a;幸存2区当前使用比例 E&#xff1a;伊甸园区使用比例 O&#xff1a;老年代使用比例 M&#xff1a;元…

服务Service

一、服务概述 Service(服务)是Android四大组件之一&#xff0c;是能够在后台长时间执行操作并且不是供用户界面的应用程序组件。Senice可以与其他组件进行交互&#xff0c;一般由Activity启动&#xff0c;但是并不依赖于Activity。当Activity的生命周期结束时&#xff0c;Serv…

野火霸天虎 STM32F407 学习笔记_1 stm32介绍;调试方法介绍

STM32入门——基于野火 F407 霸天虎课程学习 前言 博主开始探索嵌入式以来&#xff0c;其实很早就开始玩 stm32 了。但是学了一段时间之后总是感觉还是很没有头绪&#xff0c;不知道在学什么。前前后后分别尝试了江协科技、正点原子、野火霸天虎三次 stm32 的课程学习。江协科…

学Python,一个月从小白到大神?看你怎么学!

Python是一门超强大而且超受欢迎的编程语言。它被用在各种领域&#xff0c;比如网站开发、数据分析、人工智能和机器学习。学会Python会给你创造很多职业机会&#xff0c;所以绝对是值得一试的。 但你有没有过这样的梦想&#xff1a;一个月时间&#xff0c;从Python小白变成Py…

Docker DeskTop安装与启动(Windows版本)

一、官网下载Docker安装包 Docker官网如下&#xff1a; Docker官网不同操作系统下载页面https://docs.docker.com/desktop/install/windows-install/ 二、安装Docker DeskTop 2.1 双击 Docker Installer.exe 以运行安装程序 2.2 安装操作 默认勾选&#xff0c;具体操作如下…

页面淘汰算法模拟实现与比较

1.实验目标 利用标准C 语言&#xff0c;编程设计与实现最佳淘汰算法、先进先出淘汰算法、最近最久未使用淘汰算法、简单 Clock 淘汰算法及改进型 Clock 淘汰算法&#xff0c;并随机发生页面访问序列开展有关算法的测试及性能比较。 2.算法描述 1. 最佳淘汰算法&#xff08;Op…

编写shell脚本,利用mysqldump实现mysql数据库分库分表备份

摘要&#xff1a;本文介绍了如何使用 Shell 脚本和 mysqldump 工具实现 MySQL 数据库的分库分表备份。通过编写脚本&#xff0c;我们可以自动化备份多个数据库以及每个数据库中的所有表&#xff0c;并将备份文件按照数据库和表的层次结构进行存储。 一、准备工作 在开始编写 Sh…

HMDD 4.0:miRNA-疾病关系数据库

拥有多项自主专利技 术和软件著作权&#xff0c;具 有丰富的数据库平台 搭建经验。 凌恩-盈飞团队 MicroRNA&#xff08;miRNA&#xff09;是一类重要的小非编码RNA&#xff0c;在疾病诊断和治疗中发挥着重要作用。人类 MicroRNA 疾病数据库 (HMDD) 为 miRNA 相关医学提供了…

【云原生基础】了解云原生,什么是云原生?

&#x1f4d1;前言 本文主要讲了云原生的基本概念和原则的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#x…

人工智能师求职面试笔试题及答案汇总

人工智能师求职面试笔试题及答案汇总 1.如何在Python中实现一个生成器&#xff1f; 答&#xff1a;在Python中&#xff0c;生成器是一种特殊类型的迭代器。生成器允许你在需要时才生成值&#xff0c;从而节省内存。生成器函数在Python中是通过关键字yield来实现的。例如&…

leetCode 137. 只出现一次的数字 II(拓展篇) + 模5加法器 + 真值表(数字电路)

leetCode 137. 只出现一次的数字 II 有其他的题解可看我的往期文章&#xff1a; leetCode 137. 只出现一次的数字 II 位运算 模3加法器 真值表&#xff08;数字电路&#xff09; 有限状态机-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/134138112?sp…

生成带分表和水印的excel压缩文件

功能描述 将查询结果生成带分表和水印的excel压缩文件 功能点 1、将查询结果导出为excel文件 2、每个表格存放50万条数据&#xff0c;超过50万条数据&#xff0c;生成新的分表 3、生成的表格需要添加水印 4、将生成的全部分表&#xff0c;打包成zip压缩文件 引入依赖 <…