JS-WebAPIs-本地存储(五)

news2024/11/26 16:41:16

• 本地存储介绍

  • 以前我们页面写的数据一刷新页面就没有了,是不是?
  • 随着互联网的快速发展,基于网页的应用越来越普遍,同时也变的越来越复杂,为了满足各种各样的需求,会经常 性在本地存储大量的数据,HTML5规范提出了相关解决方案。
  • 1、数据存储在用户浏览器
  • 2、设置、读取方便、甚至页面刷新不丢失数据
  • 3、容量较大,sessionStorage和localStorage约 5M 左右

• 本地存储分类

  • localStorage

作用: 可以将数据永久存储在本地(用户的电脑), 除非手动删除,否则关闭页面也会存在

特性:

Ø 可以多窗口(页面)共享(同一浏览器可以共享)

Ø 以键值对的形式存储使用

语法:

浏览器查看本地数据: 

  •  sessionStorage

特性:

Ø 生命周期为关闭浏览器窗口
Ø 在同一个窗口(页面)下数据可以共享
Ø 以键值对的形式存储使用
Ø
用法跟localStorage 基本相同

1. localStorage 作用是什么?

  • 可以将数据永久存储在本地(用户的电脑), 除非手动删除,否则关闭页面也会存在

2. localStorage 存储,获取,删除的语法是什么?

  • 存储:localStorage.setItem(key, value)
  • 获取:localStorage.getItem(key)
  • 删除:localStorage.removeItem(key)

• 存储复杂数据类型

本地只能存储字符串,无法存储复杂数据类型.

 保存复杂数据

解决:需要将复杂数据类型转换成JSON字符串,在存储到本地 

语法:JSON.stringify(复杂数据类型)

  • 将复杂数据转换成JSON字符串 存储 本地存储中 

获取数据 

解决:把取出来的字符串转换为对象

语法:JSON.parse(JSON字符串)

  • 将JSON字符串转换成对象 

数组中map方法 迭代数组 

数组中join方法

综合案例:

学生就业信息表 

需求: 录入学生信息,页面刷新数据不丢失

模块分析:
①:新增模块, 输入学生信息,数据会存储到本地存储中
②:渲染模块,数据会渲染到页面中
③:删除模块,点击删除按钮,会删除对应的数据

<!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>
  <link rel="stylesheet" href="./iconfont/iconfont.css">
  <link rel="stylesheet" href="css/index.css" />
</head>

<body>
  <h1>学生就业统计表</h1>
  <form class="info" autocomplete="off">
    <input type="text" class="uname" name="uname" placeholder="姓名" required />
    <input type="text" class="age" name="age" placeholder="年龄" required />
    <input type="text" class="salary" name="salary" placeholder="薪资" required />
    <select name="gender" class="gender">
      <option value="男">男</option>
      <option value="女">女</option>
    </select>
    <select name="city" class="city">
      <option value="北京">北京</option>
      <option value="上海">上海</option>
      <option value="广州">广州</option>
      <option value="深圳">深圳</option>
      <option value="曹县">曹县</option>
    </select>
    <button class="add">
      <i class="iconfont icon-tianjia"></i>添加
    </button>
  </form>

  <div class="title">共有数据<span>0</span>条</div>
  <table>
    <thead>
      <tr>
        <th>ID</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>性别</th>
        <th>薪资</th>
        <th>就业城市</th>
        <th>录入时间</th>
        <th>操作</th>
      </tr>
    </thead>
    <tbody>
      <!-- <tr>
        <td>1</td>
        <td>迪丽热巴</td>
        <td>23</td>
        <td>女</td>
        <td>12000</td>
        <td>北京</td>
        <td>2099/9/9 08:08:08</td>
        <td>
          <a href="javascript:">
            <i class="iconfont icon-shanchu"></i>
            删除
          </a>
        </td>
      </tr> -->
    </tbody>
  </table>
  <script>



    const tbody = document.querySelector('tbody')
    const info = document.querySelector('.info')
    const uname = document.querySelector('.uname')
    const age = document.querySelector('.age')
    const salary = document.querySelector('.salary')
    const gender = document.querySelector('.gender')
    const city = document.querySelector('.city')
    const count = document.querySelector('.title span')
    // console.log(count);


    // const obj = {
    //   stuId: 1,
    //   uname: '李白',
    //   age: 18,
    //   gender: '男',
    //   salary: '12000',
    //   city: '深圳',
    //   time: '2099/9/9 08:08:08',
    // }

    //做测试:将对象加入本地存储中
    // arr.push(obj)
    // arr.push(obj)
    // localStorage.setItem('data',JSON.stringify(arr))


    //1 渲染数组数据
    // //1.1声明一个空数组
    // let arr =[]
    //1.2从本地存储中获取数据
    const arr = JSON.parse(localStorage.getItem('data')) || []
    console.log(arr);

    // 1.3 声明一个函数,渲染数据
    function render() {

      //使用map函数来处理数组数据,返回一个新的数组
      const newArr = arr.map(function (ele, index) {
        return `
          <tr>
            <td>${ele.stuId}</td>
            <td>${ele.uname}</td>
            <td>${ele.age}</td>
            <td>${ele.gender}</td>
            <td>${ele.salary}</td>
            <td>${ele.city}</td>
            <td>${ele.time}</td>
            <td>
              <a href="javascript:" data-id="${index}">
                <i class="iconfont icon-shanchu"></i>
                删除
              </a>
            </td>
          </tr>
         `
      })
      //使用join函数将arr转化成一个字符串对象
      // let content = newArr.join('')
      // console.log(content);
      //将内容加入到tbody中
      tbody.innerHTML = newArr.join('')
      //更改统计的数字
      count.innerHTML = arr.length

    }
    //调用渲染函数
    render()


    //2 向数组中添加数组
    //2.1 当用户点击添加按钮,将数据追加到数组中
    info.addEventListener('submit', function (e) {
      //2.2阻止表单的默认行为
      e.preventDefault()
      // console.log(111);

      //2.3初始化对象
      const obj = {
        stuId: arr.length > 0 ? arr[arr.length - 1].stuId + 1 : 1,
        uname: uname.value,
        age: age.value,
        gender: gender.value,
        salary: salary.value,
        city: city.value,
        time: new Date().toLocaleString(),
      }
      //将数据追加到arr数组中
      arr.push(obj)

      //将数据加入到本地存储中
      localStorage.setItem('data', JSON.stringify(arr))

      //重置表单
      this.reset()
      //调用渲染函数
      render()
    })


    //3.删除表单中的元素
    //3.1为所有的a添加单击事件--使用事件委托给tBody添加单击事件
    tbody.addEventListener('click', function (e) {

      //3.2只用点击a单击才生效
      if (e.target.tagName === 'A') {
        // console.log(111);
        //3.3删除元素
        //获取元素a的自定义属性
        // console.log(e.target.dataset.id)
        if (confirm('你确定要删除这条数据吗?')) {
          arr.splice(e.target.dataset.id, 1)

          //3.4 将输入保存到本地中
          localStorage.setItem('data', JSON.stringify(arr))

          //3.5 重新渲染
          render()
        }
      }
    })

  </script>
</body>

</html>

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

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

相关文章

python类继承之__init__函数覆盖问题

目录 1.问题描述 2.代码演示 3.总结 在Python这个广受欢迎的编程语言中&#xff0c;类继承是一项强大而精巧的特性。通过类继承&#xff0c;我们可以构建出更加灵活、可重用和易维护的代码&#xff0c;同时实现代码的模块化和扩展性。 但是如果对于熟悉C和java的人而言&…

Flink实战之运行架构

本文章&#xff1a;重点是分析清楚运行架构以及并行度与slot的分配 1、JobManager和TaskManager Flink中的节点可以分为JobManager和TaskManager。 JobManager处理器也称为Master&#xff0c;用于协调分布式任务执行。他们用来调度task进行具体的任务。TaskManager处理器也称…

蓝桥杯真题(Python)每日练Day2

题目 题目分析 对于本题首先确定其数据结构为优先队列&#xff0c;即邮费最小的衣服优先寄&#xff0c;算法符合贪心算法。可以直接使用queue库的PriorityQueue方法实现优先队列。关于PriorityQueue的使用方法主要有&#xff1a; import queue q queue.Queue()# 队列 pq qu…

【JavaEE】文件操作 —— IO

文件操作 —— IO 1. 文件的属性 文件内容文件大小文件路径文件名称 2. 文件的管理 采用树形结构进行管理。 3. 文件路径 分为两种&#xff1a;相对、绝对路径。 相对路径&#xff1a;相对于当前位置的路径&#xff0c;以“./xxx.xxx”为标志绝对路径&#xff1a;以从盘符…

【工具使用-win10最近使用的文件】怎样关闭win10系统最近使用的文件功能

一&#xff0c;简介 有时候我们不想打开文件管理器的时候&#xff0c;就出现之前访问过的文件或者文件夹&#xff0c;本文就介绍在win10系统下如何关闭“最近使用文件”的功能。 二&#xff0c;操作步骤 打开资源管理器&#xff0c;点击“选项” 按照如下步骤操作&#xff…

树结构实战,获取文件夹大小

文件IO是一个耗时操作&#xff0c;要尽量避免频繁读取磁盘。 而我们需要分析磁盘的占用空间&#xff0c;无法避免需要读取&#xff0c;但是期望只通过一次文件IO操作&#xff0c;来获取到所有某个目录下所有文件夹的信息。 所以需要一种方式可以仅进行一轮磁盘操作&#xff0…

【Linux】安装n卡驱动以及可能遇到的问题

文章目录 1.换源以及更新2.安装依赖3. 安装n卡驱动独显与核显切换nvidia-settings消失忘记安装依赖无法进入图形化界面的急救命令行无响应办法 1.换源以及更新 目前&#xff0c;换源完全只需要鼠标点点点就可以完成了&#xff0c;打开应用列表里的Software & Updates&…

vue3-模版引用

模版引用 ref 属性 场景&#xff1a;需要直接访问底层 DOM 元素。 方法&#xff1a;使用特殊的 ref 属性。 <input ref"input">ref 属性 允许我们在一个特定的 DOM 元素或子组件实例被挂载后&#xff0c;获得对它的直接引用。 访问模板引用 小 Demo: 当 i…

rk1126, 实现 yolov8 目标检测

基于 RKNN 1126 实现 yolov8 目标检测 Ⓜ️ RKNN 模型转换 ONNX yolo export model./weights/yolov8s.pt formatonnx导出 RKNN 这里选择输出 concat 输入两个节点 onnx::Concat_425 和 onnx::Concat_426 from rknn.api import RKNNONNX_MODEL ./weights/yolov8s.onnxRKNN_MOD…

flink operator 拉取阿里云私有镜像(其他私有类似)

创建 k8s secret kubectl --namespace flink create secret docker-registry aliyun-docker-registry --docker-serverregistry.cn-shenzhen.aliyuncs.com --docker-usernameops_acr1060896234 --docker-passwordpasswd --docker-emailDOCKER_EMAIL注意命名空间指定你使用的 我…

使用 vsCode创建GO项目

最近回顾了一下go的使用&#xff1a;具体操作看下面的参考连接&#xff0c;下面只描述一些踩过的坑&#xff1a; 1. go安装配置 安装go->配置go环境变量 推荐官网下载&#xff0c;速度很快&#xff1b; 这里需要配置五个参数&#xff1a;GOPATH/GOROOT/Path、GO111MODULE/…

GitHub提交 / 拉取时 443 fatal: unable to access ‘https:

这个问题嘛 懂得都懂 但是用了魔法后依旧会出现443错误 排查了工具发现并不是工具的问题 修改一下git代理即可解决 解决方法如下 确保魔法可用的情况下 打开魔法 打开系统设置 > 网络和Internet > 代理 找到自己的代理IP 如下 这里以我的代理IP和端口举例 在…

【工具】使用ssh进行socket5代理

文章目录 shellssh命令详解正向代理&#xff1a;反向代理&#xff1a;本地 socks5 代理 shell ssh -D 3333 root192.168.0.11 #输入密码 #3333端口已经使用远程机进行转发设置Windows全局代理转发 socks127.0.0.1 3333如果远程机为公网ip&#xff0c;可通过搜索引擎查询出网…

【C语言】数据在内存中的存储知识点(1)

一、整数在内存中的存储 二、大小端字节序和字节序判断 三、浮点数在内存中的存储

Linux的IO文件操作和文件系统

前要&#xff1a;本次我想给您带来关于 IO 和文件的知识&#xff0c;而文件在本系列中分为内存上的文件和磁盘上的文件。 1.文件概念 1.1.文件读写 在谈及系统接口之前&#xff0c;我们先来从 C 语言的角度来谈及一些前要知识&#xff0c;以辅助我们后续来理解系统 IO。 我们…

burp靶场--文件上传

burp靶场–文件上传 https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-web-shell-upload 1.文件上传 1、原理&#xff1a;文件上传漏洞是指Web服务器允许用户将文件上传到其文件系统&#xff0c;而不充分验证文件的名称、类型、…

Shell 脚本实现自动启动程序、日志管理和定时任务监控

简介 本篇将通过Shell 脚本实现自动启动Java程序、日志管理和定时任务监控。脚本启动程序具灵活定制、可移植性和扩展性强的优点&#xff0c;可以根据需要添加额外的功能、配置选项和自定义行为&#xff0c;从而满足更具体的要求。 脚本编写 vim start_program.sh#!/bin/bas…

Lambda支持的方法引用

目录 引用类中的静态方法替换lambda引用对象实例化方法替换lambda引用类中的实例方法替换lambda引用构造器替换lambda 引用类中的静态方法替换lambda 引用类方法&#xff1a;引用类的静态方法&#xff1b;类名::静态方法名 demo: 将String类型数据转换成为Integer类型 创建一个…

MySQL 8.3 发布, 它带来哪些新变化?

1月16号 MySQL 官方发布 8.3 创新版 和 8.0.36 长期支持版本 (该版本 没有新增功能&#xff0c;更多是修复bug )&#xff0c;本文基于 官方文档 说一下 8.3 版本带来的变化。 一 增加的特性 1.1 GTID_NEXT 支持增加 TAG 选项。 之前的版本中 GTID_NEXTUUID:number &#xff…

Ant下载及安装

文章目录 前言一、Ant下载二、Ant安装三、Ant配置环境变量 前言 Ant是一个帮助构建软件的Java库和命令行工具。Ant是一个Java库和命令行工具&#xff0c;其任务是将构建文件中描述的过程驱动为相互依赖的目标和扩展点。Ant的主要已知用途是构建Java应用程序。Ant提供了许多内置…