HTML5本地存储有用函数 // JavaScript, TypeScript

22
如何:
  • 检查是否支持localStorage
  • 检查localStorage是否有项目
  • 获取localStorage中剩余的空间量
  • 获取localStorage中的最大空间量
  • 获取localStorage中使用的空间量
  • 获取localStorage的备份
  • 将备份应用到localStorage
  • 在控制台中转储localStorage的所有信息
常见问题解答:
  • [链接] 如何在localStorage中存储对象
  • [链接] 如何在localStorage中存储数组
  • [链接] 如何在localStorage中保存图像
  • [链接] localStorage 教程(还涵盖了“存储事件”和“需要记住的事项”)
相关内容:
  • [链接] Web 存储的一般信息
  • [链接] 当页面会话结束时,sessionStorage 存储数据将被清除
  • [链接] indexedDB 是用于客户端结构化数据存储的底层 API

2
嘿,虽然我们通常鼓励撰写长而详细的问答,但这篇文章更像是一个标签维基。它没有按照问题和答案的形式进行格式化,并且没有解决或详细说明任何特定的问题。 - Madara's Ghost
2
正如您所看到的,我花了相当多的时间回答这8个问题和问题。虽然它们可以作为单独的问答帖子发布,但我觉得它们可以在一个干净的主题中一起回答,作为以后问题、搜索和一般帮助的参考。如果需要,我可以将其发布为5个问题。然而,如果这太过分了,我保证再也不会滥用StackOverflow来回答问题了。 - CoderPi
2
@CodeiSir,非常感谢您在这里提供的代码。谢谢。 - SimonBiggs
1个回答

26

我的JavaScript和TypeScript中用于localStorage的函数套件

  • isSupported:检查浏览器是否支持本地存储。
  • hasItem(key):检查是否存在与指定键匹配的项目。
  • getSpaceLeft():获取剩余可用空间。
  • getMaximumSace():获取本地存储的最大容量。
  • getUsedSpace():获取已使用的本地存储空间。
  • getItemUsedSpace():为指定键的项目获取已使用的存储空间。
  • getBackup():获取当前本地存储的备份。
  • applyBackup(backup, fClear, fOverwriteExisting):将给定备份应用到本地存储。
  • consoleInfo(fShowMaximumSize):在控制台中显示关于本地存储的信息。


GitHubGist上作为LocalStorage模块的完整代码:JavaScriptTypeScript
Live example: 在JSFiddle上查看示例


检查是否支持localStorage - TypeScript-Version

/**
  * Flag set true if the Browser supports localStorage, without affecting it
  */
var localStorage_isSupported = (function () {
    try {
        var itemBackup = localStorage.getItem("");
        localStorage.removeItem("");
        localStorage.setItem("", itemBackup);
        if (itemBackup === null)
            localStorage.removeItem("");
        else
            localStorage.setItem("", itemBackup);
        return true;
    }
    catch (e) {
        return false;
    }
})();


检查localStorage是否存在某个项目 - TypeScript版本

/**
 * Check if localStorage has an Item / exists with the give key
 * @param key the key of the Item
 */
function localStorage_hasItem(key) {
    return localStorage.getItem(key) !== null;
}

获取localStorage中剩余空间的大小 - TypeScript版本
/**
 * This will return the left space in localStorage without affecting it's content
 * Might be slow !!!
 */
function localStorage_getRemainingSpace() {
    var itemBackup = localStorage.getItem("");
    var increase = true;
    var data = "1";
    var totalData = "";
    var trytotalData = "";
    while (true) {
        try {
            trytotalData = totalData + data;
            localStorage.setItem("", trytotalData);
            totalData = trytotalData;
            if (increase)
                data += data;
        }
        catch (e) {
            if (data.length < 2) {
                break;
            }
            increase = false;
            data = data.substr(data.length / 2);
        }
    }
    if (itemBackup === null)
        localStorage.removeItem("");
    else
        localStorage.setItem("", itemBackup);
    return totalData.length;
}


获取localStorage中的最大空间 - TypeScript-Version

/**
 * This function returns the maximum size of localStorage without affecting it's content
 * Might be slow !!!
 */
function localStorage_getMaximumSize() {
    var backup = localStorage_getBackup();
    localStorage.clear()
    var max = localStorage_getRemainingSpace();
    localStorage_applyBackup(backup);
    return max;
}


获取localStorage中已使用的空间 - TypeScript-Version

/**
 * This will return the currently used size of localStorage
 */
function localStorage_getUsedSize() {
    var sum = 0;
    for (var i = 0; i < localStorage.length; ++i) {
        var key = localStorage.key(i)
        var value = localStorage.getItem(key);
        sum += key.length + value.length;
    }
    return sum;
}


获取 TypeScript-Version 使用的空间

/**
 * This will return the currently used size of a given Item,returns NaN if key is not found
 * @param key
 */
function getItemUsedSpace(key) {
    var value = localStorage.getItem(key);
    if (value === null) {
        return NaN;
    }
    else {
        return key.length + value.length;
    }
}


备份关联数组,仅TypeScript-Version


获取localStorage的备份 - TypeScript版本

/**
 * This will return a localStorage-backup (Associative-Array key->value)
 */
function localStorage_getBackup() {
    var backup = {};
    for (var i = 0; i < localStorage.length; ++i) {
        var key = localStorage.key(i);
        var value = localStorage.getItem(key);
        backup[key] = value;
    }
    return backup;
}


将备份应用到localStorage - TypeScript版本

/**
 * This will apply a localStorage-Backup (Associative-Array key->value)
 * @param backup            associative-array 
 * @param fClear             optional flag to clear all existing storage first.Default:true
 * @param fOverwriteExisting optional flag to replace existing keys. Default: true
 */
function localStorage_applyBackup(backup, fClear, fOverwriteExisting) {
    if (fClear === void 0) { fClear = true; }
    if (fOverwriteExisting === void 0) { fOverwriteExisting = true; }
    if (fClear == true) {
        localStorage.clear();
    }
    for (var key in backup) {
        if (fOverwriteExisting === false && backup[key] !== undefined) {
            continue;
        }
        var value = backup[key];
        localStorage.setItem(key, value);
    }
}


在控制台中转储localStorage的所有信息-TypeScript版本

/**
 * This functions dumps all keys and values of the local Storage to the console,
 * as well as the current size and number of items
 * @param fShowMaximumSize optional, flag show maximum size of localStorage. Default: false
 */
function localStorage_consoleInfo(fShowMaximumSize) {
    if (fShowMaximumSize === void 0) { fShowMaximumSize = false; }
    var amount = 0;
    var size = 0;
    for (var i = 0; i < localStorage.length; ++i) {
        var key = localStorage.key(i)
        var value = localStorage.getItem(key);
        console.log(amount, key, value);
        size += key.length + value.length;
        amount++;
    }
    console.log("Total entries:", amount);
    console.log("Total size:", size);
    if (fShowMaximumSize === true) {
        var maxSize = localStorage_getMaximumSize();
        console.log("Total size:", maxSize);
    }
}

注释

  • 每个键和值都使用与其字符串长度相等的确切空间量
  • 我的测试中允许的最大存储空间:约5MB
    • 5000000 Edge
    • 5242880 Chrome
    • 5242880 Firefox
    • 5000000 IE
  • Firefox问题:不要使用for (var key in localStorage),而是使用:for (var i = 0; i < localStorage.length; ++i) { var key = localStorage.key(i)for..in循环会将localStorage成员函数作为key

// Example - http://jsfiddle.net/1rqtd7pg/1/

console.log("LocalStorage supported:", LocalStorage.isSupported)
// true - I hope so anyways 
if(LocalStorage.isSupported) {
    localStorage.setItem("asd", "ASDASD")                           
    // sets / overwrites the item "asd"
    localStorage.setItem("asd" + Math.random(), "ASDASD")           
    // set another item each time you refresh the page
    var backup = LocalStorage.getBackup()                           
    // creates a backup, we will need it later!
    console.log(JSON.stringify(backup))                             
    // this is how the backup looks like
    var usedSpace = LocalStorage.getUsedSpace()                     
    // amount of space used right now
    console.log("Used Space:", usedSpace)
    var maxSpace = LocalStorage.getMaximumSpace()                   
    // amount of maximum space aviable
    console.log("Maximum Space:", maxSpace)
    var remSpace = LocalStorage.getRemainingSpace()                 
    // amount of remaining space
    console.log("Remaining Space:", remSpace)
    console.log("SpaceCheck", maxSpace === usedSpace + remSpace)    
    // true
    console.log("hasItem", LocalStorage.hasItem("nothis0ne"))       
    // we don't have this one in our localStorage
    localStorage.clear()                                            
    // oops, we deleted the localStorage!
    console.log("has asd", LocalStorage.hasItem("asd"))              
    // item asd is lost 
    LocalStorage.applyBackup(backup)                                
    // but we have a backup, restore it!
    LocalStorage.consoleInfo()                                      
    // show all the info we have, see the backup worked 
}

这是一个npm包吗?如果不是,你能否制作一个并在dev.to上写一篇文章介绍它?我认为你会得到很多贡献者。 - Tamb
@Tamb 我创建了我的第一个npm包,请告诉我任何反馈 https://www.npmjs.com/package/localstorage-ext :) - CoderPi
这些功能很棒,但命名与示例不一致。要使用上述功能的示例,请将示例中的LocalStorage更名为localStorage_,然后将_getUsedSpace更名为_getUsedSize,将_getMaximumSpace更名为_getMaximumSize。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接