在我的项目中,我试图在插入符号在可满足的div中添加一个span。此span元素将被用作间接获取插入符号的偏移位置。
var _spanElem = "<span class='spanPos'></span>";
现在,我可以在可满足的div中获得插入符号的位置,我也知道如何在插入符号位置删除和添加span元素。
但问题是,当我做这个操作,左和右按钮是错误的行为。
请查看链接
_result.remove('.spanPos'); //removing
var text = _fullText.slice(0, _caretPos) + _spanElem + _fullText.slice(_caretPos);
_result.html(text); //adding at new position
当您按下右键时,span元素成功地移除并添加到新的插入符号位置,但按下左键时,插入符号移动到初始位置而不是下一个位置。
有什么解决办法吗?
我正在寻找一个解决方案,在IE8+和火狐(chrome是可选的)。
我找出了问题,我修复了行为不端的左和右,这里是更新的小提琴http://jsfiddle.net/2PS3m/5/与修复包括。
发生的事情是:
在setAutoCompletePos()函数中,您实际上完全替换了_result元素的内容(_result.html(text);)这使得它失去了选择并且在开始处跳跃
看似错误的键,实际上是丢失了原始文本+选择/插入符号位置
解决方案是在更改元素的内容后执行restoreresselection(),这实际上是将插入符号设置回原来的位置。
我还将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/获取代码,尝试它并告诉我它是否适合您,我对它的测试表明,它按预期工作,开始时没有光标跳转。