javascript - 尝试将空跨度添加到 contenteditable div 时左右按钮行为异常

标签 javascript jquery html caret getcaretpos

在我的项目中,我试图在插入符号位于 contenteditable div 中的任何地方添加一个跨度。此 span 元素将用作间接获取插入符号的偏移位置。

var _spanElem = "<span class='spanPos'></span>";

现在,我可以在 contenteditable div 中获得 care 位置,而且我知道如何在插入位置删除和添加 span 元素。

但问题是,当我执行此操作时,向左和向右按钮出现异常。

请看这个 link

    _result.remove('.spanPos'); //removing
    var text = _fullText.slice(0, _caretPos) + _spanElem + _fullText.slice(_caretPos);
    _result.html(text);  //adding at new position

当您按下右键时,span 元素成功移除并添加到新的插入符号位置,但按下左键时,插入符号移动到初始位置而不是下一个位置。

有什么办法解决这个问题吗?

我正在寻找适用于 IE8+ 和 firefox(chrome 是可选的)的解决方案。

最佳答案

我弄清楚了问题并修复了左右的错误行为,这是更新的 fiddle http://jsfiddle.net/2PS3m/5/包含修复。

发生的事情是:

在您的 setAutoCompletePos() 函数中,您基本上完全替换了 _result 元素的内容 ( _result.html(text); ),这使得它失去了选择并在开头跳转

看似按键失误,实际上是丢失原文+选择/插入符位置

解决方案是在更改元素内容后执行 restoreSelection(),这实际上将插入符设置回原来的位置。

我还将 keydown 更改为 keyup 并向元素添加了一个 mouseup 事件,以便在发生任何事情之前保存初始选择。

对于这样的操作,最好使用 keyup 事件而不是 keydown 以允许插入符号在您执行所需操作之前更改位置。

mouseup 事件本质上用于捕获用户在文本中的点击,并将插入符号的初始位置存储在我添加到您的代码中的变量中。

所以你的 setAutoCompletePos 函数变成了这样并且按预期工作:

function setAutoCompletePos() {
    var offsetPos;
    _result.remove('.spanPos');
    var text = _fullText.slice(0, _caretPos) + _spanElem + _fullText.slice(_caretPos);
    _result.html(text);
    restoreSelection(_result.get(0), _savedSel); //added this
    offsetPos = $('.spanPos').offset();
}

从修改后的fiddle中获取代码http://jsfiddle.net/2PS3m/5/ 尝试一下,告诉我它是否适合你,我对它的测试表明它按预期工作,开始时没有光标跳转。

关于javascript - 尝试将空跨度添加到 contenteditable div 时左右按钮行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16331088/

相关文章:

Html 和 CSS - 文本高度不同

javascript - 如何隐藏视差溢出?

javascript - 如何更新单个 firebase firestore 文档

javascript - 显示加载图像

jquery - 如何在 $.ajax 之外调用变量?

jquery - tinymce keyup 事件不会在 Tab 键上触发

php - 上传,处理,存储和交付用户提供的文件和图像

javascript - 从一个框架集中访问另一个框架集中的元素

javascript - 如何设置 jquery ui 对话框显示

javascript - 在 HTML 底部使用多个 &lt;script&gt; 标记