localstorage兼容ie8以下浏览器的问题

2023-05-16

最近在做一个网站,由于希望尽可能减小服务器的压力,也想提高网站的运转速度,就想尽可能少的在服务器上读写数据以及下载重复数据,需要重复使用的数据,就储存在本地,能在本地进行的运算,尽一切可能在本地完成。

 

于是就出现一个本地存储数据的问题。如果ie不是国内最广泛的浏览器,如果ie9(ie8存在一些问题,后面再说)已经得到普及,那么一切就都很简单了,用html5的localstorage,一切都变得异常简单——谷歌浏览器早就支持localstorage了,但ie支持得很晚。

 

问题是,ie8以下的浏览器不支持localstorage;据说ie8支持localstorage,但我把ie升级到ie8之后,任然无法使用localstorage——一开始我以为是我的程序有问题,后来又觉得是ie8安装有问题,重装之后,我最终确定是ie8的升级程序有问题,微软的东西总是这么烂,早已习以为常了——这一来一去,差不多折腾了我三四个小时。

 

于是乎我确定,即便用户浏览器是ie8,也要考虑无法使用localstorage的可能——而且从前段时间别人使用我的网站的情况来看,这种可能性还很大。

 

既然ie8要排除在外,而ie9只能在win7上使用,win7现在又远未达到全面普及的程度——那么就必须解决低版本ie使用localstorage的兼容问题——真是生不逢时,再过几年就根本不用考虑这个兼容问题了。

 

网上有几篇讨论这个问题的文章(都是中文,我读英文网页还是有一定心理障碍),其中被转载最多的是这篇:http://www.cnblogs.com/zjcn/archive/2012/07/03/2575026.html 

 

由于我还属于刚入门的菜鸟级程序员,所以很多东西根本弄不懂,坑爹的是这篇文章给的代码零零散散,没法直接把它的代码直接嵌到程序里,而要弄懂它代码的意思又需要大费周章,另外找到几篇文章,把代码放进去,又会冒出一大堆我搞不懂的错误。

 

于是我决定从最基础的原理开始,自己动手来做兼容程序,别人没有为你定做贴身的程序,就只有靠自己了,好在原理很简单:

 

ie浏览器在很早的时候就支持一种UserData的本地存储功能,不过ie的UserData用起来比localstorage麻烦得不止一点半点(当然二者的差异还不止于此),接下来要做的就是用UserData来模拟localstorage的所有功能。

 

 

localstorage有几项核心功能:

1window.localStorage.getItem( key );——读变量

2window.localStorage.setItem( key, value );——写变量

3window.localStorage.removeItem( key );——删除变量

4window.localStorage.clear(); ——变量初始化

5window.localStorage.length;——本地变量的个数;

6window.localStorage.key( i );——按序号读取变量;

 

对于我做网站来说,最后两个功能基本用不上,我就没写,但要实现也很简单,如果你需要的话可以联系我,我们一起切磋。

 

接下来就是要用UserData前面几项模拟功能,关于UserData的使用方法,我主要是参考了这篇文章:

http://www.jb51.net/article/24086.htm 

不过这篇文章也有几个坑爹的地方,让我浪费了不少时间。

 

等我把UserData和localStorage的基本用法都弄懂了之后,我发现上面那篇介绍兼容方法的文章有不少亮点,但也有很多不如人意的地方——最大的问题是他是采用了用节点储存变量的方法,这样的话变量的总大小不能超过124k,这个规模对我的网站来说太小了,于是我采用了用文件储存的方式,这样变量大小就能达到1M,够用了。

 

敲了几个小时的键盘,反复调试后,这段代码终于可以用了。(代码在下面)

使用方法:

(1)把这段代码放在第一个进行本地存储的语句之前的任何位置;

(2)代码必须在<html>标签内;

(3)不能将本地变量名设为"userdata_record"

(4)不能以 userdataobj 命名变量

(5)加入代码后,如果不使用localStorage.length和localStorage.key( i ),那么你就完全按照localStorage的使用方法进行本地存储就可以了。

 

如果有问题欢迎和我联系。

 

 

 

 

<script language="JavaScript" type="text/javascript">

if(typeof(localStorage)=='undefined')

{var  box = document.body || document.getElementsByTagName("head")[0] || document.documentElement; 

      userdataobj = document.createElement('input'); 

      userdataobj.type = "hidden"; 

      userdataobj.addBehavior ("#default#userData"); 

      box.appendChild(userdataobj);

   //设定对象  

            

 var localStorage= {

      setItem:function(nam,val)

    {userdataobj.load(nam);

 userdataobj.setAttribute(nam,val);

 var d= new Date();

               d.setDate( d.getDate()+700); 

 userdataobj.expires=d.toUTCString(); 

 userdataobj.save(nam);

 userdataobj.load("userdata_record");

 var dt=userdataobj.getAttribute("userdata_record");

 if(dt==null)dt='';

 dt=dt+nam+",";

 userdataobj.setAttribute("userdata_record",dt);

 userdataobj.save("userdata_record");},

//模拟 setItem

 

 getItem:function(nam)

    {userdataobj.load(nam);

 return userdataobj.getAttribute(nam); },

//模拟 getItem

 

 removeItem:function(nam)

    {userdataobj.load(nam);

 clear_userdata(nam)

 userdataobj.load("userdata_record");

 var dt=userdataobj.getAttribute("userdata_record");

 var reg=new RegExp(nam+",","g");

 dt=dt.replace(reg,'');

 var d= new Date();

              d.setDate( d.getDate()+700); 

 userdataobj.expires= d.toUTCString();

 userdataobj.setAttribute("userdata_record",dt);

 userdataobj.save("userdata_record");

},

//模拟 removeItem

 

 clear:function(){

     userdataobj.load("userdata_record");

 var dt=userdataobj.getAttribute("userdata_record").split(","); 

     for (var i in dt)

   {if(dt[i]!='')clear_userdata(dt[i]) }

       clear_userdata("userdata_record")

 }

//模拟 clear();

 

}

function clear_userdata(keyname)//将名字为keyname的变量消除

{var keyname;

 var d= new Date();

          d.setDate( d.getDate()-1);

 userdataobj.load(keyname);

          userdataobj.expires=d.toUTCString();

 userdataobj.save(keyname);

}

}

 

</script>


 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

localstorage兼容ie8以下浏览器的问题 的相关文章

  • Angular2 如何在 HTML5 模板中显示 localStorage 值?

    我在 localStorage 中存储 2 个密钥 我想在我的模板中显示其中之一 我无法访问这些值 我什至创建了一个接口来存储 localStorage 中的 currentUser 键的值 应该如何实施呢 这是当前的代码 Service
  • 可以使用 HTML5 本地存储来存储文件吗?如果没有,怎么办?

    如何通过浏览器机制 插件是可接受的解决方案 在用户计算机上缓存 管理许多大文件 视频 据我所知 本地存储是关于数据库类型的数据 而不是文件 FileSystem API 1 2 将是您未来最好的选择 在某一时刻它是非常前沿的 然而它已经被w
  • 如何加载本地json文件?

    有没有办法使用 about config 配置 Firefox 以允许本地文件访问 用于演示目的 特别是使用 FF12 我需要能够对 json 数据进行本地文件访问 它在服务器上运行良好 但我想让这个演示更加便携 ajax url asse
  • 如何使用 Javascript 将 cookie 存储在本地存储中?

    我有一个适用于 Android 希望以后还有 iPhone 的应用程序 它基于 Javascript 并使用 Phonegap Applaud 制作成应用程序 不幸的是 设置和获取 cookie 在 Android 上不起作用 这可能是 A
  • 频繁使用 localStorage 会减慢我的网站速度吗?

    我正在开发一个 HTML5 游戏 我需要知道频繁更新 localStorage 属性是否会减慢页面速度 我实际上将英雄的位置存储在四个 localStorage 属性中 两个用于实际位置 两个用于碰撞检测系统中使用的过去位置 并每 1 秒间
  • 将表数据保存到 HTML5 LocalStorage

    我创建了一个 JSFiddleHere http jsfiddle net sethe23 j44tyjg6 我想做的是从以下代码保存表数据 save click function dataTable find tbody append t
  • 从本地文件访问 localStorage

    我正在创建 2HTML文件将存储在本地 iPhone 上并通过WebView 我想知道是否可以设置localStorage在一个文件中 并从另一个文件中获取存储结果 我知道localStorage可以从同一域上的文件访问 但是 您似乎无法从
  • 如何在没有数据库的情况下制作自定义表单 - DJANGO

    所以我想上传文件 但只发送到本地存储而不是数据库 但我不知道如何制作自定义表格 突然 这是我的 models py from django db import models class Audio store models Model re
  • 将多个变量传递给内容脚本 chrome

    我正在编写我的第一个 chrome 扩展 几个小时前才开始 当硬编码时一切都运行良好 本质上 我正在填写一份 8 页的表格 表单的每个页面对应一个单独的内容脚本 内容脚本过去看起来像这样 查找字段有点困难 因为它们不是标准的 但我并不担心
  • 错误错误:未捕获(承诺):QuotaExceededError Ionic 3

    我正在使用 ionic 3 创建一个应用程序 我正在 ionic 存储中保存一个字符串 我工作得很好 但突然出现这个错误 Home ts 这是我设置字符串的地方 this storage set 123 JSON stringify dat
  • localStorage 内容带有时间戳以自行删除

    我想要一个本地存储内容的计时器 例如我有一个动态更新的 DIV div p test p div 并设法使用以下代码将其作为 html 块添加到 localStorage function localStorage homeNews JSO
  • 使用 useState 和 useContext React Hooks 持久化 localStorage

    我已经设置了一个提供程序来为用户共享一些状态useContext 因此 我试图利用本地存储来保存用户图像 头像等 的一些状态 首先 我尝试保留用户的头像 本质上是从 Express 中保存他们的 ID 然后在调用 Cloudinary 一种
  • 当 localStorage 已满时会发生什么?

    我已经发现articles http code google com speed page speed docs caching html关于缓存行为 所以我只能假设它没有太大不同 但我想确定一下 我读到大多数浏览器都有 5MB 给予或接受
  • HTML5本地存储VS应用程序缓存离线网站浏览

    看了多篇文章后 我仍然不清楚本地存储和应用程序缓存清单之间的区别 还提到 AppCache 应用程序缓存 Web Storage 的 LocalStorage 吗 https stackoverflow com questions 1098
  • 如何在不破坏localStorage中类型的情况下存储和获取对象?

    我正在使用 TypeScript 开发 AngularJS 项目 A person是一个对象Person班级 我需要存储person对象在localStorage并用它的类型检索它 窗口本地存储 https developer mozill
  • Stackoverflow 使用本地存储进行授权似乎不安全。这是正确的,否则我们如何加强它?

    我一直在研究类似于 stackexchange 的身份验证和授权模块 现在我确信他们使用某种模型的 oAuth 或令牌生成服务器来授权使用他们的各个站点 我尝试了一个小实验 登录 Stackoverflow 后 我会从开发者控制台删除所有
  • 删除 Firefox Web 扩展不会清除 chrome.storage.local

    好像chrome storage local即使卸载了扩展程序 也会继续存储任何数据 此行为在 Chrome 中未观察到 仅在 Firefox 中观察到 关于如何修复它有什么想法吗 这是错误 1213990 https bugzilla m
  • 如何将令牌存储在Android的本地或会话存储中?

    我正在创建一个与 SOAP Web 服务交互以从数据库获取数据的应用程序 当用户成功登录时 它会通过网络服务生成一个令牌 稍后在其他活动中调用 Web 服务方法时将需要此令牌 我的问题是 如何在需要时将该令牌传递给下一个活动并维护它直到用户
  • 将 localStorage 数据设置为只读

    我正在开发 AngularJs 应用程序 我将数据存储在 localStorage 中 localStorageService set selectedUserCategory Circle 现在当我看到浏览器的 localStorage
  • iOS WKWebView不支持本地存储

    我正在构建一个简单的 WKWebView 应用程序 该应用程序加载用 Construct HTML5 编写的游戏 游戏存储在服务器上 当我在常规浏览器 移动和桌面 中玩游戏时 游戏本身会存储在本地 并且高分也会存储在本地 重新启动游戏后不需

随机推荐

  • GPIO

    一 什么是GPIO xff1f 首先应该理解什么是GPIO GPIO xff0c 英文全称为General Purpose IO ports xff0c 也就是通用IO口 在嵌入式系统中常常有数量众多 xff0c 但是结构却比较简单的外部设
  • UART

    一 S3C2410内置的UART控制器 S3C2410内部具有3个独立的UART控制器 xff0c 每个控制器都可以工作在Interrupt xff08 中断 xff09 模式或DMA xff08 直接内存访问 xff09 模式 xff0c
  • vivi源代码最为详细分析(二)

    现在进入bootloader之vivi分析的第二阶段 xff0c 这部分使用C语言实现 xff0c 部分代码采取内嵌汇编的方式 这里需要用到GNU GCC内嵌汇编 的知识 xff0c 这部分基础还没有具备 xff0c 需要学习 下面先按照流
  • vivi源代码最为详细分析(三)

    step 5 xff1a MTD设备初始化 关于什么是MTD xff0c 为什么要使用MTD xff0c MTD技术的架构是什么 xff0c 等等 xff0c 可以参考 Linux MTD源代码分析 xff08 作者 xff1a Jim Z
  • 【笔记】docker-compose.yml 文件更改后重新启动加载更改后的内容

    docker compose yml 文件更改后想使之立刻生效 xff0c 但是不想手动删除已经建立的 container 等信息可以运行下面命令 重新创建容器实现修改 docker compose up force recreate d
  • bootloader开发阶段总结以及可能会碰到的问题

    到今天 xff0c vivi源代码基本分析完毕 对bootloader有了更深层的认识 在此期间 xff0c 仔细阅读了毛德操 胡希明先生编著的 嵌入式系统 采用公开源代码和StrongARM XScale处理器 第七章 xff1a 嵌入式
  • 用模式一实现用户登录功能

    login jsp为显示登录表单和处理登录请求的页面 xff0c 登录成功后跳转到logonSuccess jsp页面 xff0c 登录失败时重新显示登录表单和失败的帮助信息 xff0c 以便用户重新登录 xff1b 如果已登录用户再次访问
  • UDP通信 (C语言实现)

    直接看代码吧 v乛 乛 udp server c 文件信息 文 件 名 udp server c 创 建 人 文件创建日期 年 月 日 描 述 UDP 回射服务器程序
  • jni中使用extern "C"的原因

    首先 cplusplus这个宏是微软自定义宏 xff0c 大小是个整数 xff1a cplusplus This macro is defined when the C 43 43 compiler is in use You can us
  • VmWare虚拟机设置ubuntu和windows之间的共享文件夹

    一般在进行编程作业的时候 xff0c 我们会采用 开发在Windows中编辑源代码 xff0c 在linux中编译 执行源代码 这往往需要需要将在Windows下编辑好的源代码上传到linux系统种进行编译 怎么来进行上传呢 xff1f 其
  • C++的最后一道坎|百万年薪的程序员

    导语 C 43 43 的起源可以追溯到 40 年前 xff0c 但它仍然是当今使用最广泛的编程语言之一 xff0c C 43 43 发明人Bjarne Stroustrup 一开始没想到 C 43 43 会获得如此大的成功 xff0c 他说
  • Modbus 协议

    1 主站 xff1a 可以进行读写操作 从站 xff1a 只能被动响应主站操作 2 一个 Modbus 网络只有一个主站 xff0c 可以多个从站 xff08 主站不用连在两端 xff09 485 通讯 1 接线 最多 254 个站 xff
  • 数据结构对齐

    xfeff xfeff 对齐的算法 xff1a 由于各个平台和编译器的不同 xff0c 现以本人使用的gcc version 3 2 2编译器 xff08 32位x86平台 xff09 为例子 xff0c 来讨论编译器对struct数据结构
  • 关于示波器测485串口波特率的使用方法总结

    之前没有用过示波器 xff0c 更不知道怎么来测试串口的波特率 xff0c 结果遇到一客户说我们产品的波特率达不到9600 xff0c 只有9100 xff0c 为了验证这一说法 xff0c 我们只能自己测试一下 说明 xff1a 产品通过
  • C语言对寄存器封装

    一 封装外设 用C语言代码把外设地址映射用宏定义封装 span class hljs comment 外设基地址 span span class hljs preprocessor define PERIPH BASE unsigned i
  • JavaJDK下载安装与环境配置(Windows 10 超详细的图文版教程 )

    前言 xff1a 对于很多初学者来说 xff0c 我想可能很多人都会遇到JDK环境变量的配置问题 明明就是按照度娘上的教程去一步步配置的 xff0c 但还是会有很多的人出现配置不成功的问题 所以今天在这里分享一下windows 10 系统下
  • win32 获取窗口句柄的方法

    第一种方法是根据窗口句柄值获取窗口句柄 使用spy 43 43 获取指定窗口的窗口句柄值 xff0c 因为句柄值是16进制数 xff0c 所以前面加0x 然后进行强制转换为HWND类型 HWND hWnd 61 HWND 0x0028072
  • 当设置display:inline;时li的宽度无效的解决方法

    若制作导航栏时 xff0c 使用列表li 的定义时 xff0c 若想加上一个背景图 xff0c 这时候若定义li的一个属性为 li display inline width 83px height 30px xff0c 则浏览器会无视后面的
  • js文本框或者按钮鼠标悬停提示说明文字

    html页面中很多元素会用到文本提示 xff0c 当鼠标悬停之后显示一段说明文字 显示说明性文字 function tips id str t 61 getTop document getElementById id document ge
  • localstorage兼容ie8以下浏览器的问题

    最近在做一个网站 xff0c 由于希望尽可能减小服务器的压力 xff0c 也想提高网站的运转速度 xff0c 就想尽可能少的在服务器上读写数据以及下载重复数据 xff0c 需要重复使用的数据 xff0c 就储存在本地 xff0c 能在本地进