From 306f5a61cbfa2cff69e13523b524964403fb4a66 Mon Sep 17 00:00:00 2001 From: laoyang Date: Thu, 5 Nov 2026 13:19:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BE=E7=89=87=E8=BD=AE=E6=92=AD=E5=88=87?= =?UTF-8?q?=E5=88=B0=E8=A7=86=E9=A2=91=E5=90=8E=E5=B7=A6=E5=8F=B3=E9=94=AE?= =?UTF-8?q?=E5=A4=B1=E6=95=88=20(#57)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户 2026-11-05:「行程里面图片轮播的时候,切换到视频,上下左右键就失效了。」 根因:键盘处理里有 isImage() 判断,只有当前是图片才翻页: if (e.key === ArrowLeft && isImage()) { step(-1); } 切到视频后 isImage() 为 false,两个分支都进不去。 当初这么写是因为「视频/PDF 里方向键另有含义,不能抢」—— 顾虑是对的(视频左右键是快退/快进),但解法错了: 一刀切禁掉,而不是看焦点在哪。 修法:改成判断事件目标 function inMediaControl(t) { return !!t.closest("video, iframe"); } if (inMediaControl(e.target)) { return; } // 放行给控件 其余情况照常翻页,不再限制只有图片 行为矩阵: 焦点在 video 里 → 视频快退/快进(不被抢) 焦点在 PDF iframe 里 → PDF 自己翻页(不被抢) 焦点在别处 / 视频未聚焦 → 上一张 / 下一张 上下键保持不处理:页面滚动、视频音量另有含义。 --- assets/js/preview.js | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/assets/js/preview.js b/assets/js/preview.js index 9cafb9c..17b0c64 100644 --- a/assets/js/preview.js +++ b/assets/js/preview.js @@ -186,9 +186,28 @@ cur = -1; } - /** 正在看的是不是图片(视频/PDF 里方向键另有含义,不能抢) */ - function isImage() { - return items[cur] && (items[cur].getAttribute('data-prev') || '') === 'image'; + /** + * 按键是否发生在**媒体控件内部**(视频 / PDF iframe)。 + * + * 🔴 #58(用户 2026-11-05):「行程里面图片轮播的时候,切换到视频, + * 上下左右键就失效了。」 + * + * 原来的写法是 `if (e.key === 'ArrowLeft' && isImage())` —— + * 只有**当前是图片**才翻页,切到视频后左右键直接失效。 + * + * 当年这么写的顾虑(注释原文)是「视频/PDF 里方向键另有含义,不能抢」, + * 这个顾虑对:视频的左右键是快退/快进,PDF 里是翻页。 + * + * 但**一刀切禁掉**是错的解法。正确做法是看**事件目标**: + * · 按键发生在 video/iframe 内部 ⇒ 让它自己处理(快进、翻页) + * · 按键发生在别处(背景、标题栏)⇒ 照常翻页 + * + * ⚠️ 视频**没聚焦**时 `e.target` 往往是 `` —— + * 这时用户没在操作视频,就是想换下一张,应该翻页。 + */ + function inMediaControl(t) { + if (!t || !t.closest) { return false; } + return !!t.closest('video, iframe'); } document.addEventListener('click', function (e) { @@ -210,7 +229,14 @@ document.addEventListener('keydown', function (e) { if (box.hidden) { return; } if (e.key === 'Escape') { close(); return; } - if (e.key === 'ArrowLeft' && isImage()) { e.preventDefault(); step(-1); return; } - if (e.key === 'ArrowRight' && isImage()) { e.preventDefault(); step(1); } + + /* #58:焦点在视频/PDF 控件里 ⇒ 放行给控件(快进、PDF 翻页)。 + 这样"视频里左右键是快进"和"轮播里左右键是翻页"**不冲突**。 */ + if (inMediaControl(e.target)) { return; } + + /* 其余情况:左右键翻页 —— **不再限制只有图片才能翻**。 + ⚠️ 上下键保持不处理:页面滚动/视频音量另有含义,抢了会别扭。 */ + if (e.key === 'ArrowLeft') { e.preventDefault(); step(-1); return; } + if (e.key === 'ArrowRight') { e.preventDefault(); step(1); } }); })();