Событие storage
сообщает вам, какой ключ изменился через его свойство key
, поэтому вы можете использовать его, чтобы решить, следует ли делать alert
:
window.addEventListener('storage', function(e) {
if (e.key === "Data") {
alert('Woohoo, someone changed my localstorage!');
}
});
Обратите внимание, что событие будет запущено, только если значение будет изменено в другом окне, а не в том же окне. (Я предполагаю, что вы знаете это, поскольку вы сказали, что получаете alert
.) Если вы запустили страницу на двух вкладках, например, нажатие кнопок на одной вкладке вызовет событие на другой, но не на одной где вы нажали кнопку.
В комментарии вы сказали, что хотите получать уведомления об изменениях, сделанных в том же окне. Единственный способ сделать это - написать функцию-обертку для setItem
и напрямую вызвать ваш обработчик, примерно так:
function storageChanged({key, oldValue, newValue}) {
if (key === "Data") {
const isNew = oldValue === null && newValue !== null;
console.log(`Data event, new value = "${newValue}". First time? ${isNew ? "Yes" : "No"}`);
}
}
window.addEventListener('storage', storageChanged);
function setLocalStorage(key, newValue) {
newValue = String(newValue);
const oldValue = localStorage.getItem(key);
localStorage.setItem(key, newValue);
storageChanged({
key,
oldValue,
newValue,
storageArea: localStorage,
url: window.location.url
});
}
function clearLocalStorage() {
localStorage.clear();
storageChanged({
key: null,
oldValue: null,
newValue: null,
storageArea: localStorage,
url: window.location.url
});
}
Если вы измените обработчики кнопок для использования этих функций, вы получите уведомления как для изменений, сделанных в окне, и для изменений, сделанных в другом windows.
Живой пример на JSBin (который является одним из немногих, который позволяет нам использовать локальное хранилище).