Code implementation:
ToDoList.html (copy and save as html file, open to see the effect):
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <title>ToDoList-the simplest to-do list</title> <link rel="stylesheet" href="https://blog-static.cnblogs.com/files/jacklzx/ToDoList.css"> <script src="//i2.wp.com/blog-static.cnblogs.com/files/jacklzx/jquery.min.js"></script> <script src="//i2.wp.com/blog-static.cnblogs.com/files/jacklzx/ToDoList.js"></script> </head> <body> <header> <section> <label for="title">ToDoList</label> <input type="text" id="title" name="title" placeholder="Please enter ToDo" required="required" autocomplete="off" /> </section> </header> <section> <h2>In Progress <span id="todocount"></span></h2> <ol id="todolist" class="demo-box"> </ol> <h2>Completed <span id="donecount"></span></h2> <ul id="donelist"> </ul> </section> </body> </html>
ToDoList.css:
body { margin: 0; padding: 0; font-size: 16px; background: #CDCDCD; } header { height: 50px; background: #333; background: rgba(47, 47, 47, 0.98); } section { margin: 0 auto; } label { float: left; width: 100px; line-height: 50px; color: #DDD; font-size: 24px; cursor: pointer; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } header input { float: right; width: 60%; height: 24px; margin-top: 12px; text-indent: 10px; border-radius: 5px; box-shadow: 0 1px 0 rgba(255, 255, 255, 0.24), 0 1px 6px rgba(0, 0, 0, 0.45) inset; border: none } input:focus { outline-width: 0 } h2 { position: relative; } span { position: absolute; top: 2px; right: 5px; display: inline-block; padding: 0 5px; height: 20px; border-radius: 20px; background: #E6E6FA; line-height: 22px; text-align: center; color: #666; font-size: 14px; } ol, ul { padding: 0; list-style: none; } li input { position: absolute; top: 2px; left: 10px; width: 22px; height: 22px; cursor: pointer; } p { margin: 0; } li p input { top: 3px; left: 40px; width: 70%; height: 20px; line-height: 14px; text-indent: 5px; font-size: 14px; } li { height: 32px; line-height: 32px; background: #fff; position: relative; margin-bottom: 10px; padding: 0 45px; border-radius: 3px; border-left: 5px solid #629A9C; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07); } olli { cursor: move; } ulli { border-left: 5px solid #999; opacity: 0.5; } li a { position: absolute; top: 2px; right: 5px; display: inline-block; width: 14px; height: 12px; border-radius: 14px; border: 6px double #FFF; background: #CCC; line-height: 14px; text-align: center; color: #FFF; font-weight: bold; font-size: 14px; cursor: pointer; } footer { color: #666; font-size: 14px; text-align: center; } footer a { color: #666; text-decoration: none; color: #999; } @media screen and (max-device-width: 620px) { section { width: 96%; padding: 0 2%; } } @media screen and (min-width: 620px) { section { width: 600px; padding: 0 10px; } }
ToDoList.js
$(function() { // Every time the page is loaded, the data is automatically rendered. load(); $("#title").on("keydown", function(event) { // Determine if the user pressed the Enter key (13) if (event.keyCode == 13) { if ($(this).val() == "") { alert("Please enter to-do items!"); } else { // First read and access the original data locally var local = getData(); //Append the latest data to local local.push({ title: $(this).val(), done: false }); //Save local to local storage saveData(local); load(); //Delete the text in the input after loading is complete $(this).val(""); } } }); //Delete operation $("ol,ul").on("click", "a", function() { // Get local storage var data = getData(); // change the data var index = $(this).attr("id"); // console.log(index); //Element.splice(start from which position to delete, delete a few) data.splice(index, 1); //Save to local storage saveData(data); // Re-render the page load(); }); // In progress, completed operation $("ol,ul").on("click", "input", function() { var data = getData(); var index = $(this).siblings("a").attr("id"); // console.log(index); data[index].done = $(this).prop("checked"); saveData(data); load(); }); //Read locally stored data function getData() { var data = localStorage.getItem("todolist"); if (data !== null) { // The data format for local storage is string and needs to be converted into an object. return JSON.parse(data); } else { return []; } } //Save local storage data function saveData(data) { //Convert to string before storage localStorage.setItem("todolist", JSON.stringify(data)); } // Render and load data function load() { var data = getData(); // console.log(data); // Clear the contents of ol and ul before traversing $("ol,ul").empty(); var todoCount = 0; // Number of items in progress var doneCount = 0; // Number of completed items // Traverse the data data $.each(data, function(i, n) { // console.log(n); //Append data and create a custom id index number if (n.done) { $("ul").prepend("<li><input type='checkbox' checked='checked'> <p>" + n.title + "</p> <a href='javascript:;' id=" + i + "></a></li>"); doneCount + + ; } else { $("ol").prepend("<li><input type='checkbox'> <p>" + n.title + "</p> <a href='javascript:;' id=" + i + "></a></li>"); todoCount + + ; } }); //Modify the displayed number $("#todocount").text(todoCount); $("#donecount").text(doneCount); } });