【问题标题】:JS how to cache a variableJS如何缓存一个变量
【发布时间】:2020-01-25 20:55:06
【问题描述】:

我想做的是能够创建一个变量,给它一个值,关闭并重新打开窗口,并能够检索我在上次会话中设置的值。最简单的方法是什么?欢迎使用 JQuery 回答。

【问题讨论】:

  • 你关心支持哪些浏览器?
  • 所有主要的都很好,不过如果你的方法不支持 IE,我会理解的。

标签: javascript jquery html


【解决方案1】:

为此使用localStorage。它在会话中持续存在。

写作:

localStorage['myKey'] = 'somestring'; // only strings

阅读:

var myVar = localStorage['myKey'] || 'defaultValue';

如果您需要存储复杂的结构,您可以将它们序列化为 JSON。例如:

阅读:

var stored = localStorage['myKey'];
if (stored) myVar = JSON.parse(stored);
else myVar = {a:'test', b: [1, 2, 3]};

写作:

localStorage['myKey'] = JSON.stringify(myVar);

请注意,您可以使用多个密钥。它们都将被同一域上的所有页面检索。

除非您想与 IE7 兼容,否则您没有理由使用过时的小型 cookie。

【讨论】:

  • 这取决于缓存吗?即,如果我清除缓存,它会被删除吗?
  • 在任何浏览器中,您都可以选择要删除的内容。但是,除非您要求,否则仅清空缓存不会清除本地存储。
  • 另外,你写了“只有字符串”。是否可以存储数组/对象?
  • @Bluefire 这意味着您必须处理其他类型的序列化。我添加了一个示例。
  • @Bluefire 您可以将对象和数组存储为 JSON 字符串。
【解决方案2】:

您有三个选择:

  1. 饼干:https://developer.mozilla.org/en-US/docs/DOM/document.cookie
  2. DOMStorage(sessionStorage 或 localStorage):https://developer.mozilla.org/en-US/docs/DOM/Storage
  3. 如果您的用户已登录,您可以将数据保存在服务器的数据库中,这些数据与用户(或组)相关

【讨论】:

【解决方案3】:

如果您的要求允许,您可以创建一个 cookie。如果您选择采用 cookie 路由,则解决方案可能如下。使用 cookie 的好处是在用户关闭浏览器并重新打开后,如果 cookie 没有被删除,则该值将被保留。

Cookie *创建和存储 Cookie:*

function setCookie(c_name,value,exdays)
{
var exdate=new Date();
exdate.setDate(exdate.getDate() + exdays);
var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
document.cookie=c_name + "=" + c_value;
}

返回指定cookie的函数:

function getCookie(c_name)
{
var i,x,y,ARRcookies=document.cookie.split(";");
for (i=0;i<ARRcookies.length;i++)
{
  x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
  y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
  x=x.replace(/^\s+|\s+$/g,"");
  if (x==c_name)
    {
    return unescape(y);
    }
  }
}

如果设置了 cookie,则显示欢迎消息

function checkCookie()
{
var username=getCookie("username");
  if (username!=null && username!="")
  {
  alert("Welcome again " + username);
  }
else 
  {
  username=prompt("Please enter your name:","");
  if (username!=null && username!="")
    {
    setCookie("username",username,365);
    }
  }
}

上述解决方案是通过 cookie 保存价值。这是一种非常标准的方式,无需将值存储在服务器端。

jQuery

为会话存储设置一个值。

Javascript:

$.sessionStorage( 'foo', {data:'bar'} );

检索值:

$.sessionStorage( 'foo', {data:'bar'} );

$.sessionStorage( 'foo' );Results:
{data:'bar'}

本地存储 现在让我们看一下本地存储。例如,假设您有一个想要保留的变量数组。你可以这样做:

var names=[];
names[0]=prompt("New name?");
localStorage['names']=JSON.stringify(names);

//...
var storedNames=JSON.parse(localStorage['names']);

使用 ASP.NET 的服务器端示例

添加到会话

Session["FirstName"] = FirstNameTextBox.Text;
Session["LastName"] = LastNameTextBox.Text;

// 从会话状态中检索对象时,将其强制转换为 // 合适的类型。

ArrayList stockPicks = (ArrayList)Session["StockPicks"];

// Write the modified stock picks list back to session state.
Session["StockPicks"] = stockPicks;

我希望这回答了你的问题。

【讨论】:

  • 在 ASP.NET 示例之前很好...虽然这是我使用的服务器端环境,并且通常喜欢它,但它并不能很好地解决 OP 问题的需求...如果在全部。清除您的浏览器 cookie,.NET 将无法将浏览器实例连接到您的服务器端“会话”
  • 同意,我提供的服务器端示例,我认为它不应该成为答案的一部分,因为 OP 没有提到他是否使用 ASP.NET,但我只是为了提供信息而添加.
  • 服务器端存储将数据放入 Session 中。但是我们如何在 javascript 中访问 Session 呢?
【解决方案4】:

查看我的 js 库以进行缓存: https://github.com/hoangnd25/cacheJS

我的博文: New way to cache your data with Javascript

特点:

  • 方便地使用数组作为键来保存缓存
  • 支持数组和本地存储
  • 按上下文清除缓存(清除所有 authorId="abc" 的博文)
  • 无依赖性

基本用法:

保存缓存:

cacheJS.set({blogId:1,type:'view'},'<h1>Blog 1</h1>');
cacheJS.set({blogId:2,type:'view'},'<h1>Blog 2</h1>', null, {author:'hoangnd'});
cacheJS.set({blogId:3,type:'view'},'<h1>Blog 3</h1>', 3600, {author:'hoangnd',categoryId:2});

检索缓存:

cacheJS.get({blogId: 1,type: 'view'});

刷新缓存

cacheJS.removeByKey({blogId: 1,type: 'view'});
cacheJS.removeByKey({blogId: 2,type: 'view'});

cacheJS.removeByContext({author:'hoangnd'});

切换提供商

cacheJS.use('array');
cacheJS.use('array').set({blogId:1},'<h1>Blog 1</h1>')};

【讨论】:

    【解决方案5】:

    我写了一个通用的caching func(),它可以很容易地缓存任何变量,而且格式可读性很强。 缓存功能:

    function calculateSomethingMaybe(args){
      return args;
    }
    
    function caching(fn){
      const cache = {};
      return function(){
        const string = arguments[0];
        if(!cache[string]){
          const result = fn.apply(this, arguments);
          cache[string] = result;
          return result;
        }
        return cache[string];
      }
    }
    
    const letsCache = caching(calculateSomethingMaybe);
    
    console.log(letsCache('a book'), letsCache('a pen'), letsCache('a book'));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-06
      • 1970-01-01
      • 2020-10-09
      • 2017-06-05
      • 2011-10-26
      • 2012-09-15
      • 1970-01-01
      • 2015-06-04
      相关资源
      最近更新 更多