-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscript.js
140 lines (121 loc) · 3.78 KB
/
script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
let ws = null;
let username = '';
// DOM元素
const loginScreen = document.getElementById('login-screen');
const chatScreen = document.getElementById('chat-screen');
const usernameInput = document.getElementById('username');
const joinBtn = document.getElementById('join-btn');
const messageInput = document.getElementById('message-input');
const sendBtn = document.getElementById('send-btn');
const messagesDiv = document.getElementById('messages');
const userList = document.getElementById('user-list');
// 建立WebSocket连接
function connectWebSocket() {
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
const host = window.location.hostname;
const port = window.location.port;
const wsUrl = port ? `${protocol}//${host}:${port}` : `${protocol}//${host}`;
ws = new WebSocket(wsUrl);
ws.onopen = () => {
console.log('WebSocket连接已建立');
joinChat();
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
handleMessage(data);
};
ws.onclose = () => {
console.log('WebSocket连接已关闭');
setTimeout(connectWebSocket, 3000);
};
ws.onerror = (error) => {
console.error('WebSocket错误:', error);
};
}
// 处理收到的消息
function handleMessage(data) {
switch (data.type) {
case 'chat':
appendMessage(data.username, data.content);
break;
case 'system':
appendSystemMessage(data.content);
break;
case 'userList':
updateUserList(data.users);
break;
}
}
// 添加消息到聊天区域
function appendMessage(username, content) {
const messageDiv = document.createElement('div');
messageDiv.className = 'message';
messageDiv.innerHTML = `<span class="username">${username}:</span> ${content}`;
messagesDiv.appendChild(messageDiv);
messagesDiv.scrollTop = messagesDiv.scrollHeight;
}
// 添加系统消息
function appendSystemMessage(content) {
const messageDiv = document.createElement('div');
messageDiv.className = 'message system';
messageDiv.textContent = content;
messagesDiv.appendChild(messageDiv);
messagesDiv.scrollTop = messagesDiv.scrollHeight;
}
// 更新用户列表
function updateUserList(users) {
userList.innerHTML = '';
users.forEach(user => {
const li = document.createElement('li');
li.textContent = user;
userList.appendChild(li);
});
}
// 发送消息
function sendMessage() {
const content = messageInput.value.trim();
if (content && ws && ws.readyState === WebSocket.OPEN) {
const message = {
type: 'chat',
username: username,
content: content
};
ws.send(JSON.stringify(message));
messageInput.value = '';
}
}
// 加入聊天
function joinChat() {
username = usernameInput.value.trim();
if (username && ws && ws.readyState === WebSocket.OPEN) {
const message = {
type: 'join',
username: username
};
ws.send(JSON.stringify(message));
loginScreen.classList.add('hidden');
chatScreen.classList.remove('hidden');
messageInput.focus();
}
}
// 事件监听
joinBtn.addEventListener('click', () => {
if (usernameInput.value.trim()) {
connectWebSocket();
}
});
usernameInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter' && usernameInput.value.trim()) {
connectWebSocket();
}
});
sendBtn.addEventListener('click', sendMessage);
messageInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter') {
sendMessage();
}
});
// 页面加载完成后聚焦用户名输入框
window.addEventListener('load', () => {
usernameInput.focus();
});