解决 slate 编辑器在 safari 下的兼容问题及中文输入法光标问题

前言

用过 slate 编辑器的都知道它对于中文输入有以下兼容性问题:

  • 在 chrome 浏览器下,输入中文是,编辑区的光标始终停在拼音的前面(不影响输入,但体验很糟)
  • 在 safari 等支持 onbeforeinput 方法的浏览器下(HAS_INPUT_EVENTS_LEVEL_2)无法使用输入法输入中文

GitBook 使用的也是 slate 编辑器,但它对 slate 底层做了很多修改,解决了这些问题。在我对比 gitbook/slate 与 slate 时,没有找到解决方案。

后来,我在 slate 的 issue 里查找该问题,找到了一些不错的回答。

环境:slate 0.47.1 slate-react 0.22.1

光标停留在拼音前的问题

参考 pull request 。找到相关源代码,修改即可。

按照上述代码修改之后,发现光标问题解决了,且 safari 浏览器下也有了一些小变化:输入法能正常工作了,但是最后的输入内容不会输入到 浏览器内。

safari 输入问题

参考 issue 。最后面用户 hudk114 的评论里有提到,需要在 onCompositionEnd 时,根据是否需要插入数据(HAS_INPUT_EVENTS_LEVEL_2 为真时),调用 edit.insertText 插入数据。

这样写就行:

const isSynthetic = !!event.nativeEvent
if (isSynthetic && HAS_INPUT_EVENTS_LEVEL_2){
  editor.insertText(event.data);
}

修改了这两处之后,输入中文的问题即可解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要为Slate插件添加一个外部按钮以在构造器打开页面,您需要执行以下步骤: 1. 创建一个React组件来表示您的按钮。这个组件应该接受一个onClick prop,当按钮被点击时会被调用。 2. 在Slate构造器,使用withToolbar插件包装您的编辑器组件。withToolbar插件允许您自定义工具栏,以添加自己的按钮。 3. 在withToolbar插件的配置对象,添加一个自定义的按钮。这个配置对象应该包含一个按钮的图标、提示文本和点击处理程序。点击处理程序应该调用您的React组件的onClick prop。 4. 在您的React组件的onClick prop,使用window.open()方法打开您需要的页面。您可以使用URL参数来传递数据。 以下是一个示例代码片段,展示如何实现这个功能: ```js import React from 'react'; import { withToolbar } from '@slate-editor/with-toolbar'; // 1. 定义一个按钮组件 const MyButton = ({ onClick }) => { return ( <button onClick={onClick}> My Button </button> ); }; // 2. 使用withToolbar包装编辑器组件 const MyEditor = withToolbar({ // 3. 添加一个自定义按钮 buttons: [ { icon: 'my-icon', title: 'My Button', onClick: (editor) => { // 4. 在按钮被点击时打开一个页面 window.open('https://example.com/my-page'); }, component: MyButton, }, ], })(MySlateEditor); export default MyEditor; ``` 请注意,这只是一个示例代码片段,具体实现可能因您的具体需求而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值