7

如何通过当前插入符号位置在 textarrea 中获取单词?

我尝试过这样的事情,但是这只会将单词的第一个字母返回到插入符号位置的字符。例如:

如果光标在foo之间,它会返回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/

4

3 回答 3

5

尝试将代码中的这一行更改为:

 var result = /\S+$/.exec(this.value.slice(0, this.value.indexOf(' ',caret.end)));
于 2013-03-24T16:26:28.210 回答
1

偶然发现这个寻找香草JS答案并最终写了一个。这是一个相对安全的实用功能,适用于所有现代浏览器(您可以传入任何节点或在没有任何参数的情况下调用它以默认为document.activeElement)。

请注意,此方法可以返回未定义、零或 N 长度的空白字符串:

  • 给定这样的选择" ",将返回 2 长度的空白字符串
  • 如果没有选择且页面上没有插入符号(即 textarea 未聚焦)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)
    }
  }
}

于 2019-09-18T17:38:17.787 回答
0
val = input.value.split(" ");
last_word = val.length > 0 ? val[val.length-1] : val[0];
console.log(last_word);
于 2021-06-07T09:29:21.847 回答