SharedWorker实现多页面通信的完整示例

admin4个月前 (10-11)it知识358

以下是一个使用SharedWorker实现多页面通信的完整示例,包含HTML页面和SharedWorker脚本:

<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title>SharedWorker示例</title>    <style>        body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }        .container { border: 1px solid #ddd; padding: 20px; margin-bottom: 20px; }        button { padding: 8px 16px; background: #4CAF50; color: white; border: none; cursor: pointer; }        button:hover { background: #45a049; }        #messages { height: 200px; overflow-y: scroll; border: 1px solid #eee; padding: 10px; }    </style></head><body>    <div class="container">        <h2>SharedWorker通信示例</h2>        <div>            <input type="text" id="messageInput" placeholder="输入消息">            <button id="sendBtn">发送消息</button>        </div>        <div id="messages"></div>    </div>    <script>        const worker = new SharedWorker('worker.js');        const messageInput = document.getElementById('messageInput');        const sendBtn = document.getElementById('sendBtn');        const messagesDiv = document.getElementById('messages');        // 启动端口通信        worker.port.start();        // 发送消息        sendBtn.addEventListener('click', () => {            const message = messageInput.value;            if (message) {                worker.port.postMessage({                    type: 'message',                    content: message,                    timestamp: new Date().toLocaleTimeString()                });                messageInput.value = '';            }        });        // 接收消息        worker.port.onmessage = (e) => {            const { type, content, timestamp } = e.data;            if (type === 'message') {                const messageElement = document.createElement('div');                messageElement.textContent = `${timestamp}: ${content}`;                messagesDiv.appendChild(messageElement);                messagesDiv.scrollTop = messagesDiv.scrollHeight;            } else if (type === 'connection') {                const infoElement = document.createElement('div');                infoElement.textContent = `系统消息: ${content}`;                infoElement.style.color = '#666';                messagesDiv.appendChild(infoElement);            }        };    </script></body></html>//worker.js// 跟踪所有连接的端口const connectedPorts = new Set();// 处理新连接onconnect = function(e) {    const port = e.ports[0];    connectedPorts.add(port);        // 通知新连接    broadcastMessage({        type: 'connection',        content: `新客户端已连接,当前连接数: ${connectedPorts.size}`,        timestamp: new Date().toLocaleTimeString()    });    // 消息处理    port.onmessage = function(e) {        if (e.data.type === 'message') {            // 广播消息给所有连接的客户端            broadcastMessage(e.data);        }    };    // 端口关闭时清理    port.addEventListener('close', () => {        connectedPorts.delete(port);        broadcastMessage({            type: 'connection',            content: `客户端断开,当前连接数: ${connectedPorts.size}`,            timestamp: new Date().toLocaleTimeString()        });    });    port.start();};// 广播消息给所有客户端function broadcastMessage(message) {    connectedPorts.forEach(port => {        port.postMessage(message);    });}

代码功能说明: 

 主页面通过Sha[文]redWorker构造函数创[章]建共享线程实例,并通过por[来]t属性进行通信

 SharedWo[自]rker脚本使用onconn[一]ect事件处理新连接,每个连[道]接对应一个MessagePo[,]rt对象 

 实现了消息广播功[一]能,所有连接的页面都能收到其[个]他页面发送的消息 [分]

包含连接状态跟踪,实时显示当[享]前连接数使用结构化消息格式,[的]

包含消息类型、内容和时间戳

使用方法: 

在浏览器中打开多个index[网].html页面(同源)在一个[站]页面发送消息,

其他所有页面都会实时显示该消[文]息系统会自动显示连接和断开通[章]知 

注意事项:所有页面必须同源([来]相同协议、域名和端口)才能共[自]享同一个SharedWork[一]er

需要显式调用port.sta[道]rt()方法才能接收消息&n[,]bsp;

SharedWorker生命周期独立于页面,即使所有页面关闭,Worker仍可能保持运行

标签: 分享IT知识

相关文章

如何高效学习

努力和技巧的能力。以下是一些可以帮助你高效学习的方法:制定学习计划:制定一个清晰的学习计划,包括学习内容和时间表,有助于你更好地组织自己的学习并提高学习效率。创造良好的学习环境:在学习时,尽可能避免干...

如何写文章

过程,需要一定的技巧和准备。以下是一些写文章的步骤和技巧:确定文章的主题和目的:在开始写作之前,您需要明确文章的主题和目的。这有助于您确定文章的重点和方向。研究和收集信息:在开始写作之前,进行一些研究...

马斯洛理论

生理需求是最低层次的需求,包括人类维持自身生存的最基本要求,包括饥、渴、衣、住、性、健康方面的需求。安全需求包括两个层次,一是归属的需要,即人都有一种归属于一个群体的感情,希望成为群体中的一员,并相互...

黄金秋季

黄金秋季,这是一个充满色彩和韵味的季节。天空湛蓝,阳光明媚,微风轻拂,树叶由绿变黄,由黄变红,最终落叶归根。这是一个大自然最美丽的时刻,一切都在这一刻达到了高潮。秋天的阳光特别柔和,它不像夏天那样灼热...

灵感

灵感的由来可能来自于自然环境、文化背景、生活经验、想象力和创新思维,或其他来源自然环境:大自然以其独特的美丽和秩序,持续激发人类的创造力,自然元素如水、火、空气、土壤和生物等,都为艺术家、科学家和作家...

中秋

月光如水,映照着中国大地。这是一个收获的季节,也是一个团圆的时刻。在秋天的长夜里,一轮明月在苍穹之中绽放出光芒,那是中秋之夜的明月,是华夏民族心中的瑰宝。中秋,又称月圆之夜,起源于古代农耕社会对月亮的...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。