Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript在光标之前获取单词_Javascript_Html_Cursor_Caret - Fatal编程技术网

JavaScript在光标之前获取单词

JavaScript在光标之前获取单词,javascript,html,cursor,caret,Javascript,Html,Cursor,Caret,好的,我一直在网络上寻找解决方案,但我找不到,有没有办法在可编辑div中插入符号位置之前找到单词,有点像: This is some| demo texts 这应该返回单词“some”。。。我不知道这是否可行,我很高兴能得到任何帮助,谢谢:)。使用插入符号位置查找器方法,前提是这将满足您的需要 函数ReturnWord(文本,caretPos){ var index=text.indexOf(caretPos); var preText=text.substring(0,caretPos);

好的,我一直在网络上寻找解决方案,但我找不到,有没有办法在可编辑div中插入符号位置之前找到单词,有点像:

This is some| demo texts

这应该返回单词“some”。。。我不知道这是否可行,我很高兴能得到任何帮助,谢谢:)。

使用插入符号位置查找器方法,前提是这将满足您的需要

函数ReturnWord(文本,caretPos){
var index=text.indexOf(caretPos);
var preText=text.substring(0,caretPos);
if(借口索引(“”>0){
var words=借口。拆分(“”);
返回单词[words.length-1];//返回最后一个单词
}
否则{
返回借口;
}
}
函数AlertPrevWord(){
var text=document.getElementById(“textArea”);
var caretPos=GetCaretPosition(文本)
var word=ReturnWord(text.value,caretPos);
if(word!=null){
警惕(word);
}
}
函数GetCaretPosition(ctrl){
var CaretPos=0;//IE支持
if(文档选择){
ctrl.focus();
var Sel=document.selection.createRange();
Sel.moveStart('character',-ctrl.value.length);
CaretPos=Sel.text.length;
}
//Firefox支持
else if(ctrl.selectionStart | | ctrl.selectionStart=='0')
CaretPos=ctrl.selectionStart;
返回(CaretPos);
}



这里是一个使用
选择
范围
对象的粗略方法

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 '';
}
您可以在此处看到它的作用:。 这在IE中不起作用。如果您需要IE支持,请查看Rangy库。

我有过类似的功能,但在我的Chrome浏览器中没有选择。根据我在这里的另一个答案:-我相应地将其更改为:

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 '';
    }
}

您有任何浏览器要求吗?人们也会想知道jquery是否合适。是的,使用你想要的所有web语言,最好是所有浏览器,但主要是firefox:)可以制作一个JSFIDLE吗?因为我不知道如何在文本区域中实现这一点……通过
OP表示插入符号位置,而不是源字符串中的实际垂直线字符。@Dmitry Pashkevich更新了我的答案这正是我想要的,但我无法在可编辑内容的div中实现这一点,我不确定为什么???如果将ctrl.value和text.value替换为ctrl.innerText&text.innerText,则我将
.value
更改为
.innerHTML
@Lenny,但这在IE中不起作用。我不知道Firefox的解决方案。div.selectionStart返回未定义的。这是一个很好的解决方案,但这将省略光标前的字符。将修复和后期编辑。