【JavaScript】WebAPI入门到实战

news2025/1/19 11:08:55

文章目录

  • 一、WebAPI背景知识
    • 1. 什么是WebAPI?
    • 2. 什么是API?
  • 二、DOM基本概念
  • 三、获取元素
  • 三、事件初识
    • 1. 点击事件
    • 2. 键盘事件
  • 四、操作元素
    • 1. 获取/修改元素内容
    • 2. 获取/修改元素属性
    • 3. 获取/修改表单元素属性
    • 4. 获取/修改样式属性
  • 五、操作节点
    • 1. 新增节点
    • 2. 删除节点
  • 六、实战案例
    • 1. 猜数字
    • 2. 表白墙
    • 3. 任务清单


一、WebAPI背景知识

1. 什么是WebAPI?

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

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

WebAPI 就包含了 DOM + BOM,这个是 W3C 组织规定的. (和制定 ECMAScript 标准的大佬们不是一伙人).

前面学的 JS 基础语法主要学的是 ECMAScript,这让我们建立基本的编程思维. 相当于练武需要先扎马步,但是真正来写一个更加复杂的有交互式的页面,还需要 WebAPI 的支持,相当于各种招式。下面我们重点讲解的是DOM API


2. 什么是API?

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

相当于一个工具箱,只不过程序猿用的工具箱数目繁多,功能复杂

在这里插入图片描述

💕 API参考文档

https://developer.mozilla.org/zh-CN/docs/Web/API


二、DOM基本概念

💕 什么是DOM?

DOM 全称为 Document Object Model

W3C 标准给我们提供了一系列的函数, 让我们可以操作:

  • 网页内容
  • 网页结构
  • 网页样式

💕 DOM树

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

树形结构在数据结构阶段我们已经学过了,可以简单理解成类似于 “家谱” 这种结构,页面结构形如:

在这里插入图片描述

DOM 树结构形如:

在这里插入图片描述

重要概念:

  • 文档: 一个页面就是一个 文档, 使用 document 表示.
  • 元素: 页面中所有的标签都称为 元素. 使用 element 表示.
  • 节点: 网页中所有的内容都可以称为 节点(标签节点,注释节点,文本节点,属性节点等),使用 node 表示。

这些文档等概念在 JS 代码中就对应一个个的对象,所以才叫 “文档对象模型”。


三、获取元素

这部分工作类似于 CSS 选择器 的功能

💕 querySelector

这个是 HTML5 新增的, IE9 及以上版本才能使用

前面的几种方式获取元素的时候都比较麻烦,而使用 querySelector 能够完全复用前面学过的 CSS 选择器知识,达到更快捷更精准的方式获取到元素对象。

var element = document.querySelector(selectors);
  • selectors 包含一个或多个要匹配的选择器的 DOM字符串 DOMString 。 该字符串必须是有效的CSS选择器字符串;如果不是,则引发 SYNTAX_ERR 异常
  • 表示文档中与指定的一组CSS选择器匹配的第一个元素的 html元素 Element 对象.
  • 如果您需要与指定选择器匹配的所有元素的列表,则应该使用 querySelectorAll()
  • 可以在任何元素上调用,不仅仅是 document。 调用这个方法的元素将作为本次查找的根元素

正因为参数是选择器, 所以一定要通过特殊符号指定是哪种选择器:

<script>
    console.log(document.querySelector('.box1'))
    console.log(document.querySelector('h3').querySelector('span').querySelector('input'))
</script>

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

使用document会选择到整个页面。

在这里插入图片描述

💕 querySelectorAll

console.log(document.querySelectorAll('div'))

在这里插入图片描述


三、事件初识

事件是发生在你正在编程的系统中的事情——当事件发生时,系统产生(或“触发”)某种信号,并提供一种机制,当事件发生时,可以自动采取某种行动(即运行一些代码)。事件是在浏览器窗口内触发的,并倾向于附加到驻留在其中的特定项目。这可能是一个单一的元素,一组元素,当前标签中加载的 HTML 文档,或整个浏览器窗口。有许多不同类型的事件可以发生。

💕 基本概念

JS 要构建动态页面, 就需要感知到用户的行为。

用户对于页面的一些操作(点击, 选择, 修改等) 操作都会在浏览器中产生一个个事件, 被 JS 获取到, 从而进行更复杂的交互操作。

浏览器就是一个哨兵, 在侦查敌情(用户行为). 一旦用户有反应(触发具体动作), 哨兵就会点燃烽火台的狼烟(事件), 后方就可以根据狼烟来决定下一步的对敌策略。

💕 事件三要素

  1. 事件源: 哪个元素触发的
  2. 事件类型: 是点击, 选中, 还是修改?
  3. 事件处理程序: 进一步如何处理. 往往是一个回调函数

1. 点击事件

下面我们来看一个简单的点击事件:

<script>
    // 事件源
    let button = document.querySelector('input')
    // 1. 绑定事件类型(点击事件) 2. 函数设定了事件处理程序
    button.onclick = function() {
        alert("hello, 你好吖")
    }
</script>

在这里插入图片描述


2. 键盘事件

  • onkeydown 事件:当用户按下键盘上的任何键时触发,包括字符键、功能键和控制键。
  • onkeypress 事件:当用户按下字符键(例如字母、数字、符号键)时触发。
  • onkeyup事件:当用户释放键盘上的键时触发,无论是字符键、功能键还是控制键。

💕 onkeydown 事件

示例一:

<input type="text">
<script>
    // 事件源
    let input = document.querySelector('input')
    input.onkeydown = function() {
        console.log("键盘正在按下")
    }
</script>

当我们按键盘的过程中会有如下效果:

在这里插入图片描述

event—> 事件处理程序通常会接收一个事件对象(通常命名为 evente),该对象包含与触发事件相关的信息和属性。事件对象提供了有关事件的详细信息,使开发人员能够对事件进行更精细的控制和响应。

String.fromCharCode() 是 JavaScript 中的一个方法,用于将一个或多个字符编码的 Unicode 值转换为相应的字符串。这个方法可以接受一个或多个 Unicode 值作为参数,并返回由这些 Unicode 值构成的字符串。

示例二:

<input type="text">
<script>
    let input = document.querySelector('input')
    input.onkeydown = function(event) {
        let a = event.keyCode
        let b = String.fromCharCode(a)
        console.log(b)
    }
</script>

在这里插入图片描述


💕 onkeypress 事件

当我们使用onkeydown事件时,发现无论按下的字母是大写还是小写,他输出在控制台上时都是大写。使用onkeypress可以有效解决这个问题。

在这里插入图片描述

<input type="text">
<script>
    let input = document.querySelector('input')
    input.onkeypress = function(event) {
        let a = event.keyCode
        let b = String.fromCharCode(a)
        console.log(b)
    }
</script>

在这里插入图片描述


💕 onkeyup 事件

onkeyup 事件是在键盘按下去弹起来的时候才会触发的事件。

<input type="text" onkeyup="myOnkeyUp()">
<script>
    let input = document.querySelector('input')
    input.onkeypress = function(event) {
        let a = event.keyCode
        let b = String.fromCharCode(a)
        console.log(b)
    }
    function myOnkeyUp() {
        console.log("按键被抬起")
    }
</script>

在这里插入图片描述

但是有时候我们输入的是特殊键的时候,将不会打印在控制台上,比如说:shift键、alt键等。

在这里插入图片描述

可以看到控制台并没有打印。那是因为这些键需要特殊处理:

在这里插入图片描述

例如:

<input type="text" onkeyup="myOnkeyUp()">
<script>
    let input = document.querySelector('input')
    input.onkeydown = function(event) {
        // 如果按键按下的是shift此时弹出一个弹窗,提示shift被按下
        if(event.shiftKey) {
            alert("shift键被按下")
        }
        if(event.altKey) {
            alert("alt键被按下")
        }
    }
    function myOnkeyUp() {
        console.log("按键被抬起")
    }
</script>

在这里插入图片描述


四、操作元素

1. 获取/修改元素内容

💕 innerText

Element.innerText 属性表示一个节点及其后代的“渲染”文本内容

在这里插入图片描述

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

在这里插入图片描述

💕 innerHTML

Element.innerHTML 属性设置或获取HTML语法表示的元素的后代

在这里插入图片描述

<body>
    <span>这是一个span标签</span>
</body>
<script>
    // 获取元素内容
    let span = document.querySelector('span')
    console.log(span.innerHTML)
    // 修改
    span.innerHTML = "我在修改元素内容"
    // 修改页面结构
    span.innerHTML = "<h3>这是h3标签</h3>"
</script>

在这里插入图片描述


2. 获取/修改元素属性

可以通过 Element 对象的属性来直接修改, 就能影响到页面显示效果。

在这里插入图片描述

<body>
    <img src="../百度logo图标.png" alt="图片加载失败" title="这是一个提示图片" width="100px" height="100px">
</body>
<script>
    let img = document.querySelector('img')
    console.dir(img)
    img.title = "这是已经修改完毕的title"
    img.onclick = function() {
        alert("你已经点击了这个图片")
    }
</script>

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


3. 获取/修改表单元素属性

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

  • value: input 的值.
  • disabled: 禁用
  • checked: 复选框会使用
  • selected: 下拉框会使用
  • type: input 的类型(文本, 密码, 按钮, 文件等)

💕 实现播放按钮

<body>
    <input class="btn" type="button" value="播放" onclick="Onclick()">
</body>
<script>
    let btn = document.querySelector('.btn')
    // 当按钮的 value 变成 播放时, 此时将value按钮变成暂停。否则的话变成播放
    function Onclick() {
        if(btn.value == '播放')
            btn.value = '暂停'
        else
            btn.value = '播放'
    }
</script>

在这里插入图片描述


💕 计数器实现:点击计数

使用一个输入框输入初始值(整数). 每次点击按钮, 值 + 1或者 值 -1

<body>
    <input class="input" type="text" value="0">
    <input class="Add" type="button" value="+1" onclick="Add()">
    <input class="Min" type="button" value="-1" onclick="Min()">
</body>
<script>
    function Add() {
        let input_element = document.querySelector('.input')
        input_element.value = parseInt(input_element.value) + 1
    }
    function Min() {
        let input_element = document.querySelector('.input')
        input_element.value = parseInt(input_element.value) - 1
    }
</script>

在这里插入图片描述


💕 复选框的选中效果

代码示例:全选/取消全选按钮

在这里插入图片描述

  1. 点击全选按钮,则选中所有选项
  2. 只要某个选项取消,则自动取消全选按钮的勾选状态
<body>
    <input class="all" type="checkbox" onclick="SelectAll()">选中全部<br>
    <input class="select" type="checkbox">貂蝉<br>
    <input class="select" type="checkbox">小乔<br>
    <input class="select" type="checkbox">安琪拉<br>
    <input class="select" type="checkbox">妲己<br>
</body>
<script>
    let all = document.querySelector('.all')
    let select = document.querySelectorAll('.select')
    // 当选中 “全部选中” 按钮时, 其他所有选项都将被选中
    function SelectAll() {
        for(i = 0; i < select.length; i++){
            select[i].checked = all.checked
        }
    }
    // 当其他选项中有任意一个选项没有被选中时, “全部选中”选项也不被勾选
    for(i = 0; i < select.length; i++){
        select[i].onclick = function() {
            all.checked = IsSelectAll(select)
        }
    }
    function IsSelectAll(select) {
        for(i = 0; i < select.length; i++){
            if(select[i].checked == false)
                return false
        }
        return true
    }
</script>

在这里插入图片描述


4. 获取/修改样式属性

💕 行内样式操作

“行内样式”, 通过 style 直接在标签上指定的样式。优先级很高,适用于改的样式少的情况。

在这里插入图片描述

示例: 点击文字则放大字体

<body>
    <div style="font-size: 10px;" onclick="changeSize()">哈哈哈</div>
</body>
<script>
    function changeSize() {
        let element = document.querySelector('div')
        console.log(element.style)
        let size = parseInt(element.style.fontSize) + 10
        // element.style.cssText = "font-size:" + size + "px"
        element.style.fontSize = size + "px"
    }
</script>

在这里插入图片描述


💕 类名样式操作

修改元素的 CSS 类名,适用于要修改的样式很多的情况,由于 class 是 JS 的保留字, 所以名字叫做 className

在这里插入图片描述

示例: 开启夜间模式

在这里插入图片描述

  • 点击页面切换到夜间模式(背景变成黑色)
  • 再次点击恢复日间模式(背景变成白色)

代码实现:

<style>
    .light {
        background-color: aliceblue;
        color: black;
        width: 100%;
        height: 100%;
    }
    body, html {
        width: 100%;
        height: 100%;
    }
    .dark {
        background-color: black;
        color: white;
        width: 100%;
        height: 100%;
    }
</style>
<div class="light" onclick="changeStyle()">
	这是一段话<br>
	这是一段话<br>
	这是一段话<br>
	这是一段话<br>
	这是一段话<br>
	这是一段话<br>
</div>
<script>
    function changeStyle() {
        let element = document.querySelector('div')
        // 如果当前的样式为白天模式, 就切换成黑夜模式, 否则就将当前样式调整成白天模式
        if(element.className == "light") {
            element.className = "dark"
        } else {
            element.className = "light"
        }
    }
</script>

在这里插入图片描述


五、操作节点

💕 什么是节点?

"节点"通常指的是文档对象模型(DOM)中的元素或对象。DOM是表示HTML和XML文档的树状结构,它将文档中的每个部分(如元素、属性、文本等)表示为对象,开发者可以使用JavaScript来访问、操作和修改这些对象,从而实现对文档的动态交互和修改。

在这里插入图片描述

1. 新增节点

分成两个步骤:

  1. 创建元素节点
  2. 把元素节点插入到 dom 树中

💕 创建元素节点

使用 createElement 方法来创建一个元素,options 参数暂不关注。

在这里插入图片描述

这是元素节点的创建方式,当然我们还可以创建别的:

  • createTextNode 创建文本节点
  • createComment 创建注释节点
  • createAttribute 创建属性节点

虽然创建出新的 div 了, 但是我们新创建的节点并没有加入到DOM 树中。


💕 插入节点到 dom 树中

  1. 使用 appendChild 将节点插入到指定节点的最后一个孩子之后
    在这里插入图片描述

例如:

<div>
        <p class="p1">这是一个p标签1</p>
        <p class="p2">这是一个p标签2</p>
        <p class="p3">这是一个p标签3</p>
    </div>

在这里插入图片描述

插入到指定节点的最后一个孩子之后:

<script>
    let element = document.createElement('h3')
    element.innerHTML = "这是我创建的一个新节点"
    let div = document.querySelector('div')
    div.appendChild(element)
</script>

在这里插入图片描述

  1. 使用 insertBefore 将节点插入到指定节点之前

在这里插入图片描述

  • insertedNode 被插入节点(newNode)
  • parentNode 新插入节点的父节点
  • newNode 用于插入的节点
  • newNode将要插在referenceNode这个节点之前

注意:

如果 referenceNode 为 null 则 newNode 将被插入到子节点的末尾,referenceNode 引用节点不是可选参数

例如:

<div>
    <p class="p1">这是一个p标签1</p>
    <p class="p2">这是一个p标签2</p>
    <p class="p3">这是一个p标签3</p>
</div>

在这里插入图片描述

<script>
    let div = document.querySelector('div')
    let new_node = document.createElement('p')
    new_node.innerHTML = "这是一个新p标签"
    div.insertBefore(new_node, document.querySelector('.p1'))
</script>

在这里插入图片描述

如果我们将insertBefore中的第一个参数referenceNode设置为空时,新增的元素会被插在子节点的末尾。

div.insertBefore(new_node, null)

在这里插入图片描述

注意:

  • 如果针对一个节点插入两次, 则只有最后一次生效(相当于把元素移动了)
  • 一旦一个节点插入完毕, 再针对刚刚的节点对象进行修改, 能够同步影响到 DOM 树中的内容

2. 删除节点

使用 removeChild 删除子节点

在这里插入图片描述

  • child 为待删除节点
  • element 为 child 的父节点
  • 返回值为该被删除节点
  • 被删除节点只是从 dom 树被删除了, 但是仍然在内存中, 可以随时加入到 dom 树的其他位
    置.
  • 如果上例中的 child节点 不是 element 节点的子节点,则该方法会抛出异常

在这里插入图片描述

删掉上面的p2标签:

<script>
    let div = document.querySelector('div')
    div.removeChild(document.querySelector('.p2'))
</script>

在这里插入图片描述


六、实战案例

1. 猜数字

💕 预期效果:

在这里插入图片描述

💕 代码实现:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .false {
            color: red;
        }
        .true {
            color: green;
        }
    </style>
</head>
<body>
    <input class="reset_button" type="button" value="重新开始一局游戏" onclick="reSet()"><br>
    请输入要猜的数字: <input class="to_guess_num" type="text" value="0"><input type="button" value="" onclick="Guess()"><br>
    已经猜的次数: <span class="has_guess_num">0</span><br>
    结果: <span class="result"></span>
</body>
<script>
    // 输入的数字
    let to_guess_num_element = document.querySelector('.to_guess_num')
    console.dir(to_guess_num_element)
    // 已经猜的次数
    let has_guess_num_element = document.querySelector('.has_guess_num')
    console.dir(has_guess_num_element)
    // 猜测的结果
    let result_element = document.querySelector('.result')
    console.dir(result_element)

    function reSet() {
        to_guess_num_element.value = 0
        has_guess_num_element.innerHTML = 0
        result_element.innerHTML = ""
    }
    // 生成随机数作为我们要猜的数字
    let num = Math.floor(Math.random()*100) + 1
    console.log(num)

    function Guess() {
        has_guess_num_element.innerHTML = parseInt(has_guess_num_element.innerHTML) + 1
        if(parseInt(to_guess_num_element.value) < num){
            result_element.innerHTML = "猜小了"
            result_element.className = false
        } else if(parseInt(to_guess_num_element.value) > num) {
            result_element.innerHTML = "猜大了"
            result_element.className = false
        } else {
            result_element.innerHTML = "猜中了"
            result_element.className = true
        }
    }
</script>
</html>

在这里插入图片描述


2. 表白墙

💕 预期效果:

在这里插入图片描述

💕 代码实现:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0px;
            padding: 0px;
        }
        .container {
            width: 400px;
            margin: 0 auto;
        }
        h1 {
            text-align: center;
            margin-bottom: 40px;
            margin-top: 20px;
        }
        p {
            text-align: center;
            color: gray;
            line-height: 63px;
        }
        .div1 {
            display: flex;
            justify-content: center;
            align-items: center;
        }
        .divContent {
            display: flex;
            justify-content: center;
            align-items: center;
            margin-top: 20px;
            color: pink;
        }
        .edit {
            margin-bottom: 20px;
            width: 200px;
            height: 30px;
        }
        span {
            width: 50px;
            margin-bottom: 20px;
        }
        .submit {
            background-color: rgb(255, 157, 0);
            color: white;
            width: 260px;
            height: 30px;
            border: none;
            border-radius: 5px;
        }
        .submit:active{
            background-color: gray;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>表白墙</h1>
        <p>输入相关信息, 点击提交数据将会展示在表格中</p>
        <div class="div1">
            <span>谁: </span><input type="text" class="edit">
        </div>
        <div class="div1">
            <span>对谁: </span><input type="text" class="edit">
        </div>
        <div class="div1">
            <span>说: </span><input type="text" class="edit">
        </div>
        <div class="div1">
            <input type="button" value="提交" class="submit" onclick="Submit()">
        </div>
    </div>
</body>
<script>
    function Submit() {
        let edits = document.querySelectorAll('.edit')
        console.dir(edits)
        let from = edits[0].value
        let to = edits[1].value
        let message = edits[2].value
        if(from == '' || to == '' || message == '')
            return
        console.log(from + " " + to + " " + message)
        let div = document.createElement('div')
        div.className = "divContent"
        div.innerHTML = from + "对" + to + "说: " + message
        console.log(div)
        let container = document.querySelector('.container')
        container.appendChild(div)
    }
</script>
</html>

在这里插入图片描述


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>Document</title>
    <style>
        * {
            margin: 0px;
            padding: 0px;
            box-sizing: border-box;
        }
        .nav {
            width: 800px;
            height: 100px;
            margin: 0 auto;
            display: flex;
            align-items: center;
        }
        .nav input {
            width: 600px;
            height: 60px;
            border-radius: 5px;
        }
        .nav button {
            width: 200px;
            height: 60px;
            background-color: orange;
            color: white;
            font-size: 20px;
            border: orange;
            border-radius: 5px;
        }
        .nav button:active {
            background-color: grey;
        }
        .container {
            width: 800px;
            display: flex;
            margin: 0px auto;
        }
        h3 {
            background-color: gray;
            color: white;
            text-align: center;
            width: 400px;
            height: 60px;
            padding-top: 15px;
        }
        .todo,
        .done {
            width: 50%;
            height: 100%;
        }
        .row {
            width: 400px;
            display: flex;
            align-items: center;
        }
        span {
            width: 200px;
            font-size: 20px;
            margin-left: 5px;
        }
        .row button {
            width: 90px;
            height: 40px;
            font-size: 20px;
            margin-top: 10px;
        }
        /* s */
    </style>
</head>
<body>
    <div class="nav">
        <input type="text"><button onclick="newJob()">新建任务</button>
    </div>
    <div class="container">
        <div class="todo">
            <h3>未完成</h3>
            <div class="row">
                <input type="checkbox" name="" id="">
                <span>吃饭</span><button>删除</button>
            </div>
        </div>
        <div class="done">
            <h3>已完成</h3>
        </div>
    </div>
</body>
<script>
    function newJob() {
        // 获取到input输入框按钮
        let input = document.querySelector('.nav input')
        // 获取到输入的信息
        let input_info = input.value
        if(input_info == '') {
            return
        }
        console.log(input_info)
        // 获取到todo这个div
        let todo = document.querySelector('.todo')
        // 创建一个div
        let div = document.createElement('div')
        // 创建一个checkbox
        let checkbox = document.createElement('input')
        checkbox.type = 'checkbox'
        // 创建一个span(文本内容是刚才输入的信息对应的文本)
        let span = document.createElement('span')
        span.innerHTML = input_info
        console.log(checkbox)
        console.log(span)
        // 创建一个删除button
        let button = document.createElement('button')
        button.innerHTML = "删除"
        div.appendChild(checkbox)
        div.appendChild(span)
        div.appendChild(button)
        console.log(div)
        // 更新样式
        div.className = 'row'
        // // 将div插入到todo这个div中
        todo.appendChild(div)

        let delete_buttons = document.querySelectorAll('.row button')
        console.log(delete_buttons)
        for(i = 0; i < delete_buttons.length; i++) {
            delete_buttons[i].onclick = function() {
                let parent = this.parentNode;
                console.log(parent)
                let grand_parent = parent.parentNode
                console.log(grand_parent)
                grand_parent.removeChild(parent)

            }
        }
        let checkbox_buttons = document.querySelectorAll('.row input')
        // 给每一个复选框绑定点击事件
        for(i = 0; i < checkbox_buttons.length; i++) {
            checkbox_buttons[i].onclick = function() {
                // 将节点插入到对应的div中
                // row代表的插入的节点
                let row = this.parentNode;
                // target代表的是将row插入到那个div中
                // 如果复选框已经被选中,那么target就是已完成对应的这个div
                // 否则target就是未完成对应的div
                let target;
                console.log(this.checked)
                if(this.checked) {
                    target = document.querySelector('.done') 
                } else {
                    target = document.querySelector('.todo')
                }
                target.appendChild(row)
            }
        }

}
</script>
</html>

在这里插入图片描述


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

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

相关文章

scratch还原轨迹 2023年5月中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析

目录 scratch还原轨迹 一、题目要求 1、准备工作 2、功能实现 二、案例分析

Python:安装Flask web框架hello world

安装easy_install pip install distribute 安装pip easy_install pip 安装 virtualenv pip install virtualenv 激活Flask pip install Flask 创建web页面demo.py from flask import Flask app Flask(__name__)app.route(/) def hello_world():return Hello World! 2023if _…

基于springboot实现的rabbitmq消息确认

概述 RabbitMQ的消息确认有两种。 一种是消息发送确认。这种是用来确认生产者将消息发送给交换器&#xff0c;交换器传递给队列的过程中&#xff0c;消息是否成功投递。发送确认分为两步&#xff0c;一是确认是否到达交换器&#xff0c;二是确认是否到达队列。 第二种是消费接…

【APUE】标准I/O库

目录 1、简介 2、FILE对象 3、打开和关闭文件 3.1 fopen 3.2 fclose 4、输入输出流 4.1 fgetc 4.2 fputc 4.3 fgets 4.4 fputs 4.5 fread 4.6 fwrite 4.7 printf 族函数 4.8 scanf 族函数 5、文件指针操作 5.1 fseek 5.2 ftell 5.3 rewind 6、缓冲相关 6.…

安装samba服务器

1.实验目的 &#xff08;1&#xff09;了解SMB和NETBIOS的基本原理 &#xff08;2&#xff09;掌握Windows和Linux之间&#xff0c;Linux系统之间文件共享的基本方法。 2.实验内容 &#xff08;1&#xff09;安装samba服务器。 &#xff08;2&#xff09;配置samba服务器的…

Visual Studio 线性表的链式存储节点输出引发异常:读取访问权限冲突

问题&#xff1a; 写了一个线性表的链式存储想要输出&#xff0c;能够输出&#xff0c;但是会报错&#xff1a;读取访问权限冲突 分析&#xff1a; 当我们输出到最后倒数第二个节点时&#xff0c;p指向倒数第二个节点并输出&#xff1b; 下一轮循环&#xff1a;p指向倒数第二…

Helm Kubernetes Offline Deploy Rancher v2.7.5 Demo (helm 离线部署 rancher 实践)

文章目录 1. 简介2. 预备条件3. 选择 SSL 配置4. 离线安装的 Helm Chart 选项5. 下载介质6. 生成证书7. 镜像入库8. 安装 rancher9. 配置 nodeport10. 配置 ingress11. 界面访问11.1 首页预览11.2 查看集群信息11.3 查看项目空间11.4 查看节点信息 1. 简介 Rancher 是一个开源…

17-数据结构-查找-(顺序、折半、分块)

简介&#xff1a;查找&#xff0c;顾名思义&#xff0c;是我们处理数据时常用的操作之一。大概就是我们从表格中去搜索我们想要的东西&#xff0c;这个表格&#xff0c;就是所谓的查找表&#xff08;存储数据的表&#xff09;。而我们怎么设计查找&#xff0c;才可以让计算机更…

lv4 嵌入式开发-4 标准IO的读写(二进制方式)

目录 1 标准I/O – 按对象读写 2 标准I/O – 小结 3 标准I/O – 思考和练习 文本文件和二进制的区别&#xff1a; 存储的格式不同&#xff1a;文本文件只能存储文本。除了文本都是二进制文件。 补充计算机内码概念&#xff1a;文本符号在计算机内部的编码&#xff08;计算…

2023/09/10

文章目录 1. 使用Vue单页面全局变量注意事项2. 伪元素和伪类3. Vue3中定义数组通常使用ref4. Vue Router的 $router 和 $route5. Vue路由中的query和params的区别6. vue3defineExpose({})属性不能重命名&#xff0c;方法可以重命名7. 显卡共享内存的原理8. deltaY9. 快速生成方…

电池2RC模型 + 开路电压法 + 安时积分 + 电池精度测试 + HPPC脉冲

电池2RC模型 电池2RC模型是一种等效电路模型&#xff0c;用于描述电池的动态特性。该模型将电池视为一个理想电容器和一个理想电阻的并联&#xff0c;其中理想电容器代表电池的化学反应&#xff0c;理想电阻代表电池的内阻。该模型适用于描述电池的充电和放电过程。 开路电压…

Java中如何判断字符串输入[hello,world]是不是字符串数组参数

Java中如何判断字符串输入[hello,world]是不是字符串数组参数&#xff1f; 在Java中&#xff0c;可以使用正则表达式来判断一个字符串是否符合字符串数组的参数格式。你可以使用matches()方法和对应的正则表达式进行判断。 以下是一个示例代码&#xff1a; public static bo…

SpringCloudGateway网关实战(二)

SpringCloudGateway网关实战&#xff08;二&#xff09; 本文我们在前文的基础上&#xff0c;开始讲gateway过滤器的部分内容。gateway的过滤器分为内置过滤器Filter和全局过滤器GlobalFilter。本章节先讲内置过滤器Filter。 需要先声明一下内置过滤器和全局过滤器之间的区别…

mysql文档--innodb中的重头戏--事务隔离级别!!!!--举例学习--现象演示

阿丹&#xff1a; 先要说明一点就是在网上现在查找的mysql中的事务隔离级别其实都是在innodb中的事务隔离级别。因为在mysql的5.5.5版本后myisam被innodb打败&#xff0c;从此innodb成为了mysql中的默认存储引擎。所以在网上查找的事务隔离级别基本上都是innodb的。并且支持事务…

JavaScript基础10——获取数据类型、类型转换

哈喽&#xff0c;大家好&#xff0c;我是雷工。 现如今知识大爆炸&#xff0c;到处都有海量的知识&#xff0c;常常见了就收藏&#xff0c;把网盘塞得满满的&#xff0c;却从来没有看过。 收藏起来装到网盘里并没有什么软用&#xff0c;要把知识装到脑袋里才行。 从几分钟开始&…

【LeetCode-中等题】26. 删除有序数组中的重复项

文章目录 题目方法一&#xff1a;快慢指针 题目 方法一&#xff1a;快慢指针 class Solution { //快慢指针public int removeDuplicates(int[] nums) {int fast 1;int slow 0;while(fast < nums.length){if(nums[fast] nums[fast-1]) fast;//若当前元素和之前元素相同 则…

华为OD机试 - 战场索敌 - 深度优先搜索dfs算法(Java 2023 B卷 100分)

目录 一、题目描述二、输入描述三、输出描述四、深度优先搜索dfs五、解题思路六、Java算法源码七、效果展示1、输入2、输出3、说明4、如果增加目标敌人数量K为55、来&#xff0c;上强度 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 一、题目描述 有一个大小是N*M…

ros_launch配置

创建launch文件批运行节点和包 将以下四条指令写入launch文件中 获取软件包的完整指令 rospackpkg&#xff1a;软件包名字 type&#xff1a;节点名字 四条指令转化成launch文件

无人机航线规划

无人机航线规划&#xff0c;对于无人机的任务执行有着至关重要的作用&#xff0c;无人机在从起点飞向目的点的过程中&#xff0c;如何规划出一条安全路径&#xff0c;并且保证该路径代价最优&#xff0c;是无人机航线规划的主要目的。其中路径最优的含义是&#xff0c;在无人机…

大数据-玩转数据-Flink 容错机制

一、概述 在分布式架构中&#xff0c;当某个节点出现故障&#xff0c;其他节点基本不受影响。在 Flink 中&#xff0c;有一套完整的容错机制&#xff0c;最重要就是检查点&#xff08;checkpoint&#xff09;。 二、检查点&#xff08;Checkpoint&#xff09; 在流处理中&am…