活學(xué)活用! 用Local Storage實(shí)現(xiàn)多人聊天室

最終效果

Storage用于在瀏覽器中保存數(shù)據(jù), storage分兩種

  • 第一種是Local Storage, 用于長時間保存數(shù)據(jù)(較為常用)
  • 第二種是 Session Storage, 關(guān)掉瀏覽器, 保存的數(shù)據(jù)就會清空(具體使用用法和Local Storage相似, 可以套用Local Storage的方法)

篇幅有限,這里以Local Storage為例

Local Storage可以用來做什么?

可以用來存儲用戶搜索歷史

可以用來存儲播放器設(shè)置

可以用來存儲用戶信息


Local Storage怎么用?

通過js獲取localstorage對象

// 從window對象中獲取localStorage
window.localStorage

查看LocalStorage的數(shù)量

window.localStorage.length

setItem 增加數(shù)據(jù), 修改數(shù)據(jù)

  • 增加數(shù)據(jù)
window.localStorage.setItem("userName", "昭昭")

  • 修改數(shù)據(jù)
window.localStorage.setItem("userName", "zhaoolee")

getItem 讀取數(shù)據(jù)

window.localStorage.getItem("userName")

removeItem 移除特定鍵的值

window.localStorage.removeItem("userName")

clear 清除所有鍵的值

window.localStorage.clear()

根據(jù)索引獲取"鍵的名字" , window.localStorage.key()

var storageLength = window.localStorage.length;
for(var i = 0; i < storageLength; i++) {
    console.log(window.localStorage.key(i));
}

對Local Storage添加事件監(jiān)聽

function onLocalStorageChange(event) {
  console.log(event.key);
}
window.addEventListener('storage', onLocalStorageChange);
  • 任何LocalStorage的增刪改查事件,都會觸發(fā)函數(shù)onLocalStorageChange
  • 還有一個很有意思的性質(zhì), 在某域名下(http://zhaoolee.com), 有A頁面(http://zhaoolee.com/A.html)和B頁面(http://zhaoolee.com/B.html), 在A頁面下進(jìn)行LocalStorage的增刪改查, 只有在其它頁面(比如B頁面)才能觸發(fā)onLocalStorageChange
  • 我們可以用上面提到的性質(zhì), 把LocalStorage當(dāng)數(shù)據(jù)庫,寫一個本地的聊天室(純屬自娛自樂)

Local Storage聊天室

  • 源碼

實(shí)現(xiàn)的功能

  • 可以匿名聊
  • 可以無限加人
  • 也可以隨時換名字
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link  rel="stylesheet">
    <title>開始聊天</title>
</head>

<body>
    <div style="margin: 30px;">
        <div class="input-group" style="width: 500px">
            <label style="height: 40px; line-height: 40px" for="user-name">用戶名:&nbsp;&nbsp;</label><input type="text"
                class="form-control" placeholder='請輸入你的名字( 默認(rèn)為“匿名用戶” )' id="user-name" onblur="ChangeUserName(this)">

        </div>
        <!-- 存放 -->
        <div id="chat-content" style="border: 1px solid #413F43; height: 300px; overflow: hidden; width: 600px;margin: 10px 0;padding: 10px;">

        </div>
        <div class="input-group" style="width: 600px">
            <input type="text" class="form-control" placeholder="請輸入需要發(fā)送的內(nèi)容" id="my-input">
            <span class="input-group-btn">
                <button class="btn btn-primary" type="button" style="margin-left: 10px" id="btn"> 發(fā) 送 </button>
            </span>
        </div>
    </div>
    <script>
        //發(fā)送消息
        var btn = document.getElementById("btn");
        var myInput = document.getElementById("my-input");
        var userName = document.getElementById("user-name").value || "匿名用戶";
        var chatContent = document.getElementById("chat-content");


        // 獲取當(dāng)前的年月日,時分秒
        function getDateTime() {
            var dt = new Date();

            var Year = dt.getFullYear();
            var Month = dt.getMonth() + 1;
            var Day = dt.getDate();

            var Hours = dt.getHours();
            var Minutes = dt.getMinutes();
            var Second = dt.getSeconds();
            return (Year + "-" + Month + "-" + Day + " " + Hours + ":" + Minutes + ":" + Second);

        }
        // 發(fā)送后存放到session
        btn.addEventListener("click", function () {
            if (myInput.value != "") {
                var dateTime = getDateTime();
                var userNameAndInputvalue = userName + ":" + myInput.value;
                // 將時間用戶名和聊天內(nèi)容寫入local storage
                window.localStorage.setItem(dateTime, userNameAndInputvalue)
                // 將時間用戶名和聊天內(nèi)容添加到頁面中
                chatContent.innerHTML = chatContent.innerHTML + "<div style='text-align: right'; border-bottom: 1px solid #413F43>" + dateTime+ "<br>" + userNameAndInputvalue +
                    "</div>"
                myInput.value = "";
            }
        })

        // 監(jiān)聽session變化時, 更新聊天信息
        window.addEventListener('storage', function (e) {
            if((e["key"] != null)&&(e["newValue"] != null)){
                var userNameAndInputvalue = "<div>" + e["key"] + "<br>" + e["newValue"] + "</div>";
                chatContent.innerHTML = chatContent.innerHTML + "<div style='text-align: left'>" + userNameAndInputvalue + "</div>"
            }
        })

        // 綁定回車
        document.onkeydown = function (e) {
            if (e.keyCode === 13) {
                btn.click();
            }

        }

        // 重新輸入用戶名
        function ChangeUserName() {
            userName = document.getElementById("user-name").value || "匿名用戶";
            console.log("當(dāng)前的用戶名為:", userName);
        }
    </script>
</body>

</html>

運(yùn)行上面的聊天源碼, 需要開啟http服務(wù), 可以參考http://www.reibang.com/p/f60758991e2d

小結(jié):

博主前幾天寫網(wǎng)站,服務(wù)端向?yàn)g覽器下發(fā)cookies, 由于網(wǎng)絡(luò)環(huán)境不太好, cookies下發(fā)可能會失敗, 博主最后用Local Storage代替了cookies, 還是蠻好用的, 哈哈, 還是要主動擁抱新技術(shù)!

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市溺职,隨后出現(xiàn)的幾起案子傲醉,更是在濱河造成了極大的恐慌薛闪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甩栈,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)落恼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來离熏,“玉大人佳谦,你說我怎么就攤上這事∽檀粒” “怎么了钻蔑?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵啥刻,是天一觀的道長。 經(jīng)常有香客問我咪笑,道長可帽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任窗怒,我火速辦了婚禮映跟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兜粘。我一直安慰自己申窘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布孔轴。 她就那樣靜靜地躺著剃法,像睡著了一般。 火紅的嫁衣襯著肌膚如雪路鹰。 梳的紋絲不亂的頭發(fā)上贷洲,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音晋柱,去河邊找鬼优构。 笑死,一個胖子當(dāng)著我的面吹牛雁竞,可吹牛的內(nèi)容都是我干的钦椭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碑诉,長吁一口氣:“原來是場噩夢啊……” “哼彪腔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起进栽,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤德挣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后快毛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體格嗅,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年唠帝,在試婚紗的時候發(fā)現(xiàn)自己被綠了屯掖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡襟衰,死狀恐怖懂扼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤阀湿,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布赶熟,位于F島的核電站,受9級特大地震影響陷嘴,放射性物質(zhì)發(fā)生泄漏映砖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一灾挨、第九天 我趴在偏房一處隱蔽的房頂上張望邑退。 院中可真熱鬧,春花似錦劳澄、人聲如沸地技。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莫矗。三九已至,卻和暖如春砂缩,著一層夾襖步出監(jiān)牢的瞬間作谚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工庵芭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妹懒,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓双吆,卻偏偏與公主長得像眨唬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子好乐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容