Chrome插件開發實戰:todoList 插件

以下是一個適合小團隊自用的 Chrome TodoList 插件開發示例,包含基礎功能(增刪改查、本地存儲、統計)和簡潔的交互設計。代碼結構清晰,適合新手學習或快速上手。

在這里插入圖片描述

一、項目準備

創建插件項目目錄 todo-list-extension,包含以下文件:

todo-list-extension/
├── manifest.json   # 插件配置文件
├── popup.html      # 彈出頁面
├── popup.css       # 樣式文件
└── popup.js        # 邏輯腳本

二、核心代碼實現

1. manifest.json(插件配置)
{"manifest_version": 3,"name": "小團隊 TodoList","version": "1.0.0","description": "小團隊自用的任務管理工具,數據本地持久化","icons": {"16": "icon-16.png","48": "icon-48.png","128": "icon-128.png"},"action": {"default_popup": "popup.html","default_icon": {"16": "icon-16.png","48": "icon-48.png","128": "icon-128.png"}},"permissions": ["storage"], // 使用本地存儲需要此權限"content_security_policy": {"extension_pages": "script-src 'self'; object-src 'self'"}
}

說明

  • manifest_version: 3 是 Chrome 推薦的最新版本,更安全高效。
  • permissions: ["storage"] 用于訪問本地存儲(chrome.storage.local)。
  • 需準備 16x16、48x48、128x128 的圖標(可臨時用占位圖)。
2. popup.html(彈出頁面結構)
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><link rel="stylesheet" href="popup.css">
</head>
<body><div class="container"><!-- 統計欄 --><div class="stats"><span>總任務:<span id="total">0</span></span><span>已完成:<span id="completed">0</span></span></div><!-- 添加任務表單 --><div class="add-task"><input type="text" id="taskInput" placeholder="輸入新任務(回車添加)"autocomplete="off"><button id="addBtn">添加</button></div><!-- 任務列表 --><ul id="taskList"></ul></div><script src="popup.js"></script>
</body>
</html>
3. popup.css(樣式美化)
body {width: 350px;min-height: 400px;margin: 0;padding: 15px;font-family: 'Segoe UI', sans-serif;background: #f5f7fa;
}.container {max-width: 100%;
}.stats {color: #666;font-size: 12px;margin-bottom: 15px;display: flex;gap: 15px;
}.add-task {display: flex;gap: 8px;margin-bottom: 15px;
}#taskInput {flex: 1;padding: 8px 12px;border: 1px solid #ddd;border-radius: 4px;font-size: 14px;outline: none;
}#taskInput:focus {border-color: #4a90e2;box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);
}#addBtn {padding: 8px 16px;background: #4a90e2;color: white;border: none;border-radius: 4px;cursor: pointer;font-size: 14px;transition: background 0.2s;
}#addBtn:hover {background: #357abd;
}#taskList {list-style: none;padding: 0;margin: 0;
}.task-item {display: flex;align-items: center;padding: 10px;background: white;border-radius: 4px;margin-bottom: 8px;box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);transition: transform 0.1s;
}.task-item:hover {transform: translateX(5px);
}.task-checkbox {width: 18px;height: 18px;margin-right: 12px;cursor: pointer;
}.task-content {flex: 1;font-size: 14px;color: #333;
}.task-content.completed {text-decoration: line-through;color: #999;
}.delete-btn {color: #ff4d4f;background: none;border: none;cursor: pointer;font-size: 16px;opacity: 0.7;transition: opacity 0.2s;
}.delete-btn:hover {opacity: 1;
}
4. popup.js(核心邏輯)
// 初始化:加載本地存儲的任務
document.addEventListener('DOMContentLoaded', () => {loadTasks();renderTasks();
});// 獲取 DOM 元素
const taskInput = document.getElementById('taskInput');
const addBtn = document.getElementById('addBtn');
const taskList = document.getElementById('taskList');
const totalEl = document.getElementById('total');
const completedEl = document.getElementById('completed');// 添加任務(按鈕點擊或回車)
addBtn.addEventListener('click', addTask);
taskInput.addEventListener('keypress', (e) => {if (e.key === 'Enter') addTask();
});// 加載本地存儲的任務
function loadTasks() {chrome.storage.local.get(['tasks'], (result) => {const tasks = result.tasks || [];renderTasks(tasks);});
}// 渲染任務列表
function renderTasks(tasks = []) {// 清空舊列表taskList.innerHTML = '';// 統計數據const total = tasks.length;const completed = tasks.filter(t => t.completed).length;totalEl.textContent = total;completedEl.textContent = completed;// 渲染每個任務tasks.forEach(task => {const li = document.createElement('li');li.className = 'task-item';li.dataset.id = task.id; // 用 id 標識任務li.innerHTML = `<input type="checkbox" class="task-checkbox" ${task.completed ? 'checked' : ''}><span class="task-content ${task.completed ? 'completed' : ''}">${task.content}</span><button class="delete-btn">×</button>`;// 綁定復選框事件(標記完成/未完成)const checkbox = li.querySelector('.task-checkbox');checkbox.addEventListener('change', () => toggleTask(task.id));// 綁定刪除按鈕事件const deleteBtn = li.querySelector('.delete-btn');deleteBtn.addEventListener('click', () => deleteTask(task.id));taskList.appendChild(li);});
}// 添加新任務
function addTask() {const content = taskInput.value.trim();if (!content) return; // 空任務不添加const newTask = {id: Date.now(), // 用時間戳作為唯一 idcontent,completed: false,createdAt: new Date().toISOString()};// 讀取現有任務并追加新任務chrome.storage.local.get(['tasks'], (result) => {const tasks = result.tasks || [];tasks.push(newTask);saveTasks(tasks); // 保存到本地存儲taskInput.value = ''; // 清空輸入框});
}// 切換任務完成狀態
function toggleTask(taskId) {chrome.storage.local.get(['tasks'], (result) => {const tasks = result.tasks || [];const index = tasks.findIndex(t => t.id === taskId);if (index !== -1) {tasks[index].completed = !tasks[index].completed;saveTasks(tasks);}});
}// 刪除任務
function deleteTask(taskId) {chrome.storage.local.get(['tasks'], (result) => {const tasks = result.tasks || [];const filtered = tasks.filter(t => t.id !== taskId);saveTasks(filtered);});
}// 保存任務到本地存儲
function saveTasks(tasks) {chrome.storage.local.set({ tasks }, () => {renderTasks(tasks); // 保存后重新渲染});
}

在這里插入圖片描述

三、測試與使用

  1. 準備圖標:臨時找 3 個尺寸的圖標(或用在線工具生成),命名為 icon-16.pngicon-48.pngicon-128.png 放入項目目錄。
  2. 加載插件
    • 打開 Chrome 瀏覽器,進入 chrome://extensions
    • 開啟右上角「開發者模式」→ 點擊「加載已解壓的擴展程序」→ 選擇項目目錄 todo-list-extension
  3. 使用插件
    • 點擊瀏覽器右上角的插件圖標,彈出 TodoList 界面。
    • 輸入任務內容,點擊「添加」或按回車鍵添加任務。
    • 勾選復選框標記任務完成(文字會劃線),點擊「×」刪除任務。
    • 關閉插件后重新打開,數據會保留(本地存儲)。

四、擴展方向(小團隊可能需要)

  1. 任務分類/標簽:添加「工作」「生活」等標簽,按分類篩選任務。
  2. 截止日期提醒:為任務添加截止時間,到期前彈出通知(需 alarms 權限)。
  3. 團隊共享:結合團隊協作工具(如飛書、Trello API)同步任務(需后端服務)。
  4. 數據備份:添加「導出/導入」功能,支持 JSON 文件備份(用 chrome.downloads API)。

這個示例實現了小團隊最核心的任務管理需求,代碼簡潔易擴展,適合作為團隊內部工具快速落地。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93694.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93694.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93694.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Redis數據庫開啟SSL加密】【小白指南】【生產環境可用】附帶Docker服務器配置和python連接Redis數據庫代碼(加密通訊版)

【Redis數據庫開啟SSL加密】【填坑指南】附帶服務器配置和python連接測試代碼 本教程轉為小白提供設置Redis安全訪問&#xff0c;自簽名證書進行安全訪問你的Redis數據庫&#xff0c;輕松實現安全訪問和保護數據庫不被非法入侵。 本文原創&#xff0c;轉載請注明出處&#xff0…

筆記本電腦鍵盤失靈【已解決】

配置環境硬件詳情筆記本電腦聯想拯救者y7000 2019 PG0&#xff08;已更新為win11&#xff09;外接鍵盤colorful ckb-p100問題今天筆記本開機后&#xff0c;進入登錄頁面輸入密碼&#xff0c;突然發現筆記本自帶鍵盤&#xff08;我通常不用外接鍵盤&#xff09;的鍵失靈了&#…

postgresql運維問題解決:PG集群備節點狀態異常告警處理

小亦平臺會持續給大家科普一些運維過程中常見的問題解決案例&#xff0c;運維朋友們可以在常見問題及解決方案專欄查看更多案例 問題概述&#xff1a; 故障&#xff1a; pg數據庫備節點狀態異常現象&#xff1a; 一般為集群間心跳超時導致,現象為集群有fail-count失敗數告警&…

Maven 開發實踐

文章目錄1. 搭建私服&#xff08;windows)2.上傳依賴3.多個遠程倉庫配置4.其它1. 搭建私服&#xff08;windows) 軟件下載 https://help.sonatype.com/en/download.html修改端口 etc/nexus-default.properties啟動程序 管理員身份進入進入bin目錄下執行.\nexus.exe /run創建Ma…

設計心得——如何架構選型

一、架構的作用 可能對于很多的公司&#xff0c;其實架構本身的重要性并不大。大家一定明白這回事&#xff0c;架構在實際的開發&#xff0c;在大多數的場景下其實用處并沒有書籍和資料中講的那樣重要&#xff0c;甚至是可有可無。這樣講是不有些可笑&#xff1f;是不是覺得挺意…

vba學習系列(12)--反射率通過率計算復雜度優化25/8/17

系列文章目錄 文章目錄系列文章目錄前言一、反射率通過率1.整體通過率2.整體通過率3.客戶工藝匹配4.機臺通過率分析5.鏡片通過率罩次分析分析1.1分析1.26.鏡片通過率圈數分析分析1.1分析1.28.鏡筒通過率圈數分析分析1.1分析1.29.鏡筒通過率罩次分析分析1.2總結前言 一、反射率通…

Microsoft WebView2

運行效果 代碼如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Form…

GitCode 疑難問題診療:全方位指南

一、問題診斷與解決框架1.1 通用問題排查流程在面對 GitCode 問題時&#xff0c;遵循一套科學的排查流程至關重要。首先&#xff0c;詳細記錄問題出現時的具體操作步驟與相關報錯信息&#xff0c;這有助于精準定位問題根源。例如&#xff0c;若在執行git push命令時出現錯誤&am…

AMD Ryzen AI Max+ 395四機并聯:大語言模型集群推理深度測試

本文介紹使用四塊Framework主板構建AI推理集群的完整過程&#xff0c;并對其在大語言模型推理任務中的性能表現進行了系統性評估。該集群基于AMD Ryzen AI Max 395處理器&#xff0c;采用mini ITX規格設計&#xff0c;可部署在10英寸標準機架中。 Jeff Geerling大佬還開發了名…

深度學習·GFSS

GFSS General Few-Shot Segmentation 任務實現方式與zero-shot有所不同本篇論文只涉及同一個模態(圖像)&#xff0c;訓練過程中&#xff0c;novel class有幾個圖像提供&#xff0c;提供k個就稱之為k-shot。先從圖像中提取class prototype&#xff0c;然后這個原型向量作為查詢&…

Transformer架構的數學本質:從注意力機制到大模型時代的技術內核

系列專欄推薦&#xff1a;零基礎學Python&#xff1a;Python從0到100最新最全教程 深入淺出講解神經網絡原理與實現&#xff0c;從基礎的多層感知機到前沿的Transformer架構。包含完整的數學推導、代碼實現和工程優化技巧。 寫在前面&#xff1a;為什么理解Transformer如此重要…

最新微信小程序一鍵獲取真實微信頭像和昵稱方法

使用公開免費插件&#xff0c;快速實現獲取用戶頭像和昵稱&#xff0c;已附uniapp、微信開發工具開發詳細教程。前言為了保護用戶隱私&#xff0c;wx.getUserInfo、wx.getUserProfile都沒法獲取到用戶頭像和昵稱了&#xff0c;只能通過設計用戶主動選擇/輸入形式&#xff0c;操…

路由器配置之模式

文章目錄配置路由器時&#xff0c;有一個模式選擇最佳實踐各個選項的區別11b only11g only11n only11bg mixed11bgn mixed配置路由器時&#xff0c;有一個模式選擇 最佳實踐 ? 追求速度&#xff1a;選 11n only&#xff08;需所有設備支持&#xff09;。 ? 兼容性優先&…

評測系統構建

合成數據更“科研驅動”&#xff0c;強調 controllability 和 generalization evaluation&#xff1a; 之前往往直接采用經典數據集如OGB和OGB-large提供的經典數據集和數據劃分思路 該思想從現有真實數據中學習參數&#xff0c;再構造類似但分布略異的數據集&#xff0c;驗證模…

【計算機網絡面試】TCP/IP網絡模型有哪幾層

參考&#xff1a; 2.1 TCP/IP 網絡模型有哪幾層&#xff1f; | 小林coding | Java面試學習 以下為自己做的筆記 應用層 專注于為用戶提供應用功能&#xff0c;如HTTP、FTP、Telnet、DNS、SMTP等。應用層不關心用戶是怎么傳輸的&#xff0c;當兩個設備間的應用需要通信時&…

3 種方式玩轉網絡繼電器!W55MH32 實現網頁 + 阿里云 + 本地控制互通

目錄 1 前言 2 項目環境 2.1 硬件準備 2.2 軟件準備 2.3 方案圖示 3 例程修改 4 功能驗證 5. 總結 1 前言 HTTP&#xff08;超文本傳輸協議&#xff0c;HyperText Transfer Protocol&#xff09;是一種用于分布式、協作式、超媒體信息系統的應用層協議&#xff0c; 基于 TCP/IP…

第四篇:科技封鎖與文化滲透篇——T-501 與 M-208 雙引擎布局(節奏增強版)

科技封鎖與文化滲透篇——T-501 與 M-208 雙引擎布局&#xff08;節奏增強版&#xff09; 引子 在全球競爭中&#xff0c;光有資本和市場遠遠不夠。 ? 科技封鎖&#xff08;T-501&#xff09;&#xff1a;通過技術標準、專利網絡、供應鏈控制&#xff0c;讓對手進入成本極高的…

python實現梅爾頻率倒譜系數(MFCC) 除了傅里葉變換和離散余弦變換

語音識別第4講&#xff1a;語音特征參數MFCC https://zhuanlan.zhihu.com/p/88625876/ Speech Processing for Machine Learning: Filter banks, Mel-Frequency Cepstral Coefficients (MFCCs) and What’s In-Between https://haythamfayek.com/2016/04/21/speech-processing-…

springBoot+knife4j+openapi3依賴問題參考

pom文件附帶版本<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.12</version></parent><dependencies><!-- SpringDoc starter --><d…

XML DOM 高級

XML DOM 高級 引言 XML DOM(Document Object Model)是用于解析和操作XML文檔的一種標準,它允許開發者通過編程方式訪問和修改XML文檔的內容。本文將深入探討XML DOM的高級特性,包括XML解析、節點操作、事件處理以及性能優化等,幫助讀者全面理解并掌握XML DOM的高級應用。…