日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

创建一个storageevent事件_谈谈StorageEvent

發(fā)布時(shí)間:2024/7/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 创建一个storageevent事件_谈谈StorageEvent 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

編者按:本文作者 劉觀宇,360 奇舞團(tuán)高級(jí)前端工程師、技術(shù)經(jīng)理,W3C CSS 工作組成員。

紛紛紅紫已成塵,布谷聲中夏令新。夾路桑麻行不盡,始知身是太平人。 ——宋.陸游 《初夏絕句》

我們?cè)陂_發(fā)多Tab應(yīng)用時(shí)候,常常會(huì)遇到多個(gè)Tab狀態(tài)同步的問題。

想象如下場景:用戶主界面,顯示用戶購物車內(nèi)待結(jié)算的商品總數(shù)。此時(shí),用戶可能打開多個(gè)Tab。當(dāng)用戶添加新商品到購物車的時(shí)候,需要更新購物車的數(shù)量。

此時(shí),當(dāng)前頁面需要向服務(wù)器發(fā)起請(qǐng)求,在得到添加成功響應(yīng)的時(shí)候,可以更新用戶界面。為了兼顧體驗(yàn)和可靠性,如果確信添加成功概率比較高的時(shí)候,也可以先更新界面,當(dāng)多數(shù)返回錯(cuò)誤的時(shí)候,可以給用戶界面做狀態(tài)回滾。為了下次展示方便,我們還會(huì)把這個(gè)數(shù)據(jù)寫到LocalStorage里面。用戶再次打開時(shí)候,可以優(yōu)先從localStorage中取值。

當(dāng)前頁面解決了,那么如果同時(shí)打開多個(gè)Tab該如何解決呢?這里使用StorageEvent可能是一種代價(jià)較小的解決方案。

StorageEvent是什么呢?

  • 是一種Event,可以通過標(biāo)準(zhǔn)的Event監(jiān)聽器操作。

  • 當(dāng)storage變化時(shí)候,事件會(huì)被派發(fā)到所有同域下的其他頁面。

  • 觸發(fā)變化的當(dāng)前頁面,沒有事件派發(fā)。

  • 這里有一個(gè)簡單的示例可以展示這個(gè)API的用法。

    const?STORAGE_KEY?=?"cartlist"

    const?getStorage?=?()?=>?{

    ????try?{

    ????????let?rets?=?window.localStorage.getItem(STORAGE_KEY)

    ????????if?(rets?===?null)?{

    ????????????return?[]

    ????????}

    ????????return?JSON.parse(rets)

    ????}

    ????catch(e){

    ????????return?[]

    ????}

    }

    const?addCart?=?(value)?=>?{

    ????let?rets?=?getStorage()

    ????rets.push(value)

    ????window.localStorage.setItem(STORAGE_KEY,?JSON.stringify(rets))

    ????return?rets

    }

    const?minusCart?=?(value)?=>?{

    ????let?rets?=?getStorage()

    ????let?idx?=?rets.indexOf(value)

    ????if?(idx?!==?-1){

    ????????rets.splice(idx,?1)

    ????????window.localStorage.setItem(STORAGE_KEY,?JSON.stringify(rets))

    ????}

    ????return?rets

    }

    const?render?=?()?=>?{

    ????let?rets?=?getStorage()

    ????if?(rets.length){

    ????????$("#num").html(rets.length).show()

    ????}

    ????else?{

    ????????$("#num").hide()

    ????}

    ????$(".list li").each((i,el)?=>?{

    ????????if?(rets.includes(i)){

    ????????????$(el).find("a:nth-child(1)").css("visibility",?"hidden")

    ????????????$(el).find("a:nth-child(2)").css("visibility",?"visible")

    ????????}

    ????????else?{

    ????????????$(el).find("a:nth-child(1)").css("visibility",?"visible")

    ????????????$(el).find("a:nth-child(2)").css("visibility",?"hidden")

    ????????}

    ????})

    }

    $(".list a").on("click",?(e)=>?{

    ????let?opIdx?=?$(e.target).parent().find("a").index(e.target)

    ????let?line?=?$(e.target).parent().parent()

    ????let?idx?=?$(".list li").index(line)

    ????opIdx?===?0???addCart(idx)?:?minusCart(idx)

    ????render()

    ????return?false

    })

    window.addEventListener('storage',?(e)?=>?{

    ????render()

    })

    render()

    其中,下面這行代碼是實(shí)現(xiàn)的關(guān)鍵:

    window.addEventListener('storage',?(e)?=>?{

    ????render()

    })

    當(dāng)我們注釋掉這個(gè)語句,我們的頁面同步就不能運(yùn)行了。

    讀者可以打開多個(gè)Tab并觀察頁面的變化 https://jsbin.com/radekilosu/1/edit?html,css,js,output 。

    實(shí)際上,這個(gè)事件e上還帶有很多信息,方便編程時(shí),對(duì)于事件做精確的控制。

    字段含義
    key發(fā)生變化的storageKey
    newValue變換后新值
    oldValue變換前原值
    storageArea相關(guān)的變化對(duì)象
    url觸發(fā)變化的URL,如果是frameset內(nèi),則是觸發(fā)幀的URL

    上述各值都是只讀的。

    還有一點(diǎn)沒有解決掉,就是觸發(fā)storage變化的本頁面,不能接收這個(gè)值,這個(gè)一般情況下是沒問題。當(dāng)然,為了一致性,我們可以自行new一個(gè)事件,在發(fā)生時(shí)候主動(dòng)觸發(fā)它。

    此時(shí)我們可以包裝一個(gè)新的Storage對(duì)象:

    var?Storage?=?{

    ????setItem?:?function(k,v){

    ??????localStorage.setItem(k,v);

    ????},

    ????removeItem?:?function(k){

    ??????localStorage.removeItem(k);

    ????},

    ????clear:?function?(){},

    ????getItem:?function(k)

    }

    此時(shí),我們?cè)侔b一個(gè)函數(shù):

    function?dispatchMe(key,?oldval,?newval,?url,?storage){

    ????var?se?=?document.createEvent("StorageEvent");

    ????se.initStorageEvent('storage',?false,?false,?key,?oldval,?newval,?url,?storage);

    ????window.dispatchEvent(se);

    }

    此時(shí),我們只需要再setItem、removeItem、clear中獲取對(duì)應(yīng)的值,并手動(dòng)調(diào)用一dispatchMe,同時(shí)把和localStorage打交道的地方改為調(diào)用我們的新對(duì)象即可。

    參考資料

  • https://developer.mozilla.org/en-US/docs/Web/API/Window/storage_event

  • https://www.cnblogs.com/cczw/p/3196195.html

  • 關(guān)于奇舞周刊

    《奇舞周刊》是360公司專業(yè)前端團(tuán)隊(duì)「奇舞團(tuán)」運(yùn)營的前端技術(shù)社區(qū)。關(guān)注公眾號(hào)后,直接發(fā)送鏈接到后臺(tái)即可給我們投稿。

    總結(jié)

    以上是生活随笔為你收集整理的创建一个storageevent事件_谈谈StorageEvent的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产九色 | 亚洲好看站 | 日产毛片 | 日韩一区二区不卡视频 | 91久久视频| 国产精品免费入口 | 麻豆福利视频 | 国产美女av在线 | 久久久久久久久网站 | 娇妻第一次尝试交换的后果 | 免费成人在线观看动漫 | 黄色国产一区二区 | 法国空姐在线观看免费 | 精品无码m3u8在线观看 | 1024手机在线看片 | 91视频一区二区 | 欧美日韩国产一区二区在线观看 | 亚洲图片欧美在线看 | 欧美男女视频 | 黑名单上的人全集免费观看 | 男同志毛片特黄毛片 | 黑人巨大精品一区二区在线 | 麻豆高清免费国产一区 | 大尺度做爰呻吟舌吻网站 | 18岁成年人网站 | 禁漫天堂黄漫画无遮挡观看 | 亚洲在线观看免费视频 | 国产乱性| 日日摸夜夜添狠狠添久久精品成人 | 欧美三级图片 | 天堂av在线免费观看 | 国语对白真实视频播放 | av在线不卡一区 | 国产伦精品一区二区三区高清版禁 | 中文一区二区 | 97自拍视频在线 | 四虎av影院 | 日韩精品免费看 | 国产中文字幕av | 国产刺激高潮av | 秋霞在线一区二区 | 黄色一级片国产 | 免费啪啪网址 | 国产综合社区 | 亚洲精品动漫在线观看 | 欧美日韩在线免费观看 | 久久久久久久久久福利 | 久久com| 女人久久 | 久操国产 | 91色漫| 熟妇高潮一区二区三区在线播放 | av成人免费在线观看 | 长篇高h乱肉辣文 | 黑人精品xxx一区一二区 | 欧美日韩综合在线观看 | 国产黑丝一区 | 日批黄色片 | 国产九区 | 国产在线无码精品 | 日日狠狠久久 | 欧美亚洲国产成人 | 亚洲 欧美 日韩 国产综合 在线 | 免费的黄色的网站 | 星空大象在线观看免费播放 | 天天操操操 | 成人mv| 美女精品在线观看 | 天堂综合网 | 国产美女流白浆 | 欧美老女人视频 | 男人免费视频 | 国产精品国产一区 | 一区二区不卡免费视频 | 亚洲一区毛片 | www,四虎 | 日本草草影院 | 免费一区二区三区视频在线 | 日韩毛片一区 | 99热播 | 亚洲精品666| 妹子干综合 | 亚洲一区二区免费视频 | www,五月天,com | xxxx视频在线观看 | 夜夜草视频 | 久久五月综合 | 日本免费一二区 | 欧美变态另类刺激 | 久久精品香蕉 | 美女被草出水 | 亚洲精品1 | 欧美日韩成人精品 | av夜色 | 床戏高潮做进去大尺度视频网站 | 无码人妻精品一区二区中文 | 欧美激情黑白配 | 亚洲va天堂va国产va久 | 国内自拍视频网站 |