我很难理解现代浏览器在contenteditable
上下文中如何使用BiDi / RTL文本处理插入符号。
这个问题的目的不是如何解决具体问题,而是更多关于决定采用哪种方法(在更广泛的背景下)。
我正在开发一个JS文本编辑器,它可以使用BiDi文本和自定义'标记'。
我在这里做了一个简单的测试,以测试下面描述的一些情况: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中测试过每个案例):
我没有找到任何有效的方法来控制BiDi上下文中中性/弱方向字符的显示方式。因此,使用具有特定文本方向(dir
属性)的SPAN(参见上面的示例)。
在RTL上下文中,设置dir="rtl"
属性是不够的:插入符号的方向是向后的(= LTR上下文的相同方向,这是错误的)。奇怪的是,Range对象内的偏移是正确的。
当在contenteditable
元素内并使用箭头键从RTL跳转到LTR元素(反之亦然)时,插入符号似乎跳过一个位置。正如您在上面的JSFiddle中看到的那样,您无法在RTL范围的末尾移动插入符号,因为它在父div的开头跳转(开头=元素的结尾,因为它的方向是RTL)。
通过箭头键导航被破坏(您无法在包含“世界”的SPAN内移动)
对于其中一些行为,我找到了解决方案,只是捕获“keydown”事件并强制插入符号像它应该的那样移动。无论如何,这并不能解决上述所有问题并引入新问题。
我要问的是:
我看了TinyMCE和其他WYSIWYG编辑,从我看到的他们使用某种假插入符号。这是解决这些不一致问题的唯一方法吗?我该如何实施呢?
考虑到浏览器的变化以及将来不可避免地会引入的错误,解决方案是否足够保守?
PS:浏览器兼容性对我来说不是主要关注点:IE,Edge,Opera等不会受到设计的支持。