2013-12-20 5 views
0

Есть ли способ перехватить вызовы на localStorage? Или, может быть, некоторые обработчики существуют?Перехват localStorage.getItem()

Если у меня есть код сценария, такой как localStorage.getItem() Мне нужно знать, что хранилище собирается получить какой-то элемент, и я хочу предотвратить это и сделать что-то, что мне нужно.

Я хочу написать рамки для мобильных веб-разработчиков. Я хочу, чтобы они использовали обычные вызовы 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

Awesome. Это то, что я искал ... Спасибо! – 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

Спасибо за ответ. Вы попробовали свой первый пример? Это не работает для меня. alert (ключ) - не срабатывает. – 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 

Вы, возможно, потребуется проверить IE ниже # 9 (attachEvent и глобальные обработки событий) и поддержку LocalStorage.

Смежные вопросы