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

如何在Tiptap/React中获取光标选中区域的HTML或JSON内容?

解决Tiptap选中区域获取带自定义标签的HTML/JSON问题

textBetween方法本身就是用来提取纯文本的,拿不到自定义标签是正常的,要保留节点结构和自定义标签,试试下面两种方法:

获取选中区域的HTML

通过ProseMirror的Slice提取选中范围内的节点片段,再将片段序列化成HTML:

const { from, to } = editor.state.selection;
// 提取选中区域的节点片段
const slice = editor.state.doc.slice(from, to);
// 将片段转为临时文档
const tempDoc = editor.state.schema.node('doc', null, slice.content);
// 序列化HTML,会保留自定义标签
const selectedHtml = editor.storage.htmlSerializer.serialize(tempDoc);

注意:你的say-as自定义扩展要配置好HTML序列化规则,比如在扩展里添加:

export default SayAsExtension = Extension.create({
  // ... 其他基础配置
  addHTMLSerializer() {
    return {
      sayAs: (node) => {
        return `<say-as interpret-as="${node.attrs.interpretAs}">${node.textContent}</say-as>`;
      },
    };
  },
});

获取选中区域的JSON结构

如果需要包含自定义节点属性和结构的JSON数据,直接将提取的片段转为JSON即可:

const { from, to } = editor.state.selection;
const slice = editor.state.doc.slice(from, to);
const selectedJson = slice.content.toJSON();

返回的JSON会完整保留say-as节点的信息,示例结构如下:

{
  "type": "paragraph",
  "content": [
    { "type": "text", "text": "This shop has " },
    {
      "type": "sayAs",
      "attrs": { "interpretAs": "cardinal" },
      "content": [{ "type": "text", "text": "100" }]
    },
    { "type": "text", "text": " customers every day" }
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:32:09