JavaScript實時監(jiān)聽localStorage變化的實現(xiàn)方法小結(jié)
在不同窗口/選項卡中監(jiān)聽 localStorage 變化
當(dāng) localStorage 的數(shù)據(jù)在一個窗口/選項卡中改變時,其他同源的窗口/選項卡會觸發(fā) storage 事件。我們可以利用這個事件來監(jiān)聽 localStorage 的變化。
示例代碼
// 添加 storage 事件監(jiān)聽器
window.addEventListener('storage', function(event) {
if (event.key === 'groupID') {
console.log('New value:', event.newValue);
}
});
解釋
storage事件會在同源的其他窗口/選項卡中觸發(fā)。event.key是變化的localStorage項的鍵。event.newValue是變化后的新值。
注意事項
- 只有在不同的窗口/選項卡之間修改
localStorage時,才會觸發(fā)storage事件。 - 如果在同一個窗口/選項卡中修改
localStorage,則不會觸發(fā)storage事件。
在同一個窗口/選項卡中監(jiān)聽 localStorage 變化
在同一個窗口/選項卡中,storage 事件不會被觸發(fā)。我們可以通過自定義事件或其他手段來實現(xiàn)對 localStorage 變化的監(jiān)聽。
方法一:使用自定義事件
- 設(shè)置
localStorage并觸發(fā)自定義事件
function setLocalStorageItem(key, value) {
localStorage.setItem(key, value);
const event = new CustomEvent('localStorageChange', { detail: { key, value } });
window.dispatchEvent(event);
}
- 監(jiān)聽自定義事件
window.addEventListener('localStorageChange', function(event) {
if (event.detail.key === 'groupID') {
console.log('New value:', event.detail.value);
}
});
方法二:使用定時器輪詢
另一種方法是在一定時間間隔內(nèi)輪詢 localStorage 的值,檢查是否發(fā)生變化。
let lastValue = localStorage.getItem('groupID');
setInterval(function() {
const newValue = localStorage.getItem('groupID');
if (newValue !== lastValue) {
console.log('New value:', newValue);
lastValue = newValue;
}
}, 1000); // 每秒檢查一次
方法三:使用 Proxy 對象
如果希望對所有的 localStorage 操作進行代理,可以使用 Proxy 對象。
const localStorageProxy = new Proxy(localStorage, {
set(target, key, value) {
target.setItem(key, value);
const event = new CustomEvent('localStorageChange', { detail: { key, value } });
window.dispatchEvent(event);
return true;
}
});
// 設(shè)置值時使用代理對象
localStorageProxy.groupID = 'newValue';
// 監(jiān)聽自定義事件
window.addEventListener('localStorageChange', function(event) {
if (event.detail.key === 'groupID') {
console.log('New value:', event.detail.value);
}
});
示例:通過 localStorage 監(jiān)聽實現(xiàn)頁面間通信
假設(shè)我們有兩個頁面,頁面A設(shè)置 localStorage 中的 groupID 值,頁面B監(jiān)聽 groupID 的變化并根據(jù)最新的值執(zhí)行相應(yīng)的邏輯。
頁面A:設(shè)置 localStorage 并觸發(fā)自定義事件
const sss = (node, data) => {
let id = data.id.split('_')[1];
alert(id);
localStorage.setItem('groupID', id);
// 手動觸發(fā)自定義事件
const event = new CustomEvent('localStorageChange', { detail: { key: 'groupID', value: id } });
window.dispatchEvent(event);
};
頁面B:監(jiān)聽自定義事件并獲取最新的 groupID 值
mounted() {
let _this = this;
// 初次加載時獲取數(shù)據(jù)
_this.getData();
// 使用自定義事件監(jiān)聽 groupID 變化
window.addEventListener('localStorageChange', function(event) {
if (event.detail.key === 'groupID') {
alert('1');
_this.getData();
}
});
},
methods: {
async getData() {
const id = localStorage.getItem('groupID');
// 檢查 id 是否存在
if (!id) {
this.$message({
message: 'Group ID 不存在,請先選擇一個組。',
type: 'warning'
});
return;
}
try {
const res = await traffic.trafficvulndel({
page: this.formData.page_num,
size: this.pageSize,
search: this.formData.search_field,
groupID: id,
...this.formData
});
if (res.code === 200) {
this.tableData = res.data.assetsInfo;
console.log(this.tableData, 'this.tableData');
this.totalpage = res.data.count;
} else {
this.$message({
message: res.msg,
type: 'error'
});
}
} catch (error) {
console.log(error);
this.$message({
message: '請求失敗,請稍后再試。',
type: 'error'
});
}
}
}
以上就是JavaScript實時監(jiān)聽localStorage變化的實現(xiàn)方法小結(jié)的詳細內(nèi)容,更多關(guān)于JavaScript監(jiān)聽localStorage變化的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Javascript中字符串相關(guān)常用的使用方法總結(jié)
本篇文章主要介紹了Javascript中字符串相關(guān)常用的使用方法。具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03
JavaScript精煉之構(gòu)造函數(shù) Constructor及Constructor屬性詳解
對象的constructor屬性用于返回創(chuàng)建該對象的函數(shù),也就是我們常說的構(gòu)造函數(shù),除了創(chuàng)建對象,構(gòu)造函數(shù)(constructor) 還做了另一件有用的事情—自動為創(chuàng)建的新對象設(shè)置了原型對象(prototype object)2015-11-11
基于JS實現(xiàn)網(wǎng)頁中的選項卡(兩種方法)
這篇文章主要介紹了用js語句實現(xiàn)網(wǎng)頁中的選項卡(兩種方法),非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-06-06
js/jquery解析json和數(shù)組格式的方法詳解
本篇文章主要是對js/jquery解析json和數(shù)組格式的方法進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01

