perf: 优化浮动工具栏 selectionChange 轮询间隔 200ms→500ms,修复测试缓慢问题
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
CI / test (24.x) (push) Canceled after 0s
CI / test (18.x) (push) Canceled after 29m59s

This commit is contained in:
2026-07-25 14:58:57 +08:00
parent 708f0937d8
commit 8f578599cf
2 changed files with 20 additions and 20 deletions
+19 -19
View File
@@ -747,33 +747,33 @@ export class MarkdownEditor {
const hide = () => { this._hideFloatingToolbar(); }; const hide = () => { this._hideFloatingToolbar(); };
// Detect selection changes // Detect selection changes via events + throttled polling
ta.addEventListener('mouseup', () => setTimeout(show, 0));
ta.addEventListener('keyup', () => {
if (ta.selectionStart !== ta.selectionEnd) setTimeout(show, 0);
else setTimeout(hide, 0);
// Emit cursorMove
const pos = this.getCursorPosition();
this._emit('cursorMove', pos);
});
ta.addEventListener('blur', () => setTimeout(hide, 300));
ta.addEventListener('click', () => setTimeout(() => {
if (ta.selectionStart === ta.selectionEnd) hide();
}, 0));
// Emit selectionChange on selection changes
let lastSelStart = ta.selectionStart; let lastSelStart = ta.selectionStart;
let lastSelEnd = ta.selectionEnd; let lastSelEnd = ta.selectionEnd;
this._selectionTimer = setInterval(() => { const check = () => {
if (this._destroyed) return; if (this._destroyed || !document.body.contains(ta)) return;
const s = ta.selectionStart; const e = ta.selectionEnd; const s = ta.selectionStart; const e = ta.selectionEnd;
if (s !== lastSelStart || e !== lastSelEnd) { if (s !== lastSelStart || e !== lastSelEnd) {
lastSelStart = s; lastSelEnd = e; lastSelStart = s; lastSelEnd = e;
const text = this._value.slice(s, e); const text = this._value.slice(s, e);
this._emit('selectionChange', { start: s, end: e, text }); this._emit('selectionChange', { start: s, end: e, text });
} }
}, 200) as any; };
this._cleanups.push(() => { if (this._selectionTimer) clearInterval(this._selectionTimer); }); // Use longer interval for polling (won't block event loop as much)
this._selectionTimer = setInterval(check, 500) as any;
this._cleanups.push(() => { if (this._selectionTimer) { clearInterval(this._selectionTimer); this._selectionTimer = null; } });
ta.addEventListener('mouseup', () => setTimeout(show, 0));
ta.addEventListener('keyup', () => {
const s = ta.selectionStart; const e = ta.selectionEnd;
if (s !== e) setTimeout(show, 0);
else setTimeout(hide, 0);
this._emit('cursorMove', this.getCursorPosition());
});
ta.addEventListener('blur', () => setTimeout(hide, 300));
ta.addEventListener('click', () => setTimeout(() => {
if (ta.selectionStart === ta.selectionEnd) hide();
}, 0));
} }
_buildFloatingToolbar(): void { _buildFloatingToolbar(): void {
+1 -1
View File
@@ -2243,7 +2243,7 @@ describe('MarkdownEditor - v0.2.3 浮动工具栏', () => {
expect(handler.mock.calls[0][0]).toHaveProperty('text', 'hello'); expect(handler.mock.calls[0][0]).toHaveProperty('text', 'hello');
ed.destroy(); ed.destroy();
done(); done();
}, 400); }, 800);
}); });
test('cursorMove 事件在按键后触发', () => { test('cursorMove 事件在按键后触发', () => {