feat: support all page URLs and iframe shortcut forwarding

This commit is contained in:
suanyuit-cyber
2026-11-03 10:24:30 +08:00
parent a7d2d30daa
commit a9986a8b7f
6 changed files with 172 additions and 15 deletions
+25 -5
View File
@@ -1,11 +1,12 @@
// ==UserScript==
// @name 华谊题库助手 · CSV导出与划词检索
// @namespace local.huayi.question-bank
// @version 1.2.8
// @version 1.2.9
// @description 全网页快捷键唤出、本地题库文字检索与自动选择答案,按库导入导出;每页默认完全隐藏。
// @match *://*/*
// @match http://*/*
// @match https://*/*
// @match file:///*
// @run-at document-start
// @noframes
// @grant unsafeWindow
// @grant GM_getValue
// @grant GM_setValue
@@ -2375,6 +2376,19 @@ if (typeof module !== 'undefined' && module.exports) module.exports = QBCollecto
// ---- src/app.js ----
// UI and persistence stay inside the userscript sandbox. Page data is rendered as text.
(() => {
const FRAME_SHORTCUT = 'huayi-qb.frame-shortcut.v1';
const isToggleShortcut = event => event.altKey && event.shiftKey && !event.ctrlKey && !event.metaKey &&
(event.code === 'KeyQ' || (!event.code && String(event.key).toLowerCase() === 'q')) && !event.repeat;
// Frames only forward the explicit shortcut. Keep one panel and one set of
// storage/network handlers in the top page; never relay frame text or answers.
if (window.top !== window.self) {
window.addEventListener('keydown', event => {
if (!isToggleShortcut(event)) return;
event.preventDefault();
window.top.postMessage({ type: FRAME_SHORTCUT }, '*');
}, true);
return;
}
const CONFIG_KEY = 'huayi-qb.config.v1';
const RECORDS_KEY = 'huayi-qb.records.v1';
const BACKUP_KEY = 'huayi-qb.records.before-dedup.v1';
@@ -3352,11 +3366,17 @@ if (typeof module !== 'undefined' && module.exports) module.exports = QBCollecto
}
}, 120);
});
document.addEventListener('keydown', event => {
if (event.altKey && event.shiftKey && !event.ctrlKey && !event.metaKey && event.code === 'KeyQ' && !event.repeat) {
window.addEventListener('keydown', event => {
if (isToggleShortcut(event)) {
event.preventDefault(); setMode(config.mode === 'hidden' ? 'open' : 'hidden');
}
}, true);
window.addEventListener('message', event => {
if (event.data?.type !== FRAME_SHORTCUT || !event.source || event.source === window) return;
try {
if (event.source.top === window || event.source.top === pageWindow) setMode(config.mode === 'hidden' ? 'open' : 'hidden');
} catch (_) { /* Ignore messages from unrelated or inaccessible windows. */ }
});
window.addEventListener('pagehide', () => { stopCollector('页面已离开,练习补齐已停止。'); autoAnswer.setEnabled(false); persistRecords(); });
window.addEventListener('pageshow', event => {
synchronizeReset();