BiDi背景中的文本插入符行为

时间:2016-11-24 15:31:39

标签: javascript html contenteditable right-to-left bidi

我很难理解现代浏览器在contenteditable上下文中如何使用BiDi / RTL文本处理插入符号。

这个问题的目的不是如何解决具体问题,而是更多关于决定采用哪种方法(在更广泛的背景下)。

我正在开发一个JS文本编辑器,它可以使用BiDi文本和自定义'标记'。

实施例: BiDi contenteditable div

我在这里做了一个简单的测试,以测试下面描述的一些情况:https://jsfiddle.net/vskmg1v4/1/

<div contenteditable id="editor" dir="rtl"><span class="text" dir="ltr">Hello</span><span class="text" dir="rtl">مرحبا</span><span class="text" dir="ltr">world</span></div>

现代浏览器上的BiDi支持远非完美。我发现Chrome中没有正确处理的一些内容(尚未在Safari和Firefox中测试过每个案例):

  1. 我没有找到任何有效的方法来控制BiDi上下文中中性/弱方向字符的显示方式。因此,使用具有特定文本方向(dir属性)的SPAN(参见上面的示例)。

  2. 在RTL上下文中,设置dir="rtl"属性是不够的:插入符号的方向是向后的(= LTR上下文的相同方向,这是错误的)。奇怪的是,Range对象内的偏移是正确的。

  3. 当在contenteditable元素内并使用箭头键从RTL跳转到LTR元素(反之亦然)时,插入符号似乎跳过一个位置。正如您在上面的JSFiddle中看到的那样,您无法在RTL范围的末尾移动插入符号,因为它在父div的开头跳转(开头=元素的结尾,因为它的方向是RTL)。

  4. 通过箭头键导航被破坏(您无法在包含“世界”的SPAN内移动)

  5. 对于其中一些行为,我找到了解决方案,只是捕获“keydown”事件并强制插入符号像它应该的那样移动。无论如何,这并不能解决上述所有问题并引入新问题。

    我要问的是:

    1. 我看了TinyMCE和其他WYSIWYG编辑,从我看到的他们使用某种假插入符号。这是解决这些不一致问题的唯一方法吗?我该如何实施呢?

    2. 考虑到浏览器的变化以及将来不可避免地会引入的错误,解决方案是否足够保守?

    3. PS:浏览器兼容性对我来说不是主要关注点:IE,Edge,Opera等不会受到设计的支持。

0 个答案:

没有答案