我可以获取输入框光标的实际位置,但如何获取该位置上的整个单词?例如,我的输入框中有以下文本:Hello World
,而光标位于第 2 个位置。如何获取 Hello
?
我可以获取输入框光标的实际位置,但如何获取该位置上的整个单词?例如,我的输入框中有以下文本:Hello World
,而光标位于第 2 个位置。如何获取 Hello
?
var value = $(el).val()
var split = el.selectionStart
var a = value.substring(0, split).match(/[A-Za-z]*$/)[0]
var b = value.substring(split).match(/^[A-Za-z]*/)[0]
console.log(a + b)
function getWord (str, curPos) {
var startIndex = (function _this (pos) {
if (!str.substring(pos, pos + 1).match(/[A-Za-z]/)) {
return pos + 1;
} else if (pos === 0) {
return 0;
} else {
return _this(pos - 1);
}
})(curPos - 1);
var endIndex = (function _this (pos) {
if (!str.substring(pos, pos + 1).match(/[A-Za-z]/) || pos === str.length) {
return pos;
} else {
return _this(pos + 1);
}
})(curPos + 1);
return str.substring(startIndex, endIndex);
}
在这里查看工作示例:http://jsfiddle.net/paulbruno/8PR9H/
这里是发生的事情。 getWord
接受输入字符串 str
和光标的当前位置 curPos
。然后,它使用两个递归匿名函数将字符串推进每个方向,直到它们达到字符串的开头和结尾。严格来说,它们被称为“命名函数表达式”(请参见此处),并允许您递归调用函数,即使您不想保存函数对象以供以后使用。然后,在获取这两个索引之后,getWord
再次使用 substring
方法,从原始的 str
中传回单词。
以下代码通过查找起始位置左右两侧的第一个空格字符,并返回它们之间的字符串。它会考虑由空格分隔的任何连续字符串,并且即使输入是字母数字混合也能正常工作:
function myGetWord(aString,aPos){
Nstr = aString.length;
var start = aPos;
var end = aPos;
while (start>0 && aString[start]!=" ")
start--;
while (end<Nstr && aString[end]!=" ")
end++;
return aString.substring(start,end);
}
var el=document.getElementById('el');
var run=document.getElementById('run');
function findWord(str,pos){
var words=str.split(' ');
var offset=0;
var i;
for(i=0;i<words.length;i++){
offset+=words[i].length+1;
if (offset>pos) break;
}
return words[i];
}
run.onclick=function(){
run.value='Word at cursor: '+findWord(el.value,el.selectionStart);
};
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[...]
这样的字符串,可能会导致 CPU 崩溃。一个好主意是检查是否有任何空格。 - Ismael Miguel