2013-12-20 144 views
0

有什麼辦法來攔截調用localStorage?或者也許有一些處理程序存在?攔截localStorage.getItem()

如果我有像localStorage.getItem代碼腳本(),我需要知道存儲會得到一些項目,我想避免這種情況,並做一些我需要的地方。

我想爲移動web開發人員編寫一個框架。我希望他們以通常的方式使用localstorage調用。我的框架將攔截這些調用,並將數據放到W3C存儲中,而不是本地設備存儲。那可能嗎?謝謝。

+0

'localStorage.getItem = function(){return「no!」 }'。 –

+4

假設這不是一個安全功能的註定嘗試,我們需要更多地瞭解用例來設計相關答案。 –

+0

@dystroy'localStorage.itemName'仍然可以工作... – tborychowski

回答

1

您可以使用原型。嘗試類似的東西:

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

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

如果你需要進一步澄清,隨便問。

+0

太棒了。這就是我一直在尋找...謝謝! – Jim

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'); 
+0

這不會允許OP要求:攔截localStorage [someRandomKey]來提供備用存儲。 –

+0

感謝您的回答。你有沒有試過你的第一個例子?它不適合我。警報(鍵) - 不會觸發。 – Jim

+0

工作演示... http://jsfiddle.net/VZ94y/ – Fenton

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的支持。