js中localStorage实现搜索框搜索历史存储功能

整体思路是在输入完成后点击搜索按钮,获取本地存储内容,将搜索数据保存至本地存储内容中,再将本地存储内容保存会本地存储中,打印存储内容至网页上,具体思路如下:

1.先创建html结构,完善css样式;

    <p>
        <input type="search" /><button>搜索</button>
    </p>
    <p>
        <span>一键清除</span>
    </p>
    <ul></ul>

2.获取本地存储数据:用localStorage的getItem的方法通过键名获取本地存储内容,这里要注意,因为本地存储与会话存储都是将数据以对象字符串的形式进行保存的,所有获取到本地存储数据后还需要使用JSON.parse这个方法将对象字符串转化为真对象才能使用。同时我们还需要判定原本是否存在本地存储对象,如没有需要创建一个新数组用以保存搜索内容;

        // 用一个变量接本地存储的键名,用变量防止后面键名输入错误
        const HISTORY = 'history';
        // 获取节点
        const inputNode = document.querySelector('input');//搜索框节点
        const btnNode = document.querySelector('button');//搜索按钮节点
        // 绑定点击事件
        btnNode.addEventListener('click' , function(){
            // 获取input的输入内容,trim去除内容左右两边的空格
            let inputValue = inputNode.value.trim();
            // 获取input历史本地存储数据,用JSON的parse方法将存储的对象字符串转化为对象
            let inputHis = JSON.parse(localStorage.getItem(HISTORY)) || []; // 这里使用||[]是防止没有存储数据时创建一个空的数组对象
        })

3.存入搜索数据:后通过判定输入内容长度来确定是否为空内容,使用includes方法(判定数组中是否存在某元素,返回true/false)判定输入内容是否与本地存储内容有重复,如果没有上述问题就使用unshift方法(在数组的最前面添加一个或更多元素)将搜索内容存储到本地存储内容中,后使用JSON的stringify将对象转换为对象字符串,再使用localStorage的setItem将存储内容存到指定键名的本地存储中;

        const HISTORY = 'history';
        const inputNode = document.querySelector('input');
        const btnNode = document.querySelector('button');
        btnNode.addEventListener('click' , function(){
            let inputValue = inputNode.value.trim();
            let inputHis = JSON.parse(localStorage.getItem(HISTORY)) || []; 

            //从这里开始
            if(inputValue || inputValue.length>0){
                // 用数组的includes()方法判定是否有重复数据
                if(inputHis.includes(inputValue)){
                    // 如果有,用splice删除指定元素,用indexOf获取对应删除元素的索引
                    inputHis.splice(inputHis.indexOf(inputValue) , 1);
                    // 后再将搜索框的输入内容加到本地存储数组对象的最前面,这是为了后面好按顺序打印
                    inputHis.unshift(inputValue);
                    // 将输入好的数据用JSON.stringify()存回本地
                    localStorage.setItem(HISTORY , JSON.stringify(inputHis));
                }else{
                    // 如果没有重复,直接保存数据
                    inputHis.unshift(inputValue);
                    localStorage.setItem(HISTORY , JSON.stringify(inputHis));
                }
            }
        })

4.渲染网页内容:再封装一个打印本地存储内容的函数来将数据渲染到网页上,将本地存储内容依次保存到创建的<li></li>标签中,通过innerHTML将内容渲染到网页上,完成后直接在需要渲染的地方使用函数即可;

        // 封装打印存储内容函数
        const print = function(){
            // 获取ul节点
            const ulNode = document.querySelector('ul');
            // 用来接后面将打印的字符串
            let liHtml = '';
            // 获取本地存储数据
            let inputHis = JSON.parse(localStorage.getItem(HISTORY)) || [];
            inputHis.forEach(function(v){
                // 接到本地存储的所有内容
                liHtml += `<li>${v}</li>`;
            })
            // 使用innerHTML打印出内容到ul中
            ulNode.innerHTML = liHtml;
        }

5.一键清除:点击一键清除键后使用localStorage中clear()将所有本地存储内容删除掉,再渲染一下内容,更新网页。

        // 获取一键清除节点
        const clearNode = document.querySelector('span');
        clearNode.addEventListener('click' , function(){
            // 使用clear方法删除所有本地存储数据
            localStorage.clear();
            // 渲染存储内容
            print();
        })

因为只是使用简单的js基础完成这个功能,所以漏洞肯定是有的,但对于初学者来说完成此项功能还是可以起到练习的目的,以下为完整代码:

    <script>
        // 封装打印存储内容函数
        const print = function(){
            // 获取ul节点
            const ulNode = document.querySelector('ul');
            // 用来接后面将打印的字符串
            let liHtml = '';
            // 获取本地存储数据
            let inputHis = JSON.parse(localStorage.getItem(HISTORY)) || [];
            inputHis.forEach(function(v){
                // 接到本地存储的所有内容
                liHtml += `<li>${v}</li>`;
            })
            // 使用innerHTML打印出内容到ul中
            ulNode.innerHTML = liHtml;
        }

        // 用一个变量接本地存储的键名,用变量防止后面键名输入错误
        const HISTORY = 'history';
        // 获取节点
        const inputNode = document.querySelector('input');//搜索框节点
        const btnNode = document.querySelector('button');//搜索按钮节点
        // 绑定点击事件
        btnNode.addEventListener('click' , function(){
            // 获取input的输入内容,trim去除内容左右两边的空格
            let inputValue = inputNode.value.trim();
            // 获取input历史本地存储数据,用JSON的parse方法将存储的对象字符串转化为对象
            let inputHis = JSON.parse(localStorage.getItem(HISTORY)) || []; // 这里使用||[]是防止没有存储数据时创建一个空的数组对象
            if(inputValue || inputValue.length>0){
                // 用数组的includes()方法判定是否有重复数据
                if(inputHis.includes(inputValue)){
                    // 如果有,用splice删除指定元素,用indexOf获取对应删除元素的索引
                    inputHis.splice(inputHis.indexOf(inputValue) , 1);
                    // 后再将搜索框的输入内容加到本地存储数组对象的最前面,这是为了后面好按顺序打印
                    inputHis.unshift(inputValue);
                    // 将输入好的数据用JSON.stringify()存回本地
                    localStorage.setItem(HISTORY , JSON.stringify(inputHis));
                }else{
                    // 如果没有重复,直接保存数据
                    inputHis.unshift(inputValue);
                    localStorage.setItem(HISTORY , JSON.stringify(inputHis));
                }
            }
            // 完成上述点击操作后打印更新一次本地存储内容
            print();
        })
        // 刷新页面时更新内容
        print();
        // 获取一键清除节点
        const clearNode = document.querySelector('span');
        clearNode.addEventListener('click' , function(){
            // 使用clear方法删除所有本地存储数据
            localStorage.clear();
            print();
        })
    </script>

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Vue2框架实现搜索框历史记录可以使用localStorage存储搜索记录,并在页面展示出来。 下面是一个简单的实现代码: ```html <!-- 搜索框 --> <input type="text" v-model="keyword" @keyup.enter="search" /> <!-- 历史记录 --> <div v-if="history.length > 0"> <h3>搜索历史</h3> <ul> <li v-for="(item, index) in history" :key="index" @click="selectHistory(item)"> {{ item }} </li> </ul> </div> ``` ```javascript export default { data() { return { keyword: '', history: [] } }, mounted() { // 从localStorage读取历史记录 this.history = JSON.parse(localStorage.getItem('searchHistory')) || [] }, methods: { search() { // 搜索处理 // ... // 存储搜索记录到localStorage if (this.keyword.trim() !== '') { this.history.unshift(this.keyword) localStorage.setItem('searchHistory', JSON.stringify(this.history)) } }, selectHistory(item) { // 点击历史记录处理 this.keyword = item this.search() } } } ``` 以上代码,使用了v-model指令将搜索框的值与Vue实例的`keyword`属性进行绑定,使用了`@keyup.enter`事件监听回车键,触发`search`方法进行搜索处理。在搜索处理,将搜索关键字存储历史记录,并使用`localStorage`进行本地存储。在页面展示历史记录时,使用`v-for`指令遍历历史记录数组,使用`@click`事件监听点击事件,触发`selectHistory`方法进行搜索处理。 需要注意的是,以上代码只是一个简单的实现示例,实际应用还需要进行一些优化,比如设置历史记录的最大数量、去重等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值