我正在开发基于textarea的自定义令牌字段。我们的想法是让一个带有div元素的textarea绝对位于上方,所以看起来就像它们在文本区域一样。
到目前为止,这是痛苦的,但除了一件事,我设法做了很多事。
甚至可以在javascript中设置反向选择吗?当您将光标放在textarea中间的某个位置时,按住shift并按向左箭头几次,您将获得一个选择。棘手的部分是,它不常见 - 它是向后的(它的开始是从最后开始,而不是通常)。我的textarea中有占位符,我在其上显示我的div(令牌)。当您导航到其中一个时,光标会跳转到占位符的相对边缘,因此感觉很自然。当您按住shift并到达占位符时,它会跳转到右侧,并设置一个新选择,因此看起来您选择了令牌(您可以按删除,并使用令牌本身删除所选范围,这很酷) 。但是如果你从右向左导航它就不会起作用,因为设置一个新的选择将使它不被反转:
从左到右选择:
abcde[start]efg[end](token)
[shift]+[right]
abcde[start]efg(token)[end]
[del]
abcde
从右向左选择
(token)[end]efg[start]abcde
[shift]+[left]
[start](token)abcdeefg[end] //see? it's back to normal
[shift]+[left]
[start](token)abcdeef[end]g //huh?! shift-right moves end point (unexpected)
abcde
所以这里有一个问题:我可以在textarea中设置一个选择,其中起点将大于终点吗?简单地element.setSelectionRange(right, left)
在Firefox中不起作用,还有其他想法吗?
答案 0 :(得分:1)
在Firebug控制台中进行了一些实验后,我认为这并非易事。但是,您可以拦截按键事件:
如果用户按下左箭头,您必须自己将选择范围扩展到左侧并返回false
。然后没有调用浏览器的默认值,但用户仍然感觉向左选择。
textarea.onkeypress = function (event) {
if (!event){event = window.event; /* %#$! IE */ }
if (event.shiftKey && event.keyCode == 37 /* left */) {
event.target.selectionStart = currentSelectionStart - 1;
}
return false;
};
37是左箭头,38是向上,39是向右,40是向下。