1

我有一个包含以下内容的文本区域:

<textarea id="text">
Hello! Who am I? This is the third sentence. This, is another sentence.
</textarea>

因为它是一个文本区域,所以它可以被聚焦。我试图找到一种方法:

  1. 将 textarea 中的所有句子分隔成一个 javascript 数组。我尝试了一种$('#text').val().split()方法,但在我的示例中不止一个句子分隔符。

  2. 我还需要知道光标当前位于哪个句子中。

为什么,你可能会问?当用户更改其内容时,我需要处理(使用按字符收费的付费 API)句子。如果我只对第 2 句做一点改动,为什么要提交第 1、3、4 句?只提交第二个当然要便宜得多。

正如我之前所说,如果人们只使用点来分隔句子,.split() 方法将是完美的,但还有其他字符也应该考虑(!?。)——关于第二点,我找到了一个函数查找脱字符位置:

function doGetCaretPosition (ctrl) {
    var CaretPos = 0;
    if (document.selection) {
        ctrl.focus ();
        var Sel = document.selection.createRange ();
        Sel.moveStart ('character', -ctrl.value.length);
        CaretPos = Sel.text.length;
    } else if (ctrl.selectionStart || ctrl.selectionStart == '0') {
        CaretPos = ctrl.selectionStart;
    }
    return (CaretPos);
}

问题是,这个位置如何帮助我找到句号?欢迎所有想法!

4

1 回答 1

4

我能看到的最简单的方法是像你提到的那样 split() str 。根据我的理解(并且没有找到对此的任何引用),jQuery 实际上并没有 split() 函数,但是:

var str = $('#text').val();
var sentences = str.split(/[.|!|?]\s/gi);

如您所见,javascript 的 split 函数允许使用正则表达式。然而,正则表达式并不完美(现在已经很晚了,我明天会考虑得到一个更好的)。

一旦你有了句子,只需计算每个字符串的长度,直到你得到插入符号的位置。所以得到第一个句子的长度,是否比插入符号的位置更大,如果不是,得到第二个字符串的长度+第一个字符串,那个=或更大。如果它相等或更大,那么这就是您所在的句子,您使用的索引是句子编号。

于 2012-06-20T03:50:10.303 回答