Skip to content

概览

基于 Clipboard API + Permissions API

浏览器剪贴板能力的完整封装:文本 / HTML / 图片读写、文件粘贴、剪切、事件监听,自带降级策略和统一错误类型。

快速开始

ts
import { writeText, readText, writeImage, onFilePaste } from '@bilibaba/ts-lab/browser'

// 复制
await writeText('Hello, world!')

// 粘贴
const text = await readText()

// 图片
canvas.toBlob(async (blob) => { if (blob) await writeImage(blob) }, 'image/png')

特性检测

在调用 API 之前,可以先检测当前环境的支持情况:

ts
import {
  isSecureContext,
  isClipboardApiSupported,
  isRichClipboardSupported,
  isExecCommandSupported,
  queryClipboardPermission,
} from '@bilibaba/ts-lab/browser'

isSecureContext()              // boolean — 是否 HTTPS / localhost
isClipboardApiSupported()      // boolean — 是否支持 Clipboard API
isRichClipboardSupported()     // boolean — 是否支持 ClipboardItem(图片 / HTML)
isExecCommandSupported()       // boolean — 是否支持 execCommand 降级

// 查询权限状态:'granted' | 'denied' | 'prompt' | 'unknown'
await queryClipboardPermission('clipboard-write')
await queryClipboardPermission('clipboard-read')

错误处理

所有 API 抛出统一的 ClipboardError

ts
import { ClipboardError } from '@bilibaba/ts-lab/browser'

try {
  await writeText('hello')
} catch (err) {
  if (err instanceof ClipboardError) {
    console.log(err.code) // 'NOT_SUPPORTED' | 'PERMISSION_DENIED' | ...
    console.log(err.message)
  }
}
错误码含义
NOT_SUPPORTED当前环境不支持该能力
PERMISSION_DENIED用户 / 系统拒绝了剪贴板权限
NOT_FOCUSED页面未处于焦点
EMPTY_CLIPBOARD剪贴板为空或无匹配类型
INSECURE_CONTEXT非 HTTPS / localhost
UNSUPPORTED_MIME_TYPE尝试写入不允许的 MIME 类型
UNKNOWN其他未知错误

降级策略

API降级行为
writeTextClipboard API → execCommand('copy')
readText无降级,不支持时抛出 NOT_SUPPORTED
writeRich / readRich无降级,需要 ClipboardItem 支持
cutTextexecCommand('cut')writeText

安全上下文

readTextreadRichreadImagewriteRich 需要 HTTPS / localhost。 本地开发时 http://localhost 被视为安全上下文。