# [JavaScript] LocalStorage瀏覽器資料儲存 ###### tags: `JavaScript` > 前言:時常用於“我的最愛”功能列,一般我們所點選的資料都會藉由傳入後端資料庫儲存,如要取用也須從資料庫取出,無形中會增加資料庫的負荷,要節省儲存庫的容量以及載入速度,建議使用localStorage、cookie、sessionStorage的方式在瀏覽器儲存。 ![](https://i.imgur.com/s25NmYZ.png) localStorage語法範例 * 存入方法:setItem("key位置",宣告) * 取得方法:getItem('key位置') ![](https://i.imgur.com/9wS2w4U.png) ![](https://i.imgur.com/T3fyG1W.png) --- 匯入流程 * 先定義btn與html的ID位置,代入監聽公式,再建立function事件寫入匯入的公式(同上) ![](https://i.imgur.com/DhD6zdv.png) 取得流程 * 如匯入流程,先定義call(下圖無顯示),再使用監聽呼叫取得公式。 ![](https://i.imgur.com/xiTpa6d.png) ![](https://i.imgur.com/ukhS2Zc.png) ## 透過json來轉譯資料 只能使用string字串存入資料,因此需要使用json將array陣列轉為字串才可存入,而取得資料則須將記憶體的資料轉譯成array陣列。 從localstorage取出來的值都是字串 -陣列轉字串:JSON.stringify() -字串轉陣列 & JSON格式:JSON.parse() ![](https://i.imgur.com/hprnG9H.png) ![](https://i.imgur.com/GSJav6H.png) * 匯入公式的關鍵在countryString加入json.stringify語法,過濾country所得出的陣列資料,而匯入公式setItem再將轉意後的資料匯入就可以順利儲存。 * 取得的方式也與匯入方式相同 ## dataset讀取自訂資料 html語法:針對list再自訂特定物件,data-命名 ="值" ![](https://i.imgur.com/pxpSqXy.png) js語法: 指定在list li的位置,匯出方式是寫上e.target.dataset.num名稱,便可以得到在html所設定的資料,也是e.target.value之外的另一種語法 ![](https://i.imgur.com/paXJlPg.png) ## dataset及array的應用 目的:分別將各個li做陣列區分[0][1],並選擇ul做事件反應,針對點擊ul採用return空白值,只有點擊li才會執行動作 本輪學到東西 1. 設定呼叫編號 2. 點到li項目才會動作 ``` var country = [ { farmer:'卡斯伯' } ,{ farmer:'查理' } ] var list = document.querySelector('.list'); //更新農場資料 function updateList(){ var str = ''; var len = country.length; for(var i = 0;len>i;i++){ str+='<li data-num="'+i+'">'+country[i].farmer+'</li>' } list.innerHTML = str; } updateList(); //確認點擊的農夫是誰 function checkList(e){ var num = e.target.dataset.nodeName; if(e.target.nodeName !== 'LI'){return}; var str = e.target.dataset.num; alert('你選擇的農夫是'+country[str].farmer) } list.addEventListener('click',checkList,false); ``` * 設定呼叫編號 data-num,可供之後利用編號做新增及刪除的功用。 ``` for(var i = 0;len>i;i++){ str+='<li data-num="'+i+'">'+country[i].farmer+'</li>' } ``` * 此處的num變數,是用來偵測節點nodeName,與if判斷式搭配如果不是LI便回傳空值(無反應),主要是判定在點擊時只有點到li才會有行動,若非li便回傳空值 * str變數是呼叫前面所定義的編號num ![](https://i.imgur.com/UmbQDhj.png) ### 點擊後刪除array * 語法splice(num,1) => 刪掉編號第num筆位置,寫(1)則是刪除一個資料,如果寫2就是刪除向下兩筆資料。 * 刪除後方接一個updateList()再宣告,會傳至function內,到list.innerHTML呈現畫面,畫面上的狀態才會即時更新。 ``` //更新農場資料 function updateList(){ var str = ''; var len = country.length; for(var i = 0;len>i;i++){ str+='<li data-num="'+i+'">'+country[i].farmer+'</li>' } list.innerHTML = str; } updateList(); //確認點擊的農夫是誰 function checkList(e){ var num = e.target.dataset.num; // console.log(e.target.nodeName); if(e.target.nodeName !== 'LI'){return}; country.splice(num,1); updateList(); } list.addEventListener('click',checkList,false); ``` ``` // 指定 dom var list = document.querySelector('.list'); var sendData = document.querySelector('.send'); var data = JSON.parse(localStorage.getItem('listData')) || []; // 監聽與更新 sendData.addEventListener('click', addData); list.addEventListener('click', toggleDone); updateList(data); //加入列表,並同步更新網頁與 localstorage function addData(e) { e.preventDefault(); var txt = document.querySelector('.text').value; var todo = { content: txt }; data.push(todo); updateList(data); localStorage.setItem('listData', JSON.stringify(data)); } // 更新網頁內容 function updateList(items) { str = ''; var len = items.length; for (var i = 0; len > i; i++) { str += '<li><a href="#" data-index=' + i + ' />刪除</a> <span>' + items[i].content + '</span></li>'; } list.innerHTML = str; } // 刪除代辦事項 function toggleDone(e) { e.preventDefault(); if(e.target.nodeName !== 'A'){return}; var index = e.target.dataset.index; data.splice(index, 1); localStorage.setItem('listData', JSON.stringify(data)); updateList(data); } ```