codelove jsbasic2-1
by CryptoMars
HTML
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@400;500;700;900&display=swap"></script>
<main>
<div class="container m-auto max-w-lg mt-10">
<div
class="border bg-yellow-100 rounded-lg px-5 py-5 shadow-lg shadow-yellow-600/50">
<div class="flex">
<input
id="todoField"
class="flex-1 p-2 mr-4 border-2 border-sky-600 rounded-lg outline-none"
type="text"
placeholder="新增待辦事項" />
<select
id="category"
class="p-2 mr-4 border-2 border-sky-600 rounded-lg outline-none"
onchange="addTodotheme()">
<option value="normal">一般</option>
<option value="important">重要</option>
<option value="urgent">緊急</option>
</select>
<button
id="addTodoBtn"
class="text-slate-300 font-semibold tracking-widest px-8 py-2 bg-sky-600 rounded-md hover:bg-opacity-70 outline-none"
onclick="addTodo()">
新增
</button>
</div>
<div id="todoBox" class="mt-4 border-t-2 hidden">
<div class="flex justify-between items-center my-4">
<h2 class="text-slate-500 font-semibold">Tasks</h2>
<button
class="bg-slate-500 text-white px-3 py-1 rounded-md hover:bg-opacity-70"
onclick="exportText()">
匯出
</button>
</div>
<ul id="todolist" class="mt-1">
<!-- <li
class="bg-red-300 flex items-center justify-between text-slate-700 p-3 mb-2 rounded-sm shadow-lg">
<span>倒垃圾</span>
<button
class="text-slate-300 font-semibold tracking-widest px-3 py-1 bg-rose-600 rounded-md hover:bg-opacity-70"
onclick="delTodo()">
刪除
</button>
</li>
<li
...
CSS
body {
font-family: "Noto Sans TC", sans-serif;
}
JavaScript
// 新增一筆
function addTodo() {
// 變數以$開頭表示是選取html的元素
const $todoField = document.querySelector("#todoField"); // input
const $todolist = document.querySelector("#todolist"); // ul
const $category = document.querySelector("#category"); // select
// 創建li, span, button元素
const newLi = document.createElement("li");
const newSpan = document.createElement("span");
const newBtn = document.createElement("button");
// 沒有輸入內容就跳提醒,使用return程式就不會再往下執行
if (!$todoField.value) return alert("請輸入待辦事項內容");
// 取得一般、重要、緊急的選擇結果
const selectedValue = $category[$category.selectedIndex].value;
// 依照一般、重要、緊急的選擇結果,判斷要輸出的class樣式
const selectedStyle =
selectedValue == "normal"
? "sky"
: selectedValue == "important"
? "orange"
: "red";
// 使用dataset屬性,在待辦事項中加入normal, important, urgent識別,方便在匯出純文字時使用
newLi.dataset.priority = selectedValue;
// 幫創建的li元素加上class樣式
newLi.classList.add(
`bg-${selectedStyle}-300`,
"flex",
"items-center",
"justify-between",
"text-slate-700",
"p-3",
"mb-2",
"rounded-sm",
"shadow-lg"
);
// 幫創建的button元素加上class樣式
newBtn.classList.add(
"text-slate-300",
"font-semibold",
"tracking-widest",
"px-3",
"py-1",
"bg-rose-600",
"rounded-md",
"hover:bg-opacity-70"
);
// 幫創建的button元素加入文字內容
newBtn.textContent = "刪除";
// 幫創建的button元素加上刪除功能(delTodo is a Function)
newBtn.onclick = delTodo;
// 幫創建的span元素加入user輸入的待辦事項內容
newSpan.textContent = todoField.value;
// 將創建的span, button元素依序加入到新創的的li元素內(子元素)
newLi.append(newSpan, newBtn);
// 將創建的li元素加入到ul元素內的最下面, 嘗試使用其他的method:insertAdjacentElement()
// https://developer.mozilla.org/zh-CN/docs/Web/API/Element/insertAdjacentElement
$todolist.insertAdjacentElement("beforeend", newLi);
// 清除 user 輸入內容,並將游標定位到 user 輸入欄位
$todoField.value = "";
$todoField.focus();
showHiddenTodo();
}
// 選取到目前點擊的button的父元素li,把li刪除
function delTodo() {
event.target.parentElement.remove();
...