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

admin4天前it知识43

以下是一个使用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);
    });
}

代码功能说明: 

 主页面通过SharedWorker构造函数创建共享线程实例,并通过port属性进行通信

 SharedWorker脚本使用onconnect事件处理新连接,每个连接对应一个MessagePort对象 

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

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

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

使用方法: 

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

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

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

需要显式调用port.start()方法才能接收消息 

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

标签: 分享IT知识

相关文章

职场人如何写季度总结

作为职场人,写季度总结是一个展示自己工作成果和总结经验教训的机会。以下是一些撰写季度总结的建议:明确总结的目的:季度总结的目的是为了向上级领导汇报本季度的工作进展、成果和教训,以及下季度的工作计划。因...

灵动:生活中的艺术与智慧

在这个充满变化的世界里,灵动是一种独特的魅力,它让我们的生活更加丰富多彩,充满了可能性和创意。灵动不仅是一种艺术,更是一种智慧,它存在于我们的思维、情感和行动中。首先,灵动是一种艺术。在我们的生活中,...

优美程序是怎样的

程序优美是一个主观的概念,每个人可能会有不同的看法。然而,以下是一些可能导致程序优美的因素:简洁性:优美的程序应该尽可能地简洁明了。这意味着应该使用尽可能少的数据结构和算法,以及尽可能简单的代码。可读...

关于夏天

在一个炎热的午后,阳光穿过树叶的缝隙,洒在公园的草地上。空气中弥漫着夏日的气息,那是炎热中夹杂着淡淡的花香,还有草地的清新味道。在这个充满活力的季节,夏天以其独特的方式展示着它的魅力。夏天是一个充满色...

拖延症重度患者怎样自救

对于拖延症的重度患者,自救的关键在于以下几点:识别并克服拖延的借口。拖延常常因为我们害怕、不确定、不想不舒服而找到各种借口。我们必须识破这些借口,并对自己说:“如果我拖延,后果将不堪设想。”制定清晰的...

个人学习计划

学习计划是一个帮助你提高学习效率和使用时间的有效工具。以下是一个可能的学习计划:目标设定。 在开始学习之前,明确你的学习目标和目的地,这有助于你制定实际可行的计划。分解任务。 将大...

发表评论

访客

看不清,换一张

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