如何通过当前的插入位置在textarrea中找到一个单词?
我尝试了类似这样的东西,但这只返回第一个字母到达插入位置的字符。例如:
如果光标位于 fo 和 o 之间,则会返回fo
而不是foo
。
Fo |
o bar不等于bar foo。 => Fo
期待Foo
Foo bar与bar foo不等|
。 => equ
期待equal
。
这是我到目前为止所做的:
function getCaretPosition(ctrl) {
var start, end;
if (ctrl.setSelectionRange) {
start = ctrl.selectionStart;
end = ctrl.selectionEnd;
} else if (document.selection && document.selection.createRange) {
var range = document.selection.createRange();
start = 0 - range.duplicate().moveStart('character', -100000);
end = start + range.text.length;
}
return {
start: start,
end: end
}
}
$("textarea").keyup(function () {
var caret = getCaretPosition(this);
var result = /\S+$/.exec(this.value.slice(0, caret.end));
var lastWord = result ? result[0] : null;
alert(lastWord);
});
答案 0 :(得分:5)
尝试将代码中的这一行更改为:
var result = /\S+$/.exec(this.value.slice(0, this.value.indexOf(' ',caret.end)));
答案 1 :(得分:0)
偶然发现这个问题,寻找香草JS答案,最后写了一个。这是一个相对安全的实用程序函数,将在所有现代浏览器上运行(您可以传入任何节点,也可以在不使用任何参数的情况下调用它,以将其默认设置为document.activeElement
)。
请注意,此方法可以返回未定义的,零个或N个长度的空格字符串:
" "
,将返回长度为2的空白字符串undefined
将被返回// returns the current window selection if present, else the current node selection if start and end
// are not equal, otherwise returns the word that has the caret positioned at the start/end/within it
function getCurrentSelection (node = document.activeElement) {
if (window.getSelection().toString().length > 0) {
return window.getSelection().toString()
}
if (node && node.selectionStart !== node.selectionEnd) {
return node.value.slice(node.selectionStart, node.selectionEnd)
}
if (node && node.selectionStart >= 0) {
const boundaries = {
start: node.selectionStart,
end: node.selectionStart
}
const range = document.createRange()
range.selectNode(node)
const text = range.cloneContents().textContent
if (text) {
let i = 0
while (i < 1) {
const start = boundaries.start
const end = boundaries.end
const prevChar = text.charAt(start - 1)
const currentChar = text.charAt(end)
if (!prevChar.match(/\s/g) && prevChar.length > 0) {
boundaries.start--
}
if (!currentChar.match(/\s/g) && currentChar.length > 0) {
boundaries.end++
}
// if we haven't moved either boundary, we have our word
if (start === boundaries.start && end === boundaries.end) {
console.log('found!')
i = 1
}
}
return text.slice(boundaries.start, boundaries.end)
}
}
}
答案 2 :(得分:0)
val = input.value.split(" ");
last_word = val.length > 0 ? val[val.length-1] : val[0];
console.log(last_word);