前端-js例子:todolist

news2024/12/31 7:24:21

实现效果图:

 


实现步骤:

1.body部分

        1.首先,设置输入数据的框和按钮进行操作

        2.设置一个表格标签(有边框),首先在表头放置两列(“事项”‘’操作)

<body>
    <div class="container">
        <div class="addBox">
            <input type="text" class="info">
            <input type="button" value="add" class="btn">
        </div>
        <table border="1">
            <thead>
                <tr>
                    <th>事项</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tbody>
                <!-- <tr>
                    <td>晚上上课</td>
                    <td>
                        <input type="button" value="mark">
                        <input type="button" value="update">
                        <input type="button" value="delete">
                    </td>
                </tr>
                <tr>
                    <td>晚上上课</td>
                    <td>
                        <input type="button" value="mark">
                        <input type="button" value="update">
                        <input type="button" value="delete">
                    </td>
                </tr>
                <tr>
                    <td>晚上上课</td>
                    <td>
                        <input type="button" value="mark">
                        <input type="button" value="update">
                        <input type="button" value="delete">
                    </td>
                </tr> -->
            </tbody>
        </table>
    </div>
</body>

2.css样式设置

1. 先设置外边框
*{
            padding: 0;
            margin: 0;
        }
2.设置元素的位置
.container{
            width: 19%;
            min-width: 200px;
            /* background-color: aqua; */
            margin: 150px auto;
        }
3.输入框实现横向布局
.container .addBox{
            display: flex;

        }
4.设置输入框输入内容部分
.container .addBox .info{
            width: 88%;
            border: 1px solid lightcoral;
            padding: 5px;
            /* 外轮廓去掉 */
            outline: none;
            border-radius: 5px 0 0 5px;
        }
5.输入框按钮设置
.container .addBox .btn{
            width: 12%;
            border: none;
            color: #fff;
            background-color:  lightcoral;
            padding: 5px;
            cursor: pointer;
            border-radius: 0 5px 5px 0;
        }

鼠标悬停时按钮颜色变浅

.container .addBox .btn:hover{
            opacity: 0.9;
        }
6.下面表格设置
table{
            margin-top: 10px;
            width: 100%;
            /* 共用一个边框 */
            border-collapse: collapse;
        }

表头设置

table thead tr{
            background-color: lightcoral;
            color: #fff;

        }
        table thead tr th{
            padding: 3px;
            font-size: 13px;
        }

表格主体部分设置

        每行颜色交错,方便观看

table tbody tr:nth-child(odd){
            background-color: antiquewhite;
        }
        table tbody tr:nth-child(even){
            background-color: #fff;
        }

        每行每个单元格的设置

table tbody tr td{
            font-size: 13px;
            padding: 5px;
            text-align: center;
        }
        table tbody tr td input{
            background:none;
            border: rgb(158, 29, 29) 1px solid;
            padding: 4px;
            color: rgb(158, 29, 29);
            border-radius: 4px;
            cursor: pointer;
        }
        table tbody tr td input:hover{
            box-shadow: 2px 2px 2px rgb(158, 29, 29);
        }
        table tbody tr td,
        table thead tr th {
            border-color: #fff;
        }

3.js变换

1.先获取元素
var btn= document.querySelector(".btn")
            var info=document.querySelector(".info")
            var tbody=document.querySelector("tbody")
2.找到要修改的行
            var updateIndex
3.表格行的起始位置值
            var rowIndex=0
4.给add按钮绑定事件
1.修改

4.1.1找到表格所有的行

4.1.2找到要修改的行(回显)

        如果表格不为空,把输入框里的值传进要修改的行里

        清空输入框里的值

        按钮改为“添加”

4.1.3结束

if(updateIndex){
                    // 修改
                    var trs=document.querySelectorAll("table tbody tr")
                    console.log(trs)
                    for(var l=0;l<trs.length;l++){
                        if(trs[l].getAttribute("index")==updateIndex){
                            if(info.value.trim()){
                                trs[l].firstElementChild.innerText=info.value
                                info.value=""
                                btn.value="add"
                                updateIndex=undefined

                            }else{
                                alert("不能为空")
                            }
                        }
                    }
                    return
                }
// 回显
                    var updates=document.querySelectorAll(".update")
                    for(var i=0;i<updates.length;i++){
                        updates[i].onclick=function(){
                            var target=this.parentElement.previousElementSibling
                            if(target.style.textDecoration==""){
                                info.value=target.innerText
                                btn.value="update"
                                updateIndex=this.parentElement.parentElement.getAttribute("index")

                            }else{
                                alert("事情已经完成啦")
                            }

                        }
                    }

 

2.添加

4.2.1创建一行元素

4.2.2将输入框的值赋给新添加的元素

4.2.3清空输入框的值

 if(info.value.trim()){
                    // 添加
                // 创建一行元素
                var tr=document.createElement("tr")
                var td_one=document.createElement("td")
                var td_two=document.createElement("td")

                // 获取输入框的值,并赋值给第一个td
                td_one.innerText=info.value

                // 第二个td
                td_two.innerHTML='<input type="button" value="mark" class="mark"><input type="button" value="update" class="update"><input type="button" value="delete" class="delete">'

                // 将td放入tr中
                tr.appendChild(td_one)
                tr.appendChild(td_two)
                // 设置属性
                tr.setAttribute("index",rowIndex)
                rowIndex++

                // 将tr放入tbody中
                tbody.appendChild(tr)
                // console.log(tr)
                // console.log(td_one)
                // console.log(td_two)

                // 清空输入框的值
                info.value=""

 

3.标记

4.3.1 找到所有的mark

4.3.2 找到点击的那一行

4.3.3对应前面的值

4.3.4 划线

 //生成之后找mark画中划线,标记
                var marks=document.querySelectorAll(".mark")
                // console.log(marks)
                    for(var i=0;i<marks.length;i++){
                        marks[i].onclick=function(){
                            var target=this.parentElement.previousElementSibling
                            if(target.style.textDecoration==""){
                                target.style.textDecoration="line-through"
                                target.style.color="#888"
                            }else{
                            target.style.textDecoration=""
                            target.style.color="#000"
                            }
                        
                        }
                    }

 

4.删除

4.4.1 找到所有删除行

4.4.2 找到点击的那一行

4.4.3 如果划线,进行删除(确认)

 var deletes=document.querySelectorAll(".delete")
                    console.log(deletes)
                    for(var j=0;j<deletes.length;j++){
                        deletes[j].onclick=function(){

                            var target=this.parentElement.parentElement
                            // this表示当前点击的这个元素
                            if(this.parentElement.previousElementSibling.style.textDecoration=="line-through"){
                                if(confirm("确认要删除吗?")){
                                    target.parentElement.removeChild(target)
                                }else{
                                    alert("感谢手下留情")
                                }
                            }else{
                                alert("努力完成,不要半途而废")
                            }
                            
                        }
                    }

 

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

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

相关文章

初学者怎么入门大语言模型(LLM)?看完这篇你就懂了!

当前2024年&#xff0c;LLM领域发展日新月异&#xff0c;很多新的实用技术层出不穷&#xff0c;个人认为要跟上LLM的发展&#xff0c;需要掌握以下内容&#xff0c;并需要不断地跟踪学习。 入门LLM前置基础 深度学习基础知识&#xff1a;推荐李宏毅的深度学习课程Python和num…

数据结构2——单链表

目录 1.链表 1.1链表的概念及结构 1.2 链表的分类 ​编辑2.无头单链表的实现 1. 节点 2.遍历链表 3.动态增加新节点 4.查找&#xff08;修改&#xff09; 5.插入 5.1 尾插 5.2 头插 5.3 在pos之前插入x 5.4 在pos之后插入x 6.删除 6.1 尾删 6.2 头删 6.3 删除…

DPDK 简易应用开发之路 4:基于Pipeline模型的DNS服务器

本机环境为 Ubuntu20.04 &#xff0c;dpdk-stable-20.11.10 使用scapy和wireshark发包抓包分析结果 完整代码见&#xff1a;github Pipeline模型 DPDK Pipeline模型是基于Data Plane Development Kit&#xff08;DPDK&#xff09;的高性能数据包处理框架。它通过将数据流分为多…

基于SpringBoot+Vue+MySQL的旅游推荐管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着社会的快速发展和人民生活水平的显著提高&#xff0c;旅游已成为人们休闲娱乐的重要方式。然而&#xff0c;面对海量的旅游信息和多样化的旅游需求&#xff0c;如何高效地管理和推荐旅游资源成为了一个亟待解决的问题。因此…

学习记录:js算法(四十三):翻转二叉树

文章目录 翻转二叉树我的思路网上思路递归栈 总结 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点 图一&#xff1a; 图二&#xff1a; 示例 1&#xff1a;&#xff08;如图一&#xff09; 输入&#xff1a;root [4,2,7,1…

大模型价格战,打到了负毛利,卷or不卷?

国产大模型淘汰赛在加速。这轮淘汰赛会持续一两年&#xff0c;只有少数真正具备实力的基础模型企业能继续活下去 中国市场的大模型价格战已经打了近半年。这轮价格战已经打到了负毛利&#xff0c;而且暂时没有停止迹象。头部云厂商仍在酝酿新一轮降价。这轮降价会在今年9月下旬…

视频单目标跟踪研究

由于对视频单目标跟踪并不是很熟悉&#xff0c;所以首先得对该领域有个大致的了解。 视频目标跟踪是计算机视觉领域重要的基础性研究问题之一&#xff0c;是指在视频序列第一帧指定目标 后&#xff0c;在后续帧持续跟踪目标&#xff0c;即利用边界框&#xff08;通常用矩形框表…

printf 命令:格式化输出

一、命令简介 ​printf​ 命令在 Linux 系统中用于格式化并打印字符串到标准输出。它是 C 语言中 printf ​函数的命令行版本&#xff0c;因此其格式化选项与 C 语言中的非常相似。 相关命令&#xff1a; echo&#xff1a;通常使用 echo&#xff0c;它比较简单。printf&…

你们用过微信CRM管理系统吗?

微信CRM管理系统是近年来流行的管理软件&#xff0c;在市场上得到了很高的认可。许多企业正在应用微信CRM管理系统&#xff0c;那系统具体有些什么功能呢&#xff1f; 1、聚合聊天&#xff0c;可以管理多个微信号 2、批量多号自动加好友任务&#xff0c;设置好时间间隔以及加人…

《论软件系统架构风格》写作框架,软考高级系统架构设计师

论文真题 系统架构风格&#xff08;System Architecture Style&#xff09;是描述某一特定应用领域中系统组织方式的惯用模式。架构风格定义了一个词汇表和一组约束&#xff0c;词汇表中包含一些构件和连接件类型&#xff0c;而这组约束指出系统是如何将这些构件和连接件组合起…

李沐对大模型趋势的几点判断,小模型爆发了!

李沐是上海交通大学 2011 届计算机科学与工程系本硕系友。他曾担任亚马逊资深首席科学家&#xff0c;加州大学伯克利分校和斯坦福大学的访问助理教授&#xff0c;是前 Marianas Labs 联合创始人&#xff0c;深度学习框架 Apache MXNet 的创始人之一。目前是 BosonAI 联合创始人…

C++之STL—string容器

本质&#xff1a;类 class 封装了很多方法&#xff1a;查找find&#xff0c;拷贝copy&#xff0c;删除delete 替换replace&#xff0c;插入insert 构造函数 赋值操作 assign&#xff1a; 字符串拼接 &#xff0b; append&#xff1a; string查找和替换 没查找到&#xff0c;po…

【刷题2—滑动窗口】最大连续1的个数lll、将x减到0的最小操作数

目录 一、最大连续1的个数lll二、将x减到0的最小操作数 一、最大连续1的个数lll 题目&#xff1a; 思路&#xff1a; 问题转换为&#xff1a;找到一个最长子数组&#xff0c;这个数组里面0的个数不能超过k个 定义一个变量count&#xff0c;来记录0的个数&#xff0c;进窗口、…

时序预测 | Python实现KAN+LSTM时间序列预测

时序预测 | Python实现KAN+LSTM时间序列预测 目录 时序预测 | Python实现KAN+LSTM时间序列预测预测效果基本介绍程序设计预测效果 基本介绍 时序预测 | KAN+LSTM时间序列预测(Python) KAN作为这两年最新提出的机制,目前很少人用,很适合作为时间序列预测的创新点,可以结合…

【重学 MySQL】三十八、group by的使用

【重学 MySQL】三十八、group by的使用 基本语法示例示例 1: 计算每个部门的员工数示例 2: 计算每个部门的平均工资示例 3: 结合 WHERE 子句 WITH ROLLUP基本用法示例注意事项 注意事项 GROUP BY 是 SQL 中一个非常重要的子句&#xff0c;它通常与聚合函数&#xff08;如 COUNT…

MySQL和SQL的区别简单了解和分析使用以及个人总结

MySQL的基本了解 运行环境&#xff0c;这是一种后台运行的服务&#xff0c;想要使用必须打开后台服务&#xff0c;这个后台服务启动的名字是在安装中定义的如下图&#xff08;个人定义MySQL88&#xff09;区分大小写图片来源 可以使用命令net start/stop 服务名&#xff0c;开…

实验十八:IIC-EEPROM实验

这个实验比较复杂,是目前第一个多文件项目 KEY1-4:P3^0-P3^3 IIC_SCL=P2^1; IIC_SDA=P2^0; //定义数码管位选信号控制脚 LSA=P2^2; LSB=P2^3; LSC=P2^4; 代码 main.c #include "public.h" #in

常见汽车零部件ASIL等级示例

ASIL&#xff08;Automotive Safety Integrity Level&#xff0c;汽车安全完整性等级&#xff09;评级系统是ISO 26262标准中定义的一套风险分类体系&#xff0c;用于评估道路车辆中电子电气系统&#xff08;E/E系统&#xff09;功能安全的风险程度&#xff0c;并确保这些系统在…

Linux相关概念和重要知识点(6)(make、makefile、gdb)

1.make、makefile &#xff08;1&#xff09;什么是make、makefile&#xff1f; 在我们写完代码后&#xff0c;要编译运行&#xff0c;如果有多个.c文件就需要每次都自己用gcc -o来处理&#xff0c;这十分麻烦。当我们想要自定义多个文件的处理时&#xff0c;我们会浪费很多时…

MatrixOne助力一道创新打造高性能智能制造AIOT系统

客户简介 深圳一道创新&#xff08;ETAO Innovation&#xff09;成立于2012年&#xff0c;是一家创新型软件及信息技术服务商&#xff0c;致力于制造戏份行业—电子制造业的数字转型服务&#xff0c;构建万物互联的智能工程。一道创新致力于把先进的软件系统、数字平台、人工智…