基于JavaScript开发网页日记应用

介绍

现代人们生活节奏加快,很多人没时间手写纸质日记了,有不少人选择使用网页日记应用来记录自己的生活点滴。今天我们将介绍如何基于JavaScript开发一款网页日记应用。

技术栈

我们将使用以下技术来开发网页日记应用:

HTML5 - 构建网页

CSS - 美化网页

JavaScript - 实现交互逻辑和功能

localStorage - 存储日记

功能需求

我们将开发以下功能:

添加新日记

删除日记

编辑日记

查看日记

布局

我们的网页日记应用有两个主要界面:添加日记界面和日记列表界面。添加日记界面用于添加新日记,而日记列表界面用于列出已经添加的日记,同时也提供了删除和编辑功能。

添加日记界面:

日记列表界面:

实现步骤

1. 设计HTML结构和CSS样式

我们先设计好网页的HTML结构和CSS样式,保证网页可以正常显示并且美观。具体的代码实现如下:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<meta http-equiv="X-UA-Compatible" content="ie=edge">

<title>网页日记应用</title>

<link rel="stylesheet" href="style.css">

</head>

<body>

<div class="header">

<h1>网页日记应用</h1>

</div>

<div class="container">

<div class="add-diary">

<h2>添加新日记</h2>

<form action="#" method="POST">

<label for="diary-title">标题:</label>

<input type="text" id="diary-title" name="title" required>

<br>

<br>

<label for="diary-content">内容:</label>

<textarea id="diary-content" name="content" rows="10" cols="50" required></textarea>

<br>

<br>

<button type="submit" id="add-diary-btn">添加</button>

</form>

</div>

<div class="diary-list">

<h2>日记列表</h2>

<ul id="diarys">

<!-- diary items will be appened here dynamically by javascript -->

</ul>

</div>

</div>

<script src="app.js"></script>

</body>

</html>

body {

margin: 0;

padding: 0;

font-family: Arial, sans-serif;

}

.header {

background-color: #4CAF50;

color: white;

padding: 15px;

text-align: center;

}

.container {

display: flex;

flex-wrap: wrap;

justify-content: space-around;

margin: 30px;

}

.container .add-diary {

width: 300px;

margin: 20px;

}

.container .diary-list {

width: 600px;

margin: 20px;

}

.container h2 {

color: #4CAF50;

font-size: 24px;

margin-bottom: 10px;

}

.add-diary form {

display: flex;

flex-direction: column;

}

.add-diary input,

.add-diary textarea {

margin-bottom: 20px;

}

.add-diary label {

font-weight: bold;

}

.add-diary button {

background-color: #4CAF50;

color: white;

border: none;

padding: 10px;

border-radius: 5px;

cursor: pointer;

margin-top: 20px;

}

.diary-list li {

border: 1px solid #ddd;

padding: 20px;

margin-bottom: 10px;

border-radius: 5px;

cursor: pointer;

background-color: #f0f0f0;

}

.diary-list li:hover {

background-color: #ddd;

}

.edit-mode li input[type="text"],

.edit-mode li textarea {

display: block;

margin-bottom: 10px;

}

2. 编写JavaScript代码

2.1 添加新日记

当表单提交时,我们需要将表单中的数据存储到localStorage中。同时,我们还需要根据存储的数据更新日记列表。

const addDiaryForm = document.querySelector(".add-diary form");

const diaryList = document.getElementById("diarys");

addDiaryForm.addEventListener("submit", function(e) {

e.preventDefault();

const titleInput = document.getElementById("diary-title");

const contentTextarea = document.getElementById("diary-content");

const title = titleInput.value;

const content = contentTextarea.value;

if (title.trim() === "" || content.trim() === "") {

alert("标题和内容不能为空!");

return;

}

const diary = {

id: new Date().toISOString(),

title,

content

};

saveDiary(diary);

titleInput.value = "";

contentTextarea.value = "";

addDiaryToList(diary);

alert("日记添加成功!");

});

function saveDiary(diary) {

const diarys = JSON.parse(localStorage.getItem("diarys")) || [];

diarys.push(diary);

localStorage.setItem("diarys", JSON.stringify(diarys));

}

function addDiaryToList(diary) {

const li = document.createElement("li");

li[xss_clean] = `

<div>

<h4>${diary.title}</h4>

${diary.content}

</div>

<div>

<button class="delete-btn">删除</button>

<button class="edit-btn">编辑</button>

</div>

`;

li.setAttribute("data-id", diary.id);

diaryList.appendChild(li);

// 绑定按钮事件

const deleteBtn = li.querySelector(".delete-btn");

const editBtn = li.querySelector(".edit-btn");

deleteBtn.addEventListener("click", handleDelete);

editBtn.addEventListener("click", handleEdit);

}

2.2 删除日记

当用户点击删除按钮时,我们需要从localStorage中删除该日记,并对日记列表进行更新。

function handleDelete(e) {

const li = e.target.closest("li");

const id = li.getAttribute("data-id");

deleteDiaryById(id);

li.remove();

}

function deleteDiaryById(id) {

const diarys = JSON.parse(localStorage.getItem("diarys")) || [];

const newDiarys = diarys.filter(function(diary) {

return diary.id !== id;

});

localStorage.setItem("diarys", JSON.stringify(newDiarys));

alert("日记删除成功!");

}

2.3 编辑日记

当用户点击编辑按钮时,我们需要将该日记的标题和内容显示在表单中,用户可以修改后进行保存。

function handleEdit(e) {

const li = e.target.closest("li");

const id = li.getAttribute("data-id");

li.classList.add("edit-mode");

const div = li.querySelector("div:first-child");

const title = div.querySelector("h4").textContent;

const content = div.querySelector("p").textContent;

div[xss_clean] = `

<div>

<input type="text" value="${title}" required>

<textarea rows="5" required>${content}</textarea>

</div>

<div>

<button class="save-btn">保存</button>

<button class="cancel-btn">取消</button>

</div>

`;

// 绑定按钮事件

const saveBtn = div.querySelector(".save-btn");

const cancelBtn = div.querySelector(".cancel-btn");

saveBtn.addEventListener("click", function(e) {

const newTitle = div.querySelector("input").value;

const newContent = div.querySelector("textarea").value;

if (newTitle.trim() === "" || newContent.trim() === "") {

alert("标题和内容不能为空!");

return;

}

updateDiaryById(id, newTitle, newContent);

li.classList.remove("edit-mode");

div[xss_clean] = `

${newTitle}

${newContent}

`;

});

cancelBtn.addEventListener("click", function(e) {

li.classList.remove("edit-mode");

div[xss_clean] = `

${title}

${content}

`;

});

}

function updateDiaryById(id, newTitle, newContent) {

const diarys = JSON.parse(localStorage.getItem("diarys")) || [];

const diary = diarys.find(function(diary) {

return diary.id === id;

});

diary.title = newTitle;

diary.content = newContent;

localStorage.setItem("diarys", JSON.stringify(diarys));

alert("日记更新成功!");

}

2.4 查看日记

当用户点击日记列表中的某个日记时,我们需要显示该日记的详情。我们可以使用模态框实现。

const modal = document.getElementById("modal");

const closeModalBtn = modal.querySelector(".close-btn");

diaryList.addEventListener("click", function(e) {

const li = e.target.closest("li");

const diary = getDiaryById(li.getAttribute("data-id"));

if (diary) {

modal.classList.add("show");

modal.querySelector("h2").textContent = diary.title;

modal.querySelector("p").textContent = diary.content;

}

});

closeModalBtn.addEventListener("click", function(e) {

modal.classList.remove("show");

});

function getDiaryById(id) {

const diarys = JSON.parse(localStorage.getItem("diarys")) || [];

return diarys.find(function(diary) {

return diary.id === id;

});

}

总结

在本文中,我们介绍了如何基于JavaScript开发一款网页日记应用。我们学习到了如何使用HTML、CSS来构建网页,如何使用JavaScript实现网页的交互逻辑和功能,如何使用localStorage来存储数据。虽然这只是一个简单的网页应用,但这些技术在实际项目中都有很广泛的应用。