【问题标题】:Intercept localStorage.getItem()拦截 localStorage.getItem()
【发布时间】:2013-12-21 18:08:41
【问题描述】:

有没有办法拦截对 localStorage 的调用?或者可能存在一些处理程序?

如果我在类似 localStorage.getItem() 之类的代码脚本中有某处,我需要知道存储将获取一些项目,并且我想防止这种情况,并做一些我需要的事情。

我想为移动 Web 开发人员编写一个框架。我希望他们以通常的方式使用本地存储调用。我的框架将拦截这些调用,并将数据不放到 W3C 存储中,而是放到本机设备存储中。那可能吗?谢谢。

【问题讨论】:

  • localStorage.getItem = function(){ return "no!" }.
  • 假设这不是对某些安全功能的注定尝试,我们需要更多地了解用例来设计相关的答案。
  • @dystroy localStorage.itemName 仍然可以工作...
  • 为什么不简单地提供一个 API 呢?更改标准 API 是一种糟糕的做法。
  • 我认为使用ES6's proxies 是可能的(假设浏览器不保护这个本机对象)。目前我认为这是不可能的。

标签: javascript local-storage web-storage


【解决方案1】:

您可以使用原型。试试这样的:

 Storage.prototype._setItem = Storage.prototype.setItem;
        Storage.prototype.setItem = function (key, value)
        {
            alert("works");
        }

    localStorage.setItem("A", "A");

如果您需要进一步说明,请随时提出。

【讨论】:

  • 太棒了。这就是我要找的……谢谢!!
【解决方案2】:

您可以使用在 window 上触发的 storage 事件跟踪 localStorage 和 sessionStorage 的更改-

在所有打开的选项卡或来自同一来源的页面上触发该事件。

function storageHandler(e){
    var info={
        key:e.key, oldV:e.oldValue, newV:e.newValue, url:e.url || e.uri
    };
    //do something with info
}
window.addEventListener('storage', storageHandler, false);

特殊存储事件属性:

key- the named key that was added, removed, or modified
oldValue- the previous value(now overwritten), or null if a new item was added
newValue-the new value, or null if an item was removed
url or uri-     the page which called a method that triggered this change

您可能需要测试以下 IE #9(attachEvent 和全局事件处理)和 localStorage 支持。

【讨论】:

    【解决方案3】:

    您可以用自己的变量替换整个 localStorage 变量,尽管您可能无法复制 API 的每个部分...

    var localStorage = (function () {
        return {
            setItem: function (key, value) {
                alert(key);
            }
        };
    }());
    
    localStorage.setItem('a', 'b');
    

    您将需要实现相同的接口,以便您的代码不可见地插入,但这个带有setItem 的示例向您展示了如何做到这一切。

    如果您将旧的 localStorage 弹出到变量中以保留它,您仍然可以调用它。

    我还没有实现你要测试的任何条件来决定是否将它存储在其他地方。

    当然,你可以稍微改变它,让它成为一个库而不是一个拦截器,给它一个不同的名字......这允许你实现一个固定的 API 供人们遵循。

    var storageLibrary = (function () {
        return {
            setItem: function (key, value) {
                alert(key);
                if (true) {
                    localStorage.setItem(key, value);
                } else {
                    // Save it somewhere else   
                }
            }
        };
    }());
    
    storageLibrary.setItem('a', 'b');
    

    【讨论】:

    • 这将不允许 OP 要求:拦截 localStorage[someRandomKey] 以提供备用存储。
    • 感谢您的回答。你试过你的第一个例子吗?它不适合我。 alert(key) - 不触发。
    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 2013-06-25
    • 2018-08-09
    • 2014-03-10
    • 2023-03-13
    • 1970-01-01
    • 2018-12-25
    • 2014-06-29
    相关资源
    最近更新 更多