/** * Collabora 导航/跳转功能模块 * * @encoding UTF-8 */ import { sendUnoCommand } from '../Uno'; /** * 滚动到文档开头 (带焦点请求) * @param iframeWindow - iframe 的 contentWindow */ export async function unoScrollToTop(iframeWindow: Window): Promise { // 1. 先请求 iframe 获取焦点 const focusMessage = { MessageId: 'custompostMessage', Values: { Command: 'REQUEST_FOCUS', Args: {}, }, }; console.log('[custompostMessage] 请求焦点 (滚动到顶部)'); iframeWindow.postMessage(JSON.stringify(focusMessage), '*'); // 2. 等待焦点激活 await new Promise((resolve) => setTimeout(resolve, 100)); // 3. 发送滚动命令,要发三次,有时候卡在表格里面就是需要多发几次 sendUnoCommand(iframeWindow, '.uno:GoToStartOfDoc', {}); sendUnoCommand(iframeWindow, '.uno:GoToStartOfDoc', {}); sendUnoCommand(iframeWindow, '.uno:GoToStartOfDoc', {}); } /** * 跳转到指定页面 * @param iframeWindow - iframe 的 contentWindow * @param pageNumber - 页码(从1开始) */ export function unoGotoPage(iframeWindow: Window, pageNumber: number): void { sendUnoCommand(iframeWindow, '.uno:GotoPage', { Page: { type: 'long', value: pageNumber, }, }); } /** * 跳转到第一页 * @param iframeWindow - iframe 的 contentWindow */ export function unoFirstPage(iframeWindow: Window): void { sendUnoCommand(iframeWindow, '.uno:FirstPage', {}); } /** * 跳转到最后一页 * @param iframeWindow - iframe 的 contentWindow */ export function unoLastPage(iframeWindow: Window): void { sendUnoCommand(iframeWindow, '.uno:LastPage', {}); }