好的,我一直在网上寻找解决方案,但我找不到一个,有没有办法在可编辑div中的插入位置之前得到这个词有点像:
This is some| demo texts
这应该返回“some”这个词......我不知道这是否可能,我会很高兴得到任何帮助,谢谢:)。
答案 0 :(得分:20)
使用提供here的Caret Position finder方法,这将做你想要的。
function ReturnWord(text, caretPos) {
var index = text.indexOf(caretPos);
var preText = text.substring(0, caretPos);
if (preText.indexOf(" ") > 0) {
var words = preText.split(" ");
return words[words.length - 1]; //return last word
}
else {
return preText;
}
}
function AlertPrevWord() {
var text = document.getElementById("textArea");
var caretPos = GetCaretPosition(text)
var word = ReturnWord(text.value, caretPos);
if (word != null) {
alert(word);
}
}
function GetCaretPosition(ctrl) {
var CaretPos = 0; // IE Support
if (document.selection) {
ctrl.focus();
var Sel = document.selection.createRange();
Sel.moveStart('character', -ctrl.value.length);
CaretPos = Sel.text.length;
}
// Firefox support
else if (ctrl.selectionStart || ctrl.selectionStart == '0')
CaretPos = ctrl.selectionStart;
return (CaretPos);
}
<input id="textArea" type="text" />
<br />
<input id="Submit" type="submit" value="Test" onclick="AlertPrevWord()" />
Here也是jsfiddle。
答案 1 :(得分:9)
以下是使用Selection
和Range
对象的粗略方法。
function getWord() {
var range = window.getSelection().getRangeAt(0);
if (range.collapsed) {
text = range.startContainer.textContent.substring(0, range.startOffset+1);
return text.split(/\b/g).pop();
}
return '';
}
您可以在此处看到它:http://jsfiddle.net/ggfFw/1/。 这在IE中不起作用。如果您需要IE支持,请查看Rangy库。
答案 2 :(得分:1)
我有类似https://stackoverflow.com/a/9960262/986160的内容,但在某些时候我的Chrome浏览器中没有选择。基于我在这里的另一个答案:https://stackoverflow.com/a/26728677/986160 - 我相应地改为:
function getLastWordBeforeCaret() {
const containerEl = document.getElementById('element-id');
let preceding = '';
let sel;
let range;
if (window.getSelection) {
sel = window.getSelection();
if (sel && sel.rangeCount > 0) {
range = sel.getRangeAt(0).cloneRange();
range.collapse(true);
range.setStart(containerEl, 0);
preceding = range.toString();
}
}
let queryMatch = preceding.match(/([^\s]+)$/i);
if (queryMatch) {
return queryMatch[1];
} else {
return '';
}
}