前言
使用univer在线文档编辑器,正常全屏打开功能正常,内嵌到弹窗打开,数据可正常加载,但是不可以删除和右键,键盘事件捕获不到
原因
弹窗打开时,浏览器窗口本身可能没有获得系统级焦点,或者 Element Plus 弹窗的焦点锁定机制把焦点"困"在了一个不可编辑的区域,导致编辑器虽然显示正常,但键盘事件根本传不到 Canvas 里。
解决
缺少一个 @opened="onDialogOpened"捕获焦点事件
html
<!-- 在线文件弹窗 -->
<el-dialog class="dialog" v-model="iframeDialogVisible" title="在线文件" :style="{ width: '95%', height: '95%' }"
destroy-on-close
@opened="onDialogOpened"
@close="handleDialogClose">
<div style="max-height: 70vh; overflow-y: auto;">
<OnlineFile
ref="onlineFileRef"
v-if="iframeDialogVisible"
:paramId="currentSheetId"
:paramType="'sheet'"
:openType="'popup'"
@save-rolo-params="handleSaveRoloParams"
/>
</div>
</el-dialog>
js
// 弹窗打开后的回调,处理编辑器聚焦
onDialogOpened() {
setTimeout(() => {
// 第一步:让浏览器窗口获得系统级焦点
window.focus()
// 第二步:强制让 document.body 失焦再聚焦,重置焦点状态
document.body.focus()
document.body.blur()
// 第三步:聚焦编辑器
setTimeout(() => {
const canvas = document.querySelector('canvas')
if (canvas) {
canvas.focus()
canvas.click()
// 派发一个无害的键盘事件激活编辑器
const keyEvent = new KeyboardEvent('keydown', {
key: 'Shift',
code: 'ShiftLeft',
keyCode: 16,
bubbles: true,
composed: true
})
canvas.dispatchEvent(keyEvent)
}
}, 150)
}, 300)
},