【问题标题】:React controlled contenteditableReact 受控内容可编辑
【发布时间】:2018-01-12 07:12:06
【问题描述】:

您好,我正在尝试创建一个 react contenteditable div 组件,该组件的工作方式类似于输入字段,但具有一些我想要实现的附加功能,但由于功能很少,我想自己实现它而不是使用某些东西像 slatejs 或 Draftjs 做这么多繁重的工作。

我的想法是我应该有一个受控的 contenteditable div,我可以监听插入一些文本的事件。 (就像react controlled components 的一般概念)

看起来很简单。我应该监听 keydown 事件,并且在每个事件上我只需将相应的字符(event.key)插入我的状态。但是我发现在带有触摸键盘的移动设备上,这个值(event.key)总是“未识别”。

有时输入事件也有一个“数据”属性来确定插入的值。但在触摸键盘中,该事件没有“数据”属性。

所以我的问题是,我们如何才能在桌面和移动设备上以一种全球通用的方式插入字符? Draftjs 和 slatejs 作者如何检测插入的字符(即使在触摸移动设备上)并更新它们的状态?

【问题讨论】:

  • 这就是为什么draft.js 也不支持移动设备。
  • 我不知道 draft.js 支持,但 slate.js 在我测试时支持移动设备。他们为此使用 onBeforeInput。

标签: javascript reactjs contenteditable draftjs


【解决方案1】:

我终于得到了答案 事实证明,在 react 中有一个名为 onBeforeInput 的事件可以在 contenteditable div 上使用,并且有一个名为 data 的属性对应于要插入的文本(在移动设备和桌面上)。此事件是可取消的,因此您可以调用 preventDefault 并更新您的状态。 不幸的是,这个事件在任何 react docs (!!) 中都没有提到,我是从他们的 github repo 上的一个问题中找到的。

【讨论】:

  • 我相信beforeinput 是一个普通的 JavaScript 事件,但它的文档也不是很好。在 MDN 上,事件的页面 developer.mozilla.org/en-US/docs/Web/Events/beforeinput 链接到来自例如 InputEvent 页面,但它是红色的,这意味着它还不存在。另一方面,React 的版本似乎功能更全面,例如它具有 data 属性,即使在原生还不支持它的浏览器(如 Firefox)上也是如此。
  • 不确定是否错误或此信息已过时,但如果我在输入事件前console.log,它会显示canceable: false
  • 看起来几乎 60% 的用户在浏览器中不支持 beforeinput caniuse.com/?search=beforeinput
  • @ArneHugo 不,实际上并非如此。似乎 React 在后台将 beforeinput 事件转换为特定于具有良好支持的每个浏览器的东西。对于 chrome,它是 textInput(注意大写 i)。
  • 不错。通过使用onBeforeInput,是否可以在不破坏撤消(ctrl+Z)的情况下更改contentEditable 的值?
猜你喜欢
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 2017-06-05
  • 2016-12-25
相关资源
最近更新 更多