迁移消息用户名点击委托
This commit is contained in:
@@ -4,8 +4,12 @@ let rightPanelEventsBound = false;
|
||||
// 用户名单由 Blade 主脚本动态重建,点击/双击状态必须放在模块层避免 DOM 重建后残留闭包。
|
||||
const userListClickTimers = new WeakMap();
|
||||
const userListLastTapTimes = new WeakMap();
|
||||
const messageUserClickTimers = new WeakMap();
|
||||
const messageUserLastTapTimes = new WeakMap();
|
||||
const USER_LIST_CLICK_DELAY = 250;
|
||||
const USER_LIST_DOUBLE_TAP_DELAY = 300;
|
||||
const MESSAGE_USER_CLICK_DELAY = 250;
|
||||
const MESSAGE_USER_DOUBLE_TAP_DELAY = 300;
|
||||
|
||||
/**
|
||||
* 选择聊天目标并聚焦输入框。
|
||||
@@ -47,6 +51,78 @@ function openUserCardFromList(item) {
|
||||
window.openUserCard?.(username);
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取消息区用户名,过滤掉系统播报和游戏标签等不可交互内容。
|
||||
*
|
||||
* @param {HTMLElement} item 消息区用户名节点
|
||||
* @returns {string}
|
||||
*/
|
||||
function getMessageUsername(item) {
|
||||
return (item.dataset.u || "").trim();
|
||||
}
|
||||
|
||||
/**
|
||||
* 消息区用户名单击选择聊天目标,保留旧 switchTarget 的离线用户兜底逻辑。
|
||||
*
|
||||
* @param {string} username 目标用户名
|
||||
* @returns {void}
|
||||
*/
|
||||
function selectMessageChatTarget(username) {
|
||||
if (!username) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof window.switchTarget === "function") {
|
||||
window.switchTarget(username);
|
||||
return;
|
||||
}
|
||||
|
||||
selectChatTarget(username);
|
||||
}
|
||||
|
||||
/**
|
||||
* 消息区用户名双击打开名片,并取消待执行的单击选择。
|
||||
*
|
||||
* @param {HTMLElement} item 消息区用户名节点
|
||||
* @returns {void}
|
||||
*/
|
||||
function openUserCardFromMessage(item) {
|
||||
const username = getMessageUsername(item);
|
||||
const clickTimer = messageUserClickTimers.get(item);
|
||||
|
||||
if (!username) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (clickTimer) {
|
||||
window.clearTimeout(clickTimer);
|
||||
messageUserClickTimers.delete(item);
|
||||
}
|
||||
|
||||
window.openUserCard?.(username);
|
||||
}
|
||||
|
||||
/**
|
||||
* 调度消息区用户名单击选择,延迟执行用于和双击打开名片互斥。
|
||||
*
|
||||
* @param {HTMLElement} item 消息区用户名节点
|
||||
* @returns {void}
|
||||
*/
|
||||
function scheduleMessageUserSelection(item) {
|
||||
const username = getMessageUsername(item);
|
||||
|
||||
if (!username || messageUserClickTimers.has(item)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const clickTimer = window.setTimeout(() => {
|
||||
messageUserClickTimers.delete(item);
|
||||
selectMessageChatTarget(username);
|
||||
}, MESSAGE_USER_CLICK_DELAY);
|
||||
|
||||
messageUserClickTimers.set(item, clickTimer);
|
||||
}
|
||||
|
||||
/**
|
||||
* 调度用户列表单击选择,延迟执行用于和双击打开名片互斥。
|
||||
*
|
||||
@@ -111,6 +187,13 @@ export function bindChatRightPanelControls() {
|
||||
if (userItem instanceof HTMLElement) {
|
||||
event.preventDefault();
|
||||
scheduleUserListSelection(userItem);
|
||||
return;
|
||||
}
|
||||
|
||||
const messageUser = event.target.closest("[data-chat-message-user]");
|
||||
if (messageUser instanceof HTMLElement) {
|
||||
event.preventDefault();
|
||||
scheduleMessageUserSelection(messageUser);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -123,6 +206,13 @@ export function bindChatRightPanelControls() {
|
||||
if (userItem instanceof HTMLElement) {
|
||||
event.preventDefault();
|
||||
openUserCardFromList(userItem);
|
||||
return;
|
||||
}
|
||||
|
||||
const messageUser = event.target.closest("[data-chat-message-user]");
|
||||
if (messageUser instanceof HTMLElement) {
|
||||
event.preventDefault();
|
||||
openUserCardFromMessage(messageUser);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -133,6 +223,22 @@ export function bindChatRightPanelControls() {
|
||||
|
||||
const userItem = event.target.closest("[data-user-list-entry]");
|
||||
if (!(userItem instanceof HTMLElement)) {
|
||||
const messageUser = event.target.closest("[data-chat-message-user]");
|
||||
if (!(messageUser instanceof HTMLElement)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 消息区用户名由 Blade 渲染,移动端双触发统一在 Vite 模块内处理。
|
||||
const now = Date.now();
|
||||
const lastTapTime = messageUserLastTapTimes.get(messageUser) || 0;
|
||||
if (now - lastTapTime < MESSAGE_USER_DOUBLE_TAP_DELAY) {
|
||||
event.preventDefault();
|
||||
messageUserLastTapTimes.delete(messageUser);
|
||||
openUserCardFromMessage(messageUser);
|
||||
return;
|
||||
}
|
||||
|
||||
messageUserLastTapTimes.set(messageUser, now);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user