localStorage实现历史记录搜索功能

news2024/11/26 16:32:25

📝个人主页:爱吃炫迈
💌系列专栏:JavaScript
🧑‍💻座右铭:道阻且长,行则将至💗

文章目录

  • 为什么使用localStorage
  • 如何使用localStorage
  • 实现历史记录搜索功能(原生JS实现)
    • 效果展示
    • 代码实现


为什么使用localStorage

首先我们来对比一下localStorage、sessionStorage和cookie:

cookie最大的问题就是内存问题,cookie的存储空间只有4K,localStorage和sessionStorage可以拓展cookie4K这个限制,一般浏览器支持的是5M大小。

localStorage生命周期是永久,这意味着除非用户显示在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在。sessionStorage生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就被清空了。

不同浏览器无法共享localStorage或sessionStorage中的信息。但是在相同浏览器的不同页面间可以共享相同的localStorage(页面属于相同域名和端口),但是不同页面或标签页间无法共享sessionStorage的信息。

由此看来localStorage更加适合我们做历史记录,即使用户关闭浏览器操作,下次进来依旧存在。

如何使用localStorage

二次封装localStorage

实现历史记录搜索功能(原生JS实现)

效果展示

在这里插入图片描述

代码实现

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    ul {
      list-style: none;
      width: 250px;
      position: absolute;
    }

    ul li {
      display: flex;
      justify-content: space-between;
      align-items: center;
      padding: 10px;
      border-bottom: 1px dashed #ccc;
    }

    button {
      cursor: pointer;
    }

    div {
      width: 250px;
      text-align: right;
      cursor: pointer;
      font-size: 12px;
    }

    input {
      padding: 5px;
      margin: 10px;
    }
  </style>
</head>

<body>
  <input type="search" placeholder="输入搜索关键字" />
  <input type="button" value="搜索" />
  <div>清空搜索记录</div>
  <ul>
    <li>没有搜索记录</li>
  </ul>

  <script>
    // 监听dom执行完成后就执行JavaScript代码
    document.addEventListener('DOMContentLoaded', function () {
      // 根据历史记录渲染历史列表
      // 获取localStorage数据数据是json格式
      var historyListJson = localStorage.getItem('historyList') || '[]'; //historyList预设的键;
      //把json数据转换成数组
      var historyListArr = JSON.parse(historyListJson);

      // 1. 渲染数据
      function render() {
        // 定义一个空html
        var html = '';
        // 遍历数组
        historyListArr.forEach((item, index) => {
          html = `<li><span>${item}</span><button data-index="${index}">删除</button></li>` + html
        });
        // 判断html里面有数据没
        html = html || '<li>没有搜索记录</li>';
        // 把数据渲染到ul里面
        const ul = document.querySelector('ul')
        ul.innerHTML = html
      }
      render();



      // ------------------------------------------------------------------------------------------------------------------------------
      // 2. 点击搜索的时候更新历史搜索记录
      const button = document.querySelector('input[type="button"]');
      button.addEventListener('click', function () {
        // 获取搜索框的内容
        var key = document.querySelector('input').value;

        // 判断点击搜索、搜索框内没有内容提示用户
        if (!key) {
          alert('请输入内容');
          return false;
        }

        // 去重函数
        function killRepeat(val) {
          var kill = 0
          for (let i = historyListArr.length - 1; i >= 0; i--) {
            if (val === historyListArr[i]) {
              kill++
            }
          }
          return kill
        }
        if (killRepeat(key) == 0) {
          // 追加数据到historyListArr数组中
          historyListArr.push(key);
          // 保存更新追加的数据到json数据中
          localStorage.setItem('historyList', JSON.stringify(historyListArr));
          // 渲染数据/直接调用前面的渲染数据函数
          render();
        }

        // 清空搜索框
        document.querySelector('input[type="search"]').value = '';
        // 页面跳转·····
      });




      // ------------------------------------------------------------------------------------------------------------------------
      // 3. 删除数据:因为a的id是动态生成的需要冲ul拿到a的id
      // 获取 ul 元素
      const ul = document.querySelector('ul');
      ul.addEventListener('click', function (event) {
        if (event.target.tagName === 'BUTTON') {
          // 获取点击的 div 元素的id
          const index = event.target.dataset.index;
          // 删除数组内的指定位置数据
          historyListArr.splice(index, 1);

          // 保存更新追加的数据到json数据中
          localStorage.setItem('historyList', JSON.stringify(historyListArr));

          // 渲染数据/直接调用前面的渲染数据函数
          render();
        }
      });



      // ---------------------------------------------------------------------------------------------------------------------------
      // 4. 清除全部历史记录
      const div = document.querySelector('div');
      div.addEventListener('click', function () {
        // 清空数据
        historyListArr = [];

        // 删除空数据
        localStorage.removeItem('historyList');

        // 渲染数据
        render();
      });
    });
  </script>

</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1056295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

矢量图形编辑软件illustrator 2023 mac特点介绍

illustrator 2023 mac是一款矢量图形编辑软件&#xff0c;用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 illustrator mac软件特点 矢量图形&#xff1a;illustrator创建的图形是矢量图形&#xff0c;可以无限放大而不失真&#xff0c;这与像素图形编辑软件&am…

[Linux]线程互斥

[Linux]线程互斥 文章目录 [Linux]线程互斥线程并发访问问题线程互斥控制--加锁pthread_mutex_init函数pthread_mutex_destroy函数pthread_mutex_lock函数pthread_mutex_unlock函数锁相关函数使用示例使用锁的细节加锁解锁的实现原理 线程安全概念常见的线程不安全的情况常见的…

蓝桥杯每日一题2023.10.2

时间显示 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 输入为毫秒&#xff0c;故我们可以先将毫秒转化为秒&#xff0c;由于只需要输出时分&#xff0c;我们只需要将天数去除即可&#xff0c;可以在这里多训练一次天数判断 #include<bits/stdc.h> using namespace std…

检索qpython文件夹下.py

需求口令 检索 /storage/emulated/0/qpython 文件夹下的.py文件 编号原文件名&#xff1a;复制到/storage/emulated/0/qpython/py文件/ 没有文件夹就创建 检索qpython文件夹下.py&#xff0c;复制到py文件单独路径 根据这个提问清单和步骤&#xff0c;我们需要完成以下任务&…

Audio2Face的工作原理

预加载一个3D数字人物模型(Digital Mark),该模型可以通过音频驱动进行面部动画。 用户上传音频文件作为输入。 将音频输入馈送到预训练的深度神经网络中。 Audio2Face加载预制的3d人头mesh 3D数字人物面部模型由大量顶点组成,每个顶点都有xyz坐标。 深度神经网络输入音频特征,…

C++基础语法(继承)

终于&#xff0c;经过一路的过关斩将&#xff0c;我们来到了继承面前。还记得在最初学习类于对象时&#xff0c;那个对封装概念一直模糊不清的自己&#xff0c;还记得被模板&#xff0c;被迭代器折磨的日日夜夜吗&#xff1f;这一路你挺过来了&#xff0c;你失去了一些东西&…

zkLogin构建者的最佳实践和业务思考

随着zkLogin在Sui主网上线&#xff0c;构建者可以开始为其应用程序提供丝滑的帐户创建服务。与任何新技术集成一样&#xff0c;构建者需要考虑许多重要的问题&#xff0c;以降低风险并成功优化。 本文概述了其中一些考虑因素&#xff0c;并突出了zkLogin文档中提供的明确指导。…

Linux-centos系统安装MySql5.7

1.配置yum仓库 1.1配置yum仓库 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 1.2 安装Mysql yum库 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm 2.使用yum安装Msql 说明&#xff1a;下载大约5分钟左右 yum -y install mysq…

基于Java的教学评价管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统功能结构图系统ER图具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划…

分页前后端完整代码

一、后端代码 User实体类要继承PageVo package com.like.entity;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.like.common.PageVo; import…

web:[SUCTF 2019]EasySQL

题目 点进页面&#xff0c;页面显示为 没有其他的提示信息&#xff0c;查看源代码看看是否有提示 什么都没有&#xff0c;由题目名为easysql&#xff0c;能想到这道题与sql注入有关 先输入1查看回显 再输入其他数字或字母看看回显 都是无显示 先验证是否存在sql注入 构造pay…

python爬取csdn个人首页中的所有封面

#爬取csdn个人首页中的所有封面 import requests import json import reurlhttps://blog.csdn.net/community/home-api/v1/get-business-list? headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safar…

Scala第十二章节

Scala第十二章节 1.读取数据 2.写入数据 3.案例&#xff1a;学生成绩表 scala总目录 文档资料下载

Origin分段显示柱状图

注意这里生成的是柱状图&#xff0c;而不是直方图。因此用到的是plot -> column/bar/pie -> stacked column&#xff1a; 而不是Statistical->histogram。 先上最终的作图效果&#xff1a; 单个柱的柱状图 第一步先填充数据&#xff0c;如图左所示&#xff0c;然后选…

P1540 [NOIP2010 提高组] 机器翻译(模拟)

[NOIP2010 提高组] 机器翻译 题目背景 小晨的电脑上安装了一个机器翻译软件&#xff0c;他经常用这个软件来翻译英语文章。 题目描述 这个翻译软件的原理很简单&#xff0c;它只是从头到尾&#xff0c;依次将每个英文单词用对应的中文含义来替换。对于每个英文单词&#xf…

Java类与对象

文章目录 引出概念快速入门对象内存布局属性概念创建对象访问属性对象分配机制成员方法&#x1f996;注意事项和细节 引出 ●看一个养猫猫问题 张老太养了两只猫猫: 一只名字叫小白, 今年3岁, 白色. 还有一只叫小花, 今年100岁, 花色. 请编写一个程序, 当用户输入小猫的名字时…

Qt自定义菜单

Qt开发过程中&#xff0c;弹出菜单时我们一般使用QMenu,但是QMenu都是一条项固定的格式&#xff0c;如查想要自己的设计界面就没法使用默认的Action项了&#xff0c;因此我们得用自定义的QMenu。 本篇介绍使用自定义的QMenu设计出UI。我们使用QWidget QWidgetAction来实现。Q…

代码随想录 Day8 栈(FILO)与队列(FIFO) LeetCode T232 用栈实现队列 LeetCodeT225 用队列实现栈

题目详细思路来自于:代码随想录 (programmercarl.com) 栈和队列都是大家不陌生的数据结构,我们之前的栈和队列一般是用数组或链表来实现的 , 这里我们给出实现方式,用于帮助更好的理解. 1.用链表实现栈 /* 基于链表实现的栈 */ class LinkedListStack { private ListNode sta…

记录我的网站的上线的全过程

我的网站开发全过程记录: 提示: 大部分是cv代码,少部分样式进行了修改和借鉴,主要花费时间在部署上面,出现的问题 开始: 三个博主: 在掘金上认识了搜狐前端-- 英杰 , 掘金链接:yingjieweb 的个人主页 - 动态 - 掘金 偶然间看见了英杰的网站,感觉非常不错,产生自己弄的想法,…

mybatis-spring集成数据库连接池开启注解式开发

目录 1. 引入依赖包 2. 集成配置文件 2.1 开启注解式开发 2.2 spring引入外部配置文件 2.3 数据库连接池 2.4 spring整合mybatis 2.5 自动代理 3. 注解式开发的几个常用注解 4. spring-test 附录一&#xff1a;spring常用注解 1. 引入依赖包 <!--spring整合mybat…