96SEO 2026-08-01 19:33 5
前几个月做了一个业务文档风险分析的 AI 助理——将使用者上传的业务文件用 AI 协助分析并展示这份文档存在的所有风险点。里面有一个类似这样的需求:
前端实现锚点有很多种方案。但这里场景有所不同:我们会将使用者上传的 pdf、word 文件解析成 html 字符串并由服务端返回,前端根据这份 html 字符串渲染文档原文,在渲染后的内容中实现类似锚点交互。

项目中已经有使用 WangEditor 的富文本编辑器来渲染文档原文。为了保持统一、减少维护成本,也一样选择使用 WangEditor 实现此功能,所以问题归结为:如何在 WangEditor 渲染中实现锚点交互,并保留自定义标签与属性。
飞书里有一个复制选区链接功能:点击后会复制一个包含页面 ID、块 ID、选区索引等信息的链接。打开该链接时飞书会自动滚动到对应位置,并根据版本控制判断是否有效。
/* 前端请求 /create 接口 */
{
page_id,block_id,src_start_idx,src_end_idx。src_version,structure_version
}
/* 后端返回 anchor_id */
const link = `https://xxxx.feishu.cn/...#share-${anchorId}`;/* 前端解析 link 并请求 /anchor_info */
{
block_id,src_start_idx。src_end_idx
}
/* 前端计算偏移量并滚动 */
window.scrollTo;
痛点:
语雀采用传统 HTML 锚点:目录中的 `
The idea is to render risk points as a custom inline‑void element `
const myRisk = {
从type来看,"risk",attrs: { "data-anchor-id": anchorId },riskText: domElem.innerText || "",children: // void node 必须有 children
};
import { DomEditor } from "@wangeditor/editor";export function withRisk {
const { isInline,isVoid } = editor;editor.isInline = elem => {
return DomEditor.getNodeType === "risk"?true : isInline;},editor.isVoid = elem => {
return DomEditor.getNodeType === "risk"?true : isVoid;},说起来,return editor;}
javascript import { h } from 'snabbdom';
function renderRisk { const iconVnode = h('img',{ props的观点是。 {src:'https://example.com/icon.png'},style:{width:'1em',margin:'0 .1em'} });
return h('span',{
props的观点是,{contentEditable:false}。style:{marginLeft:'5px',color:'orange'},on:{click{ console.log }},attrs:{'data-anchor-id':elem.attrs}
},);
}
javascript
const renderElemConf = {
说到type。"risk",renderElem: renderRisk
};
javascript
const parseTemplateConf = {
selector:"doc-risk",parseElemHtml{
const anchorId=domElem.getAttribute||"";return {
type的观点是,"risk",attrs:{'data-anchor-id':anchorId}。riskText:domElem.innerText||"",children:
};}
},
*坑说明*
` 或 `` 时 parseElemHtml 不会触发,因为这些标签已被 Wangeditor 内置过滤;必须使用全新的自定义标签 `
javascript import { Boot } from "@wangeditor/editor";import { withRisk } from "./withRisk";import { renderElemConf } from "./renderConfig";import { parseTemplateConf } from "./parseConfig";其实,
Boot.registerPlugin;Boot.registerRenderElem;Boot.registerParseElemHtml;
javascript import React。{useEffect,useRef,useState} from 'react';import { Editor } from '@wangeditor/editor-for-react';import '@wangeditor/editor/dist/css/style.css';import './App.css';
function App{ const =useState;const wrapperRef=useRef;
const html=
This is normal text
;按理说,
useEffect=>{ ifreturn;editor.clear;话说回来,editor.dangerouslyInsertHtml;话说回来,editor.disable;return =>editor.destroy;},),
return (
| 痛点 | 本方案解决方式 | 成本 |
|---|---|---|
| 富文本默认过滤未知标签/属性 | 注册 registerParseElemHtml + 自定义 tag |
少量代码改动 |
| 锚点定位不到具体段落 | 用 data-anchor-id 在节点内部精确定位 |
简单 |
| 多版本/变更导致旧链接失效 | 可通过前后端接口返回最新 block_id 检查 | 与后台保持同步即可 |
WangEditor 可以通过 registerParseElemHtml 配合 inline/void 插件 和 Snabbdom 渲染 来保留自定义标签及其属性。从而在富文本渲染中实现精确的锚点交互。主要是的观点是,
这样既保持了 UI 一致性。又能满足业务对锚定与安全性的双关键求。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback