获取有关插入位置的最新信息

时间:2013-03-24 16:01:03

标签: jquery string textarea word getcaretpos

如何通过当前的插入位置在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);
});

http://fiddle.jshell.net/gANLv/

3 个答案:

答案 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);