You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin/JS中如何实现带格式的剪贴板复制功能?

Kotlin/JS实现带格式复制到剪贴板

要在Kotlin多平台的Web端实现带格式复制,核心是通过Kotlin/JS的JS互操作能力,对应浏览器原生的ClipboardItem和Blob API,以下是完整实现方案:

步骤1:构造不同格式的Blob对象

浏览器要求剪贴板内容以Blob形式传递,我们需要分别创建HTML格式和纯文本格式的Blob:

import org.w3c.dom.Blob
import org.w3c.dom.BlobPropertyBag

// 定义带格式的内容和对应的纯文本降级内容
val formattedContent = "<h3>示例标题</h3><p>这是<b>带格式</b>的复制内容</p>"
val plainTextContent = "示例标题\n这是带格式的复制内容"

// 构造HTML格式Blob
val htmlBlob = Blob(
    arrayOf(formattedContent),
    BlobPropertyBag(type = "text/html")
)

// 构造纯文本格式Blob
val plainTextBlob = Blob(
    arrayOf(plainTextContent),
    BlobPropertyBag(type = "text/plain")
)

步骤2:创建ClipboardItem实例

由于Kotlin/JS目前没有为ClipboardItem提供强类型绑定,我们需要通过动态JS互操作来构造实例:

// 创建包含多格式Blob的动态对象
val clipboardData = js("{}")
clipboardData["text/html"] = htmlBlob
clipboardData["text/plain"] = plainTextBlob

// 构造ClipboardItem
val clipboardItem = js("new ClipboardItem(clipboardData)")

步骤3:写入剪贴板

调用浏览器的剪贴板API完成写入,注意该操作必须在用户交互(如点击事件)中触发,否则会被浏览器安全策略阻止:

import org.w3c.dom.navigator

// 用回调处理异步操作
fun copyFormattedContent() {
    navigator.clipboard.write(arrayOf(clipboardItem))
        .then { println("复制成功") }
        .catch { println("复制失败:${it.message}") }
}

// 或者用suspend函数处理(更符合Kotlin协程风格)
suspend fun copyFormattedContentCoroutine() {
    try {
        navigator.clipboard.write(arrayOf(clipboardItem))
        println("复制成功")
    } catch (e: Exception) {
        println("复制失败:${e.message}")
    }
}

完整绑定示例(点击触发)

将复制逻辑绑定到按钮点击,确保符合浏览器安全要求:

import org.w3c.dom.HTMLButtonElement
import kotlin.browser.document

fun main() {
    val copyButton = document.getElementById("copy-btn") as HTMLButtonElement
    copyButton.onclick = {
        val formattedContent = "<h3>示例标题</h3><p>这是<b>带格式</b>的复制内容</p>"
        val plainTextContent = "示例标题\n这是带格式的复制内容"

        val htmlBlob = Blob(arrayOf(formattedContent), BlobPropertyBag(type = "text/html"))
        val plainTextBlob = Blob(arrayOf(plainTextContent), BlobPropertyBag(type = "text/plain"))

        val clipboardData = js("{}")
        clipboardData["text/html"] = htmlBlob
        clipboardData["text/plain"] = plainTextBlob
        val clipboardItem = js("new ClipboardItem(clipboardData)")

        navigator.clipboard.write(arrayOf(clipboardItem))
            .then { println("复制成功") }
            .catch { println("复制失败:${it.message}") }
    }
}

内容的提问来源于stack exchange,提问作者vahidreza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 01:58:13