H5提供了localStorage特性,可以在本地存储数据,localStorage能够存储5M大小的数据,但是在不同的浏览器中有所差异。它以键值对的形式存储,值只能是标准JSON格式的数据,存储时可以用JSON.stringfy()转换一下,取时再用JOSN.parse()。这里我对localstorage做了一个简单的封装,通过原生js操纵DOM实现了手机通讯录效果。
一、通过es6的class新建一个类
初始给localstorage保存了三条数据,通过new AddressBook()可以创建一个通讯录对象,对象原型上包含了保存、新增、删除、返回通讯录列表等方法
1 Contact.js
2
3 class AddressBook{
4 constructor(){
5 const initData = [
6 {name:‘张三‘,phone:‘13467601369‘},
7 {name:‘李四‘,phone:‘13467601369‘},
8 {name:‘赵五‘,phone:‘13467601369‘},
9 ]
10 this.contactList = localStorage.contactList ? JSON.parse(localStorage.contactList) : initData
11 this.save()
12 }
13 save(){
14 //进行本地存储
15 localStorage.contactList = JSON.stringify(this.contactList)
16 }
17 add(name,phone){
18 //新增联系人
19 const contact = { name,phone }
20 this.contactList.push(contact)
21 this.save()
22 }
23 delete(index){
24 //删除联系人
25 this.contactList.splice(index,1)
26 this.save()
27 }
28 search(condition){
29 //按条件进行搜索,不管输入的是姓名还是电话号码,都可进行匹配
30 const reg = new RegExp(condition)
31 return this.contactList.filter( item => reg.test(item.name) || reg.test(item.phone))
32 }
33 getAllData(){
34 //返回所有数据
35 return this.contactList
36 }
37 }
二、原生js进行数据渲染
1 <div id="container">
2 <div class="search">
3 <input type="text" placeholder="搜索联系人">
4 </div>
5 <div class="addr-list">
6 <ul class=‘menu‘></ul>
7 </div>
8 <div class="footbar">
9 姓名<input type="text" name="enter-name">
10 号码<input type="text" name="enter-phone">
11 <button>添加</button>
12 </div>
13 </div>
1 render.js
2
3 const menu = document.querySelector(‘.menu‘),
4 search = document.querySelector(‘.search>input‘),
5 enterName = document.querySelector(‘input[name=enter-name]‘),
6 enterPhone = document.querySelector(‘input[name=enter-phone]‘),
7 addBtn = document.querySelector(‘.footbar>button‘)
8
9 //创建通讯录对象
10 const addressBook = new AddressBook()
11 //从localstorage里面获取联系人列表
12 let contactList = addressBook.getAllData()
13
14 function init(){
15 if( contactList.length > 0 ){
16 contactList.forEach( (item,index) => {
17 const li = getLiEle({
18 name:item.name,
19 phone:item.phone,
20 index
21 })
22 menu.appendChild(li)
23 })
24 }
25 }
26 init()
27
28 function getLiEle(data){
29 //创建联系人节点
30 const { name, phone, index } = data
31 const li = document.createElement(‘li‘)
32 const delDiv = document.createElement(‘div‘)
33 const nameDiv = document.createElement(‘div‘)
34 const phoneDiv = document.createElement(‘div‘)
35
36 delDiv.innerHTML = ‘-‘
37 nameDiv.innerHTML = name
38 phoneDiv.innerHTML = phone
39
40 li.classList.add(‘item‘)
41 delDiv.classList.add(‘del‘)
42 nameDiv.classList.add(‘name‘)
43 phoneDiv.classList.add(‘phone‘)
44
45 delDiv.onclick = function(){
46 menu.removeChild(li)
47 addressBook.delete(index)
48 }
49
50 li.appendChild(delDiv)
51 li.appendChild(nameDiv)
52 li.appendChild(phoneDiv)
53
54 return li
55 }
56
57 function addContact(){
58 //增加联系人
59 const name = enterName.value
60 const phone = enterPhone.value
61 if( !name || !phone ) return
62 //添加到页面
63 const li = getLiEle({name,phone})
64 menu.appendChild(li)
65 //添加到localstorage
66 addressBook.add(name,phone)
67 }
68
69 addBtn.addEventListener(‘click‘,addContact)
70
71 //搜索联系人,模糊搜索
72 let timer = 0
73 search.oninput = function(e){
74 //防抖,待输入停止后再搜索
75 clearTimeout(timer)
76 timer = setTimeout(()=>{
77 const res = addressBook.search(search.value)
78 if( res.length > 0 ){
79 res.forEach( (item,index) => {
80 const li = getLiEle({
81 name:item.name,
82 phone:item.phone,
83 index
84 })
85 menu.appendChild(li)
86 })
87 }else{
88 menu.innerHTML = ‘‘
89 }
90 if(!search.value){
91 menu.innerHTML = ‘‘
92 init()
93 }
94 },200)
95 }
三、效果图
实例地址:www.tyjswk.top/others/addressBook/index.html