diff --git a/frontend/src/pages/DataAnnotation/Annotate/LabelStudioTextEditor.tsx b/frontend/src/pages/DataAnnotation/Annotate/LabelStudioTextEditor.tsx index afaf393..0cbec5a 100644 --- a/frontend/src/pages/DataAnnotation/Annotate/LabelStudioTextEditor.tsx +++ b/frontend/src/pages/DataAnnotation/Annotate/LabelStudioTextEditor.tsx @@ -172,6 +172,13 @@ export default function LabelStudioTextEditor() { const [segments, setSegments] = useState([]); const [currentSegmentIndex, setCurrentSegmentIndex] = useState(0); + const focusIframe = useCallback(() => { + const iframe = iframeRef.current; + if (!iframe) return; + iframe.focus(); + iframe.contentWindow?.focus?.(); + }, []); + const postToIframe = useCallback((type: string, payload?: unknown) => { const win = iframeRef.current?.contentWindow; if (!win) return; @@ -600,6 +607,25 @@ export default function LabelStudioTextEditor() { initEditorForFile(selectedFileId); }, [selectedFileId, iframeReady, initEditorForFile]); + useEffect(() => { + if (!iframeReady) return; + focusIframe(); + }, [focusIframe, iframeReady]); + + useEffect(() => { + if (!lsReady) return; + focusIframe(); + }, [focusIframe, lsReady]); + + useEffect(() => { + if (!lsReady) return; + const handleWindowFocus = () => { + focusIframe(); + }; + window.addEventListener("focus", handleWindowFocus); + return () => window.removeEventListener("focus", handleWindowFocus); + }, [focusIframe, lsReady]); + const segmentTreeData = useMemo(() => { if (!segmented || segments.length === 0) return []; const lineMap = new Map(); @@ -870,7 +896,7 @@ export default function LabelStudioTextEditor() { {/* 右侧编辑器 - Label Studio iframe */}
{/* 编辑器区域 */} -
+
{(!iframeReady || loadingTaskDetail || (selectedFileId && !lsReady)) && (