# 簡易密碼產生器及在瀏覽器上儲存資料
### 簡易密碼產生器
```
<style>
body {
font-size: 50px;
font-family: Georgia, 'Times New Roman', Times, serif;
}
.result {
background-color: rgba(205, 252, 36, 0.938);
}
.btn-generate{
background-color: rgb(73, 10, 247);
color: #fff;
}
</style>
<body>
<div class="app">
<div><label><input type="checkbox" name="en"/>English</label></div>
<div><label><input type="checkbox" name="num"/>Number</label></div>
<div><label><input type="checkbox" name="sp"/>SpecialIcon</label></div>
</div>
<div>
<button class="btn-generate">produce</button>
</div>
<div class="result">
</div>
<script>
document.querySelector('.btn-generate').addEventListener('click',
function(){
let availableChar = ''
if (document.querySelector('input[name=en]').checked){
availableChar += 'abcdefghijklmnopqrstuvwxyz'
}
if (document.querySelector('input[name=num]').checked){
availableChar += '1234567890'
}
if (document.querySelector('input[name=sp]').checked){
availableChar += '!@#$%&*'
}
let result = ''
for(let i = 0; i<10; i++) {
//先把隨機數0~0.999*長度在無條件捨去
const number = Math.floor(Math.random()*availableChar.length)
result += availableChar[number]
}
document.querySelector('.result').innerText = result
}
);
</script>
</body>
```
三個 if 重複性很高,試著優化他們
把 data-char 放進標籤內
```
<style>
body {
font-size: 50px;
font-family: Georgia, 'Times New Roman', Times, serif;
}
.result {
background-color: rgba(205, 252, 36, 0.938);
}
.btn-generate{
background-color: rgb(73, 10, 247);
color: #fff;
}
</style>
<body>
<div class="app">
<div><label><input type="checkbox" name="en" data-char="abcdefghijklmnopqrstuvwxyz"/>English</label></div>
<div><label><input type="checkbox" name="num" data-char="1234567890"/>Number</label></div>
<div><label><input type="checkbox" name="sp" data-char="!@#$%&*"/>SpecialIcon</label></div>
</div>
<div>
<button class="btn-generate">produce</button>
</div>
<div class="result">
</div>
<script>
document.querySelector('.btn-generate').addEventListener('click',
function(){
let availableChar = ''
const elements = document.querySelectorAll('input[type=checkbox]')
for(let i=0; i<elements.length; i++){
if(elements[i].checked){
availableChar += elements[i].getAttribute('data-char')
}
}
let result = ''
for(let i = 0; i<10; i++) {
//先把隨機數0~0.999*長度在無條件捨去
const number = Math.floor(Math.random()*availableChar.length)
result += availableChar[number]
}
document.querySelector('.result').innerText = result
}
);
</script>
</body>
```
### 在瀏覽器上儲存資料的方式
**1. 古老的小甜餅 - cookie**
會自動帶到 server 的小型文字檔
透過 http 的 response 把資料寫到 cookie 上面去夾帶
**2. 最推薦的儲存方式:local storage**
有時候填寫表單不小心離開在返回網頁,或重新整理,填寫的資料還可以在
**3. 保鮮期短暫的 session storage**
跟 local storage 很類似,程式碼也一樣,只需要把 local storage 替換成 session storage,保留的比較短暫,只留在一個分頁內
##### local storage 使用範例
```
<body>
<div class="app">
<div>
<input class="text"/><button>save</button>
</div>
</div>
<script>
const oldValue = window.localStorage.getItem('text')
document.querySelector('.text').value = oldValue
document.querySelector('button').addEventListener('click',
function(){
const value = document.querySelector('.text').value
localStorage.setItem('text',value)
}
);
</script>
</body>
```