【问题标题】:How to prevent caret misplacement when deleting elements in a contenteditable div删除内容可编辑 div 中的元素时如何防止插入符号错位
【发布时间】:2012-10-04 05:18:23
【问题描述】:

当用户在评论框中输入内容时,我的应用程序包含一个预先输入功能。以与 Facebook 和 google+ 类似的方式,它将执行用户查找并即时建议他们作为标签。

当用户选择其中一个提供的标签时,它会作为一个元素输入到输入区域。

我决定为此使用可竞争的 div,但遇到了一些问题。

事实证明,当插入的元素设置为 contenteditable false 时,firefox 不会删除它们,而其他所有主流浏览器都会这样做。

为了解决这个问题,我将插入的“用户”标签设置为 contenteditble=true,并编写了一个快速的 jquery 解决方法来解决这个问题。

除了一个主要问题外,它还可以完美运行。如果该区域中有多个标签,并且其中第一个标签没有任何文本,那么当用户删除最后一个标签时(假设使用退格键从右到左删除),插入符号在最终删除后的位置不正确。

再次出现打字,然后位置恢复正常。

此问题仅在 Firefox 中出现

这是一个显示问题的 jsFiddle:

http://jsfiddle.net/gordyr/PESky/

将光标放在最后一个标签的末尾,然后按住退格键直到所有元素都被删除。您将看到光标/插入符号向上移动并移出位置。

这很可能实际上是 Firefox 本身的一个错误,但是我正在寻找某种解决方法,因为没有使用 javascript 自动删除元素,根本不会被删除。

非常感谢

【问题讨论】:

    标签: javascript jquery firefox


    【解决方案1】:

    FF 似乎留下了一些污垢,但您可以通过添加以下内容来清理它:

    if (!$.trim(el.text())) {
        el.empty();
    }
    

    这将检查 contenteditable 的 innerText 是否仅包含空格或换行符/换行符。如果是这样,只需清空它。似乎在我的测试中工作:http://jsfiddle.net/cBZ7k/

    旁注:您可能应该使用 keydown 而不是 keypress 来支持 webkit。另外,e.which 足以获取 keyCode,jQuery 会为您规范化此事件属性。

    【讨论】:

    • 绝对完美!我曾尝试过类似的想法,但出于某种愚蠢的原因并没有放弃使用修剪。它完美运行,谢谢。这段代码是 firefox 的 polyfill,因为所有其他浏览器似乎都表现正常......不管我的印象是 keypress 被认为是最佳实践,我不知道 jQuery 规范化 e.which...... 很好的信息。感谢您的帮助,我会尽快接受答复。
    • IMO contenteditable 很棒,但由于它支持“富文本”,它也可以通过用户输入填充很多脏东西。
    • 确实,看起来确实是这样……对我来说很棒的学习。大卫欢呼。
    猜你喜欢
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 2013-04-24
    相关资源
    最近更新 更多