拦截localStorage.getItem()

时间:2013-12-20 14:32:12

标签: javascript local-storage web-storage

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

如果我在代码脚本中有某个地方,比如localStorage.getItem(),我需要知道存储会获得一些项目,我想阻止它,并做我需要的事情。

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

3 个答案:

答案 0 :(得分:1)

您可以使用原型。尝试类似的东西:

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

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

如果您需要进一步澄清,请随时提出。

答案 1 :(得分:0)

您可以用自己的变量替换整个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');

答案 2 :(得分:0)

您可以使用在窗口上触发的存储事件跟踪对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

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