前端——JavaScript练习 做一个todoList

用前端制作一个todoList的表格,实现更新、删除、修改等功能。

涉及几个知识点:

  • 设置最小高度(宽度):
.container{min-width: 350px;/* 最小宽度 最小不会小于210px */        
}
  •  去掉外轮廓
 outline: none;
  • 去除字符串两端的空白字符(包括空格、制表符、换行符等)
info.value.trim()
  •   previousElementSibling 属性返回指定元素的前一个兄弟元素(相同节点树层中的前一个元素节点)
var target=this.parentElement.previousElementSibling
  •   confirm 询问
                            
    if(confirm("是否删除该事件?")){target.parentElement.removeChild(target)
    }

    最终结果显示:

全部代码如下: 

<!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>*{padding: 0;margin: 0;}.container{width: 10%;min-width: 350px;/* 最小宽度 最小不会小于210px *//* background: blanchedalmond; */margin: 150px auto;}.container .addBox{display: flex;}.container .addBox .info{width: 80%;border: 2px solid burlywood;outline: none;/* 去掉外轮廓 */padding: 5px;cursor: pointer;border-radius: 10%;}.container .addBox .botton{width: 15%;background: rgb(157, 110, 202);color: #ffffff;padding: 5px;border-radius: 10px;}.container .addBox .botton:hover{opacity:0.8;}table{margin-top: 15px;width: 100%;border-collapse: collapse;}table thead tr{font-size: 15px;padding: 5px;background:rgb(155, 69, 192) ;color: #ffffff;}table tbody tr:nth-child(odd){background: rgb(212, 174, 198);}table tbody tr:nth-child(even){background: rgb(208, 174, 220);}table tbody tr td{padding: 5px;font-size: 15px;text-align: center;}table tbody tr td input{background: none;border: rgb(155, 69, 192) 3px solid;color: rgb(255, 255, 255);border-radius: 3px;cursor: pointer;}table tbody tr td input:hover{box-shadow: 1px 2px 1px rgb(233, 230, 216);}/* table thead tr td{text-decoration: line-through;} */</style><script>window.onload=function(){// 获取元素var botton= document.querySelector(".botton")var info= document.querySelector(".info")var tbody=document.querySelector("tbody")// 表格行的起始位置值是0var rowindex=0// 当前要修改的行的值var updateIndex// 给add按钮绑定事件botton.onclick=function(){if(updateIndex){// 修改var trs=document.querySelectorAll("table tbody tr")for(var l=0;l<trs.length;l++){if(trs[l].getAttribute("index")==updateIndex){if(info.value){trs[l].firstElementChild.innerText=info.valueinfo.value=""botton.value="add"updateIndex=undefined}else{alert("不能为空")}}}return}// console.log(info.value)if(info.value.trim()){// trim()消除值前没有用的空格// 添加//创建元素 document.createElement("标签名称")var tr=document.createElement("tr")var td_one=document.createElement("td")var td_two=document.createElement("td")// 获取输入框中的值,innerText内部文字td_one.innerText=info.value// innerHTML内部结构td_two.innerHTML='<input type="button" value="mark" class="mark"><input type="button" value="update" class="update"><input type="button" value="delete" class="del">'//td放入tr中  appendChild(元素)tr.appendChild(td_one)tr.appendChild(td_two)// 设置indextr.setAttribute("index",rowindex)rowindex++//tr放入tbody中tbody.appendChild(tr)// 清空输入框的值 给info.value赋值info.value=" "// 删除var dels=document.querySelectorAll(".del")for(j=0;j<dels.length;j++){dels[j].onclick=function(){var target=this.parentElement.parentElementif(this.parentElement.previousElementSibling.style.textDecoration=="line-through"){if(confirm("是否删除该事件?")){target.parentElement.removeChild(target)// confirm 询问}else{alert("删除已取消!")}}else{alert("坚持完成,不要半途而废")}}}// 中划线var marks=document.querySelectorAll(".mark")for(var i=0;i<marks.length;i++){marks[i].onclick=function(){var target=this.parentElement.previousElementSibling// previousElementSibling 属性返回指定元素的前一个兄弟元素(相同节点树层中的前一个元素节点)if(target.style.textDecoration==""){target.style.textDecoration="line-through"target.style.color="#888"}else{target.style.textDecoration=""target.style.color="#000"}}}// 回显var updates=document.querySelectorAll(".update")for(k=0;k<updates.length;k++){updates[k].onclick=function(){var target=this.parentElement.previousElementSiblingif(target.style.textDecoration==""){info.value=target.innerTextbotton.value="update"updateIndex=this.parentElement.parentElement.getAttribute("index")}else{alert("事件已经完成了")}}}}}}</script>
</head>
<body><div class="container"><div class="addBox"><input type="text" class="info"><input type="button" value="add" class="botton"></div><table border="1"><thead><tr><th>事项</th><th>操作</th></tr></thead></table></div></body>
</html>

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

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

相关文章

寄存器与内存

第三课&#xff1a;寄存器与内存、中央处理器&#xff08;CPU&#xff09;、指令和程序及高级 CPU 设计-CSDN博客 锁存器 引入 ABO0&#xff08;开始状态&#xff09;001&#xff08;将A置1&#xff09;110&#xff08;将A置0&#xff09;11 无论怎么做&#xff0c;都没法从1变…

深度学习(一):神经网络入门

文章目录 一、神经网络1.1神经元结构1.2单层神经网络&#xff1a;单层感知机1.3两层神经网络&#xff1a;多层感知机1.4多层神经网络 二、全连接神经网络2.1基本结构2.2激活函数、前向传播、反向传播、损失函数2.2.1激活函数的意义2.2.2前向传播2.2.3损失函数、反向传播2.2.4梯…

uniapp小程序持续获取用户位置信息,后台位置获取

做一个小程序持续获取用户位置信息的功能&#xff0c;即使小程序切换到后台也能继续获取&#xff0c;getLocation这个api只有小程序在前台才能获取位置&#xff0c;所以不用这个 先申请一个腾讯地图key 在uniapp项目配置源码视图里加上这个代码 先获取权限&#xff0c;再开启…

NtripShare测量机器人自动化监测系统测站更换仪器后重新设站

NtripShare测量机器人自动化监测系统投入商业运营已经很久了&#xff0c;在MosBox与自动优化网平差技术的加持下&#xff0c;精度并不让人担心&#xff0c;最近基于客户需求处理了两个比较大的问题。 1、增加对反射片和免棱镜的支持。 2、进一步优化测站更换仪器或重新整平后重…

批量归一化与层归一化的区别

batch-normalization是根据每一列的特征进行批量归一化&#xff0c;把一个batch&#xff08;N张图片&#xff09;中同一通道的特征(w*h的特征图)&#xff0c;将其标准化。可以理解为对batch中的所有图的每一层像素(也就是不同的通道)进行标准化。通常在图像领域用的多&#xff…

【报告阅读】chatgpt-o1 技术报告阅读 | 新的迭代开始了~

OpenAI o1是通过强化学习去进行复杂推理&#xff0c;在它回答之前&#xff0c;他会经过复杂的内部思维链的思考。 经过强化训练的o1多强 1 表现 在美国数学奥林匹克预选赛中名列前500名的学生中&#xff0c;o1排89名 在物理、生物、化学问题的基准测试中超过人类博士水平 其…

(done) 声音信号处理基础知识(6) (How to Extract Audio Features)

参考&#xff1a;https://www.youtube.com/watch?v8A-W1xk7qs8&t2s 先复习之前分类的声学特征 时域特征流水线 如下是 441Khz 下一个采样点播放的时间。这比人类耳朵分辨率(10ms)还低。 所以&#xff0c;把多个采样点组合成一个 frame 的原因有&#xff0c;这是一个人…

布草洗涤必备4张表-———未来之窗行业应用跨平台架构

一、洗涤厂客户月度报表 二、大酒店楼层布草月度统计报表 三、职员月度报表 四、司机当日统计报表 五、阿雪技术观 拥抱开源与共享&#xff0c;见证科技进步奇迹&#xff0c;畅享人类幸福时光&#xff01; 让我们积极投身于技术共享的浪潮中&#xff0c;不仅仅是作为受益者&a…

Docker实践——天池篇

参考零基础入门Docker-cuda练习场_学习赛_天池大赛-阿里云天池的赛制 (aliyun.com) ​ 在Docker零基础入门-CSDN博客中我已经安装了docker,现在开始创建自己的镜像仓库。 1. 开通阿里云容器镜像服务(镜像仓库) 进入容器镜像服务 (aliyun.com) 1.1. 创建个人实例 点击“…

Elasticsearch导出导入数据

1.概念回顾 2.基础操作 展示详细信息 GET&#xff1a;http://127.0.0.1:9200/_cat/indices?v Java代码将文件导入到ES package com.Graph.medicalgraph;import org.apache.http.HttpHost; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.act…

17_Python的生成器

生成器&#xff08;Generator&#xff09; 生成器&#xff08;Generator&#xff09;是Python中一种特殊的迭代器&#xff0c;它允许你在需要时才计算和产生值&#xff0c;而不是一次性生成整个序列。生成器使用yield语句来逐个产生值&#xff0c;而不是像迭代器那样实现__ite…

全球贸易中的关键标识符:DUNS、GLN及其他ID在EDI中的应用

在电子数据交换&#xff08;EDI&#xff09;中&#xff0c;识别交易伙伴的唯一标识符对于确保数据准确传输和处理至关重要。不同的企业标识符在EDI的不同场景中发挥着重要作用&#xff0c;其中最常见的包括DUNS&#xff08;数据通用编号系统&#xff09;、GLN&#xff08;全球位…

【Java笔记】第12章:常用类

1. Object类2. 包装类3. String类 上期回顾:【Java笔记】第11章&#xff1a;内部类 个人主页&#xff1a;C_GUIQU 归属专栏&#xff1a;【Java学习】 1. Object类 Object&#xff1a;位于java.lang包中&#xff0c;是所有类的父类&#xff08;直接父类/间接父类&#xff09;。…

移动硬盘‘需格式化‘困境:原因剖析、恢复策略与预防之道

困境直击&#xff1a;移动硬盘为何需格式化才能访问&#xff1f; 在数字化时代&#xff0c;移动硬盘作为数据存储与传输的重要工具&#xff0c;其稳定性与可靠性直接关系到用户数据的安全。然而&#xff0c;不少用户在使用过程中遭遇了“移动硬盘需要格式化才能打开”的尴尬境…

【Linux】进程概念-1

文章目录 1.本节重点2. 冯诺依曼体系结构3.操作系统&#xff08;Operator System&#xff09;3.1 概念3.2 设计OS的目的3.3 定位3.4 如何理解“管理”3.5 总结3.6 系统调用和库函数概念3.7 承上启下 4. 进程4.1 基本概念4.2 描述进程——PCB4.3 通过系统调用获取进程标示符4.4 …

C语言实现常见的数据结构

栈 栈是一种后进先出&#xff08;LIFO, Last In First Out&#xff09;的数据结构 #include <stdio.h> #include <stdlib.h>#define MAX 100typedef struct {int data[MAX];int top; } Stack;// 初始化栈 void init(Stack *s) {s->top -1; }// 判断栈是否为空…

黄酮类化合物及其衍生物生物合成的进展:构建酵母细胞工厂的系统策略-文献精读50

Advances in Flavonoid and Derivative Biosynthesis: Systematic Strategies for the Construction of Yeast Cell FactoriesCli 黄酮类化合物及其衍生物生物合成的进展&#xff1a;构建酵母细胞工厂的系统策略 摘要 黄酮类化合物是一类重要的天然多酚化合物&#xff0c;具有…

240922-MacOS终端访问硬盘

A. 最终效果 B. 操作步骤 在macOS中&#xff0c;可以通过命令行使用Terminal访问硬盘的不同位置。你可以按照以下步骤操作&#xff1a; 打开终端&#xff08;Terminal&#xff09;&#xff1a; 在应用程序中打开终端&#xff0c;或者使用 Spotlight 搜索“Terminal”来启动。 …

EnvironmentError: [Errno 28] No space left on device - 完美解决方法

&#x1f6a8;EnvironmentError: [Errno 28] No space left on device - 完美解决方法&#x1f4a1; &#x1f6a8;EnvironmentError: [Errno 28] No space left on device - 完美解决方法&#x1f4a1;摘要引言正文1. 错误解析&#xff1a;为什么会出现“No space left on dev…

线程池执行流程以及拒绝策略小结

线程池是一个用来创建、管理线程的工具&#xff0c;线程池内部维护了若干个线程&#xff0c;没有任务的时候&#xff0c;这些线程都处于等待空闲状态。如果有新的线程任务&#xff0c;就分配一个空闲线程执行。如果所有线程都处于忙碌状态&#xff0c;线程池会创建一个新线程进…