實(shí)現(xiàn)Tab頁(yè)之間通信的方式

5 種方式:

  1. localstorage
  2. webworker
  3. web-socket
  4. cookie
  5. postMessage

localstorage

先看效果:


test3.gif

代碼:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
    <style>
        #div1 {
            width: 200px;
            height: 200px;
            background-color: red;
        }
    </style>
    <title>Document</title>
</head>

<body>
    <button id="button">Click me.</button>
    <script>
        jQuery("#button").on('click', () => {
            window.localStorage.setItem('a', Math.random())
        })
        window.addEventListener('storage', e => {
            console.log(e)
        })
    </script>
</body>

</html>

webWorker

先看效果:


test1.gif

看代碼:


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
    <style>
        #div1 {
            width: 200px;
            height: 200px;
            background-color: red;
        }
    </style>
    <title>Document</title>
</head>

<body>
    <button id="button1">send</button>
    <button id="button2">get</button>
    <script>
        let worker;
        if (typeof Worker === "undefined") {
            alert('當(dāng)前瀏覽器不支持webworker')
        } else {
            worker = new SharedWorker('work.js', 'work2');

            worker.port.onmessage = function(e) {
                console.log(`獲得worker的數(shù)據(jù):${e.data}`)
            }
        }

        jQuery('#button1').on('click', () => {
            let data = parseInt(Math.random() * 10)
            console.log(`發(fā)送數(shù)據(jù):${data}`)
            worker.port.postMessage(data);
        })
        jQuery('#button2').on('click', () => {
            worker.port.postMessage('get');
        })
    </script>
</body>

</html>
//work.js
let data1 = '';
this.onconnect = function(e) {
    console.log('e', e);
    let port = e.ports[0];
    port.onmessage = function(e) {
        if(e.data === 'get') {
            port.postMessage(data1)
        }else {
            data1 = e.data
        }
    }
}

web-socket

先看效果:


test0.gif

客戶端代碼(web)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
    <style>
        #div1 {
            width: 200px;
            height: 200px;
            background-color: red;
        }
    </style>
    <title>Document</title>
</head>

<body>
    <button id="button1">send</button>
    <button id="button2">get</button>
    <script>
        let ws = new WebSocket("ws://localhost:3009");

        ws.onopen = function(e) {
            console.log("Connection open ...");
            // ws.send("Hello WebSockets!");
        };

        ws.onmessage = function(e) {
            console.log(`收到數(shù)據(jù)${e.data}`);
            // ws.close();
        };

        ws.onclose = function(evt) {
            console.log("Connection closed.");
        };
        jQuery('#button1').on('click', () => {
            let data = parseInt(Math.random() * 10);
            console.log(`發(fā)送數(shù)據(jù)${data}`);
            ws.send(data)
        })
    </script>
</body>

</html>

服務(wù)端代碼(koa)

const Koa = require('koa');
const serve = require('koa-static')
const path = require('path')
const Router = require('koa-router');

const websocket = require('koa-websocket')

const home = serve(path.resolve(__dirname, './'))

const app = websocket(new Koa());


let ctxs = new Set();//保證websocket唯一性
app.ws.use(function(ctx, next) {
    ctxs.add(ctx);
    ctx.websocket.on('message', function(message) {
        ctxs.forEach((item, index , arr) => {//客戶端每新建一個(gè)websokcet就會(huì)保存到這個(gè)ctx中,每個(gè)ctx中的websokcet是獨(dú)立的
            item.websocket.send(message)
        })
    });
    ctx.websocket.on('close', function(message) {
        ctxs.delete(ctx)
    })
    next(ctx)
} )




const router = new Router()
router.get('*', (ctx, next) => {
    ctx.body = 'hello world';
})


app.use(home)

app.use(router.routes())
    .use(router.allowedMethods());


app.listen(3009, () => {
    console.log('server is started at port 3009')
})

cookie

這個(gè)簡(jiǎn)單就不講了

postMessage

這個(gè)其實(shí)有點(diǎn)限制,就是你必須拿到目標(biāo)窗口的引用譬嚣,否則是通信不了的缕减, 先看效果:


test4.gif

先用koa起2個(gè)服務(wù)(端口號(hào)設(shè)置不一樣就行)泪姨,分別放置2個(gè)index.html.

<!--http://localhost:3009/index.html-->
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
    <style>
        #div1 {
            width: 200px;
            height: 200px;
            background-color: red;
        }
    </style>
    <title>Document</title>
</head>

<body>
    <button id="button1">send</button>
    <button id="button2">get</button>
    <script>
        const targetWindow = window.open('http://localhost:3008/index.html'); //這步很重要贺嫂,你必須拿到這個(gè)引用才行
        jQuery('#button1').on('click', () => {
            let data = parseInt(Math.random() * 10);
            console.log(`發(fā)送數(shù)據(jù)${data}`);
            targetWindow.postMessage(data, "http://localhost:3008")
        })
        window.addEventListener('message', function(e) {
            console.log(`接受到數(shù)據(jù):${e.data}, 數(shù)據(jù)源:${e.origin}`)
        }, true)
    </script>
</body>

</html>
<!--http://localhost:3008/index.html-->
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
    <style>
        #div1 {
            width: 200px;
            height: 200px;
            background-color: red;
        }
        
        body {
            background-color: grey;
        }
    </style>
    <title>Document</title>
</head>

<body>
    <button id="button1">send</button>
    <button id="button2">get</button>
    <script>
        window.addEventListener('message', function(e) {
            jQuery("body").append(`<p>${e.data}</p>`)
        }, false)
    </script>
</body>

</html>

參考文獻(xiàn)

https://www.cnblogs.com/lovling/p/7440360.html
https://blog.csdn.net/u014465934/article/details/98869766

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸟废,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子卦绣,更是在濱河造成了極大的恐慌耐量,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滤港,死亡現(xiàn)場(chǎng)離奇詭異廊蜒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)溅漾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)山叮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人添履,你說(shuō)我怎么就攤上這事屁倔。” “怎么了暮胧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵锐借,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我往衷,道長(zhǎng)钞翔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任炼绘,我火速辦了婚禮,結(jié)果婚禮上妄田,老公的妹妹穿的比我還像新娘俺亮。我一直安慰自己,他們只是感情好疟呐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布脚曾。 她就那樣靜靜地躺著,像睡著了一般启具。 火紅的嫁衣襯著肌膚如雪本讥。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天鲁冯,我揣著相機(jī)與錄音拷沸,去河邊找鬼。 笑死薯演,一個(gè)胖子當(dāng)著我的面吹牛撞芍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跨扮,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼序无,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼验毡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起帝嗡,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤晶通,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后哟玷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體狮辽,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年碗降,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隘竭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讼渊,死狀恐怖动看,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爪幻,我是刑警寧澤菱皆,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站挨稿,受9級(jí)特大地震影響仇轻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奶甘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一篷店、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧臭家,春花似錦疲陕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至你踩,卻和暖如春诅岩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背带膜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工吩谦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膝藕。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓逮京,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親束莫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子懒棉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354