使用本地存储显示历史搜索提示
本地存储:存储于浏览器,与session没有关系
本地存储分为两种:
1、会话存储 sessionStorage
2、永久存储 localStorage
区别:生命周期不同,前者打开浏览器就没有了,后者一直存在直到手动将其清除
存储:以字符串的方式存储,基本类型能转换,但复杂类型数据会丢失,所以在存储之前用JSON.stringify转为json字符串格式,获取数据后,再用将其转为对象
以下是使用本地存储中的永久存储编写的一个小demo:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>搜索输入框的历史记录优化</title>
<style>
*{
margin: 0;
padding: 0;
box-sizing: border-box;
}
.box{
margin: 100px 450px;
position: relative;
}
input{
width: 250px;
height: 28px;
outline: none;
}
button{
width: 60px;
height: 28px;
border: none;
outline: none;
background-color: orange;
color: white;
cursor: pointer;
}
ul{
width: 250px;
list-style: none;
position: absolute;
background-color: skyblue;
top: 30px;
left: 0;
color: whitesmoke;
display: none;
padding: 0 5px;
}
ul li{
cursor: pointer;
}
ul li:hover{
background-color: blueviolet;
}
.block{
display: block;
}
</style>
</head>
<body>
<div class="box">
<input type="text">
<button>搜索</button>
<ul></ul>
</div>
</body>
</html>
<script>
// 获取元素
var input = document.querySelector('input');
var btn = document.querySelector('button');
var ul = document.querySelector('ul');
// 获取本地存储的数据,如果有则将其转换为js变量,如果没有则返回空数组
var data = localStorage.getItem('searchData');
data = data ? JSON.parse(data) : [];
// 1、给搜索按钮注册点击事件,将输入框的数据追加到本地存储中
btn.onclick = function(){
// 获取输入框的数据并去除两边空字符,判断数据是否为空
var text = input.value.trim();
if(text.length == 0){
alert('客官,您还没有输入内容呢!');
return;
}
// 判断输入框的数据是否已存在
for(var i = 0; i < data.length; i++){
if(data[i] == text){
// 删除已存在的数据 splice(开始删除的索引,删除个数)
data.splice(i,1);
}
}
// 将输入框的数据追加至原数据的前面
data.unshift(text);
// 将数据重新存储至本地,记得要将数据转为json格式字符串,否则数据将会丢失
localStorage.setItem('searchData',JSON.stringify(data));
// 页面跳转
location.href = 'https://www.baidu.com/s?wd='+text;
// 将输入框的值清空
// input.value = '';
}
// 2、给输入框注册键盘弹起事件,根据输入的数据与本地存储的数据相互匹配
input.onkeyup = function(){
// 获取输入框的数据
var text = input.value.trim();
// 将数据放入构造函数中
var reg = new RegExp(text);
// 判断本地存储中是否存在数据
if(data.length != 0){
// 准备空字符串
var html = '';
// 遍历本地存储的数据
for(var i = 0; i < data.length; i++){
// 将数组中的每份数据拿出来与输入框的数据对比
var inData = data[i].search(reg);
if(inData != -1 && inData != 0){
html += '<li>'+ data[i] +'</li>';
}
}
// 渲染数据
ul.innerHTML = html;
ul.className = 'block';
}
}
// 3、给出现的历史记录注册点击事件,替换文本框的内容,需要使用事件委托
ul.onclick = function(e){
var thisLi = e.target;
var text = thisLi.innerHTML;
input.value = text;
ul.className = '';
}
</script>