- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Draft.js 开发富文本编辑器(太棒了!)。以下代码允许用户编辑链接,逻辑上工作正常,但我对用户体验不满意。
如果用户选择链接的一部分并运行这段代码,这段代码会将链接分成多个链接,这不是用户想要的。
例如,如果一个阶段“买这本书”与 URL-A 链接,并且用户选择“购买这本书”,并将其更改为 URL-B,则该部分将与 URL-B 链接,但是“book"仍然与 URL-A 链接。
理想情况下,当用户选择链接文本的一部分时,我想自动将选择范围扩展到整个链接,然后执行这段代码。
但是,我不知道该怎么做(将选择范围扩大到整个链接)。
editLink = () => {
const { editorState } = this.state;
const selection = editorState.getSelection();
if (selection.isCollapsed()) {
return;
}
let url = ''; // default
const content = editorState.getCurrentContent();
const startKey = selection.getStartKey();
const startOffset = selection.getStartOffset();
const blockWithLinkAtBeginning = content.getBlockForKey(startKey);
const linkKey = blockWithLinkAtBeginning.getEntityAt(startOffset);
if (linkKey) {
const linkInstance = content.getEntity(linkKey);
url = linkInstance.getData().url;
}
let link = window.prompt("Paste the link", url);
if (!link) {
console.log("removing link");
const newEditorState = RichUtils.toggleLink(editorState, selection, null);
this.setState({ editorState: newEditorState });
return;
}
console.log("adding a link", link);
const contentWithEntity = content.createEntity('LINK', 'MUTABLE', { url: link });
const entityKey = contentWithEntity.getLastCreatedEntityKey();
const newEditorState = EditorState.set(editorState, { currentContent: contentWithEntity });
const yetNewEditorState = RichUtils.toggleLink(newEditorState, newEditorState.getSelection(), entityKey);
this.setState({ editorState: yetNewEditorState} );
}
如果有任何帮助或建议,我将不胜感激。
最佳答案
有两种方法可以做到这一点。第一个可能是您正在尝试的——在当前链接之上应用一个新链接,从而覆盖它。这不是最好的方法,但可以做到。
第二个更简单。在 ContentState
对象中,有一个方法 replaceEntityData()
。所以你可以这样实现它:
editLink = () => {
const { editorState } = this.state;
const selection = editorState.getSelection();
if (selection.isCollapsed()) {
return;
}
let url = ''; // default
const content = editorState.getCurrentContent();
const startKey = selection.getStartKey();
const startOffset = selection.getStartOffset();
const block = content.getBlockForKey(startKey);
const linkKey = block.getEntityAt(startOffset);
let link = window.prompt("Paste the link", url);
if (!link) { //REMOVING LINK
var contentWithRemovedLink = content;
block.findEntityRanges(charData => { //You need to use block.findEntityRanges() API to get the whole range of link
const entityKey = charData.getEntity();
if (!entityKey) return false;
return entityKey === linkKey //Need to return TRUE only for your specific link.
}, (start, end) => {
const entitySelection = new SelectionState({
anchorKey: block.getKey(), //You already have the block key
focusKey: block.getKey(),
anchorOffset: start, //Just use the start/end provided by the API
focusOffset: end })
contentWithRemovedLink = Modifier.applyEntity(content, entitySelection, null)
return;
})
const newEditorState = EditorState.set(
editorState, { currentContent: contentWithRemovedLink });
return;
}
console.log("adding a link", link);
//CHANGING LINK
const contentWithUpdatedLink = content.replaceEntityData(linkKey, { url: link });
const newEditorState = EditorState.set(editorState, { currentContent: contentWithUpdatedLink });
//Now do as you please.
}
删除链接:
在 ContentBlock
api 上,有一个名为 findEntityRanges()
的方法。该函数有两个参数:
(char: CharacterMetadata) => boolean
: characterMetadata 对象的过滤函数(每个连续的 ENTITY + INLINE_STYLE 组合都有一个唯一的 CharacterMetatdata
对象。你可以得到从那里通过 characterMetadata.getEntity()
获取实体。)。如果此函数执行为 TRUE,则执行 (2)。(开始:数字,结束:数字)=> 无效
。这使您可以访问每个执行 TRUE 的特定字符范围的开始和结束偏移量。现在您可以随心所欲地处理开始和结束。 之后,您可以应用包含整个链接的新 SelectionState
的 NULL 实体。这将删除链接实体。
更改链接:
您已经拥有 linkKey
。只需调用 content.replaceEntityData(linkKey, {url: "MY NEW URL"})
即可使用新 URL 生成新的 ContentState
。此处定义的 API:https://draftjs.org/docs/api-reference-content-state#replaceentitydata
关于reactjs - 如何在 Draft.js 中自动将选择范围扩展到整个链接文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56763449/
如何将浮点 10 字节十六进制字符串(Delphi 中的扩展数据类型)转换为 C# 数据类型? 例如:00 00 00 00 00 00 00 80 ff 3f 在 Delphi 1 最佳答案 涉及同
我正在阅读 this page上面写着 If one of the strings has an encoding prefix and the other doesn't, the one that
我有以下代码(作为示例),我想对其进行调整,以使功能区扩展到整个 xrange,如 geom_hline()做。功能区指示哪些值在可接受的范围内。在我的实际应用程序中,有时没有上限或下限,因此 hli
去年,斯科特·格思里 stated “如果您想要对执行的 SQL 进行绝对控制,您实际上可以覆盖 LINQ to SQL 使用的原始 SQL”,但我找不到描述可扩展性方法的文档。 我想修改以下 LIN
我尝试在我的应用中创建一个抽屉导航。我有 3 个当前选项(查看、声明、报告),当然这 3 个 Activity 已扩展到 fragment。在View 中,它有一个next 按钮,该按钮将转到另一个页
很抱歉,如果我的问题被重复,但我无法(或不知道如何谷歌)找到答案。我想使用 rxlifecycle-navi 库来将 rxjava 绑定(bind)到生命周期,所以我需要扩展 NaviActivity
有这个html: aaa 做的时候: $('#hi1').sayHi(); 我想收到一条“嗨”提醒 有人知道这是怎么做到的吗? 最佳答案 了解更多关于jQuery plugin authoring
我有一个 UIImageView 和一个 UITextView。当点击 UITextView 时,我需要 UITextView 在 UIImageView 上展开。我不知道该怎么做。 从这里 为此 最
以下语句: URLClassLoader ucl = (URLClassLoader) ClassLoader.getSystemClassLoader(); Class uclc = ucl.get
以下语句: URLClassLoader ucl = (URLClassLoader) ClassLoader.getSystemClassLoader(); Class uclc = ucl.get
$的意思是什么!在 shell 或 shell 脚本中?我正在尝试理解具有以下内容的脚本。 local@usr> a=1 local@usr> echo $a 1 local@usr> echo $!
我正在 GWT 中设计一个简单的应用程序,并且在客户端有不同的 View 。每个 View 都从 SimplePanel 扩展而来,并将根据需要添加到 RootPanel。 我的第一个 View 是
我尝试在 SQL Azure 选项卡中从 S2 扩展到 S3,但 S3 似乎不可用,尽管它已被引入。另外,我还有大量可用的 DTU,即 1900 左右。是否无法扩展到 S3?我是否需要导出数据库,然后
我有一个带有 JS、html 和 css 的自定义视频播放器。我的问题的关键是我没有预料到将其从一个视频扩展到两个视频,我希望重构它,以便我可以在一个页面上播放多个视频。我尝试将所有内容重写为 for
我当前正在开发的应用程序需要可扩展的实时通信。我们一直在研究并尝试 Firebase 实时数据库和 firestore。看来Firebase实时数据库更加成熟并且经过测试,而firestore仍处于测
当 pod 被 daemonset 控制时,pod 会出现一些错误,状态会是 CrashLoopBackOff ,我想删除这些 Pod 但不想删除 DaemonSet。 所以我想把daemonset缩
我有 Jframe 表单并创建了从中绘制图形的类,为此我需要将该 void 类扩展为 jframe 表单 package grafiktest; import java.awt.Color; impo
在布局和尺寸策略方面,我从来都不是太出色,所以这可能是一个简单的答案,但就是这样。 当我向 QTabWIdget 添加新选项卡并将小部件设置为 QSplitter 时,拆分器将使用给定的全部空间量。但
我在将我的 S4 对象转换回列表时遇到了一些问题。例如,以下嵌套的 S4 类: setClass("nssItem", representation(value = "numeric
在阅读了 DDD 的一些页面后,我了解了存储库模式,然后在应用程序中成功使用了它(我真的很喜欢它);然后我注意到 EntityManager 是 generic-repository-like,但是当
我是一名优秀的程序员,十分优秀!