使用原生js实现todolist增删改查,弹框复用

手写弹框样式+模块化拆分,实现复用弹框(弹框可随机变换颜色)
首先需要在github上将require.js文件复制到本地:
requirejs/require.js at master · requirejs/requirejs (github.com)

我写的是todolist小案例,最终的效果

文件结构如下:

下面为详细代码:
1.index.html文件:
<!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>
    //css样式,方法一:使用link将css文件引入
    <!-- <link rel="stylesheet" href="./css/index.css"> -->
    //我这里使用了方法二,直接在style标签内引入,两种方法都可以
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .container {
            width: 630px;
            margin: 30px auto;
        }
        .top {
            margin-bottom: 18px;
        }

        table {
            border-collapse: collapse;
        }

        table tr {
            height: 40px;
            text-align: center;
            border-bottom: 1px dashed #767676;
        }

        table td {
            border-bottom: 1px dashed #767676;
        }
    </style>
</head>

<body>
    //页面结构不多说,相信大家都能看懂
    <div class="container">
        <div class="top">
            <button class="add">添加信息</button>
        </div>
        <div class="main">
            <table width="639px" cellspacing="0">
                <thead>
                    <tr>
                        <th>姓名</th>
                        <th>班级</th>
                        <th>年龄</th>
                        <th>操作</th>
                    </tr>
                </thead>
                <tbody class="tb">
                    <!-- <tr>
                        <td>春娇</td>
                        <td>一年二班</td>
                        <td>19</td>
                        <td>
                            <button class="catch">查看</button>
                            <button class="update">修改</button>
                            <button class="del">删除</button>
                        </td>
                    </tr> -->
                </tbody>
            </table>
        </div>
    </div>
    //src里面将github上的require.js引入,在data-main中将自己写的主文件模块引入
    <script src="./js/libs/require.js" data-main="./js/modules/main.js"></script>
</body>

</html>
2.在data.js文件中构建列表初始数据
define([],function(){
    var arr=[
        {
            id:0,
            name:'李雷',
            class:'11',
            age:26,
        },
        {
            id:1,
            name:'赵玉',
            class:'22',
            age:25,
        },
        {
            id:2,
            name:'小蓝',
            class:'33',
            age:18,
        },
        {
            id:3,
            name:'小明',
            class:'44',
            age:22,
        },
    ];
    return arr;
})
3.在render.js中渲染数据
define([],function(){
    //导出一个render函数,接受了两个参数,data是上面创建的初始数据,parentNode是父节点
    return function render(data,parentNode){
        //渲染表格
        var html='';
        for(var i=0;i<data.length;i++){
            html+=`
            <tr>
                <td>${data[i].name}</td>
                <td>${data[i].class}</td>
                <td>${data[i].age}</td>
                <td>
                    <button class="catch" data-id='${data[i].id}'>查看</button>
                    <button class="update" data-id='${data[i].id}'>修改</button>
                    <button class="del" data-id='${data[i].id}'>删除</button>
                </td>
            </tr>
            
            `;
        }
        //将渲染好的表格模版赋值给传进来的父节点parentNode
        parentNode.innerHTML=html;
    }
})
4.因为会涉及到点击事件,所以在ele.js中导出获取单个元素和多个元素的逻辑
define([],function(){
    return{
        //单个元素
        $:function $(s){
            return document.querySelector(s);
        },
        //多个元素
        $$:function $$(s){
            return document.querySelectorAll(s);
        }
    }
})
5.在myAlert.js文件中编写弹框逻辑
define([], function () {
    return function myAlert(options) {
        options = options || {};
        //对象
        var obj = {
            title: '标题信息',
            content: '提示内容',
            sureText: '确定',
            cancText: '取消',
            // alert是一个按钮 !alert是两个按钮的提示
            type: '!alert',
            // 点击确定按钮的回调函数
            okFun: function () {
                return true;
            },
            //点击取消按钮的回调函数
            canFun: function () {
                return true;
            }
        }
        //合并对象参数配置
        var newObj = Object.assign(obj, options);
        console.log(newObj)
        //动态创建弹窗的结构
        var mask = document.createElement('div');
        mask.className = 'mask';
        mask.innerHTML = `
        <div class="alert">
            <div class="title">${newObj.title}</div>
            <div class="content">${newObj.content}</div>
            <div class='footer'>
                <button class="sure">${newObj.sureText}</button>
                ${newObj.type === 'alert' ? '' : `<button class="cancle">${newObj.cancText}</button>`
            }
            </div>
        </div>
        `;
        document.body.appendChild(mask);

        //动态创建随机颜色
        var color = '#' + Math.random().toString(16).slice(2, 8);

        //动态穿件弹框的样式
        var style = document.createElement('style');
        style.innerHTML = `
        *{
            margin: 0;
            padding: 0;
        }
        .mask{
            width: 100%;
            height: 100%;
            background-color: rgba(0,0,0,0.5);
            position: relative;
            top: 0;
            left: 0;
        }
        
        .alert{
            width: 500px;
            height: 300px;
            background-color: #fff;
            position: absolute;
            top: 50%;
            left: 50%;
            margin-left: -250px;
            margin-top: -150px;
        }
        
        .title{
            height: 30px;
            line-height: 30px;
            background-color: ${color};
        }
        
        .content{
            height: 240px;
            padding-left: 10px;
            padding-top: 10px;
            box-sizing: border-box;
        }
        
        .footer{
            height:30px;
            line-height: 30px;
            text-align: center;
            background-color: ${color};
        }
        `;
        document.head.appendChild(style);

        //点击确定和取消按钮的逻辑处理
        mask.querySelector('.sure').onclick = function () {
            if (newObj.okFun()) {
                // 删除弹窗
                mask.remove();
            }
        }
        if (newObj.type !== 'alert') {
            mask.querySelector('.cancle').onclick = function () {
                if (newObj.canFun()) {
                    // 删除弹窗
                    mask.remove();
                }
            }
        }
    }
})
6.最后在main.js文件中将上面的文件全部引入
//保存路径
require.config({
    paths: {
        data: './data',
        ele: './ele',
        render: './render',
        myAlert: './myAlert',
    },
})

//导入并使用模块 data ele render  myAlert
require(['data', 'ele', 'render', 'myAlert'], function (data, ele, render, myAlert) {
    //调用render函数渲染页面数据
    render(data, ele.$('.tb'));

    //添加功能
    ele.$('.add').onclick = function () {
        myAlert({
            title: '添加信息',
            content: `
                <div>
                    <label for=''>姓名</label>
                    <input type='text' class='myname'>
                </div>
                <div>
                    <label for=''>班级</label>
                    <input type='text' class='myclass'>
                </div>
                <div>
                    <label for=''>年龄</label>
                    <input type='text' class='myage'>
                </div>
            `,
            okFun: function () {
                //获取三个文本框的值
                var myname = ele.$('.myname').value;
                var myclass = ele.$('.myclass').value;
                var myage = ele.$('.myage').value;
                if (myname === '') {
                    myAlert({
                        content: '姓名不能为空',
                    })
                } else if (myclass === '') {
                    myAlert({
                        content: '班级不能为空',
                    })
                } else if (myage === '') {
                    myAlert({
                        content: '年龄不能为空'
                    })
                } else {
                    //重新创建一个新对象,添加到数据模块中去
                    var obj = {
                        id: data.length,
                        name: myname,
                        class: myclass,
                        age: myage,
                    }
                    data.push(obj);
                    render(data, ele.$('.tb'));
                    return true;
                }
            }
        })
    }

    //实现查看 修改和删除 思路:都通过事件委托的方式给父元素绑定单击事件
    // 事件源是哪个元素在做具体的处理
    ele.$('.tb').onclick = function (e) {
        var e = e || window.event;
        var t = e.target || e.srcElement;
        if (t.nodeName === 'BUTTON') {
            var id = t.getAttribute('data-id') * 1;
            var n;//声明一个变量n 保存当前的id值
            for (var i = 0; i < data.length; i++) {
                if (data[i].id === id) {
                    n = i;
                }
            }
            if (t.className === 'catch') {
                myAlert({
                    title: '查看信息',
                    content: `姓名:${data[n].name} 班级:${data[n].class} 年龄:${data[n].age}`
                })
            } else if (t.className === 'del') {
                myAlert({
                    title: '删除信息',
                    content: '你确定要删除当前项吗?',
                    okFun: function () {
                        data.splice(n, 1)
                        render(data, ele.$('.tb'));
                        return true;
                    }
                })
            } else if (t.className === 'update') {
                myAlert({
                    title: '修改信息',
                    content: `
                    <div>
                        <label for=''>姓名</label>
                        <input type='text' class='newname' value='${data[n].name}'>
                    </div>
                    <div>
                        <label for=''>班级</label>
                        <input type='text' class='newclass' value='${data[n].class}'>
                    </div>
                    <div>
                        <label for=''>年龄</label>
                        <input type='text' class='newage' value='${data[n].age}'>
                    </div>
                    `,
                    okFun: function (){
                        //获取三个文本框的值
                        var newname = ele.$('.newname').value;
                        var newclass = ele.$('.newclass').value;
                        var newage = ele.$('.newage').value;
                        if (newname === '') {
                            myAlert({
                                content: '姓名不能为空',
                            })
                        } else if (newclass === '') {
                            myAlert({
                                content: '班级不能为空',
                            })
                        } else if (newage === '') {
                            myAlert({
                                content: '年龄不能为空'
                            })
                        } else {
                            //把当前操作的对象的字段替换成新数据
                            data[n] = {
                                id: data[n].id,
                                name: newname,
                                class: newclass,
                                age: newage
                            }
                            render(data, ele.$('.tb'));
                            return true;
                        }
                    }
                })
            }

        }
    }
})

通过以上代码,即可实现todolist的增删改查功能,包括手动编写了一个弹框,可以自动改变弹框颜色的效果。

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的待办事项系统的增删功能实现代码的 Java 版本: ```java import java.util.ArrayList; import java.util.Scanner; public class TodoList { private ArrayList<String> todoList; public TodoList() { todoList = new ArrayList<String>(); } public void addTodoItem(String item) { todoList.add(item); } public void deleteTodoItem(int index) { todoList.remove(index); } public void editTodoItem(int index, String newItem) { todoList.set(index, newItem); } public void printTodoList() { System.out.println("当前待办事项:"); for (int i = 0; i < todoList.size(); i++) { System.out.println((i+1) + ". " + todoList.get(i)); } System.out.println(); } public static void main(String[] args) { TodoList todoList = new TodoList(); Scanner scanner = new Scanner(System.in); int choice = 0; while (choice != 5) { System.out.println("请选择操作:"); System.out.println("1. 添加待办事项"); System.out.println("2. 删除待办事项"); System.out.println("3. 编辑待办事项"); System.out.println("4. 显示待办事项"); System.out.println("5. 退出程序"); choice = scanner.nextInt(); scanner.nextLine(); switch (choice) { case 1: System.out.println("请输入待办事项:"); String newItem = scanner.nextLine(); todoList.addTodoItem(newItem); break; case 2: System.out.println("请输入要删除的待办事项编号:"); int indexToDelete = scanner.nextInt() - 1; todoList.deleteTodoItem(indexToDelete); break; case 3: System.out.println("请输入要编辑的待办事项编号:"); int indexToEdit = scanner.nextInt() - 1; scanner.nextLine(); System.out.println("请输入新的待办事项内容:"); String newContent = scanner.nextLine(); todoList.editTodoItem(indexToEdit, newContent); break; case 4: todoList.printTodoList(); break; case 5: System.out.println("程序已退出"); break; default: System.out.println("无效的选择,请重新选择"); break; } } scanner.close(); } } ``` 这个程序通过 Scanner 类从控制台获取用户输入,并使用 ArrayList 存储待办事项。用户可以通过输入数字选择不同的操作,例如添加、删除、编辑和显示待办事项。程序将用户的选择映射到不同的方法,这些方法通过操作 ArrayList 来实现增删功能。程序将一直运行,直到用户选择退出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值