packages/copy-text/src/index.ts (32 lines of code) (raw):

import { createTextarea } from './util'; const COMMAND = 'copy'; // check document FOR SSR export const COPY_SUPPORTED = typeof document !== 'undefined' && document.queryCommandSupported(COMMAND); export default function copyText(text = ''): boolean { const lastActiveElement = document.activeElement; if (!COPY_SUPPORTED) { return false; } const textarea = createTextarea(text); let result: boolean; try { textarea.value = text; textarea.select(); result = document.execCommand(COMMAND); /** * Safari (到目前最新的版本 15.2 都有)下兼容性问题: * * 1. select 可以运行,但无法真正选中文字 * 2. 因此 execCommand 返回 false * * 解决的办法是用 setSelectionRange 重新选一次 */ if (!result) { textarea.setSelectionRange(0, text.length); result = document.execCommand(COMMAND); } } catch (err) { result = false; } textarea.parentNode?.removeChild(textarea); // 把夺取过来的焦点归还给 lastActiveElement,但不能确定其是否存在或可见,必须 try-catch try { if (lastActiveElement) { (lastActiveElement as HTMLElement).focus(); } } catch (err2) { // ignore } return result; }