1

このコンテンツのテキストエリアがあります:

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

テキストエリアなのでフォーカス可能です。私は次の方法を見つけようとしています:

  1. テキストエリア内のすべての文を JavaScript 配列に分割します。私は$('#text').val().split()アプローチを試みましたが、私の例には複数の文区切りがあります。

  2. また、現在カーソルが置かれている文を知る必要もあります。

なぜ、あなたは尋ねるかもしれませんか?ユーザーがコンテンツを変更したときに、(文字ごとに課金される有料 API を使用して) 文を処理する必要があります。2 番目のセンテンスを少し変更しただけで、なぜ 1 番目、3 番目、4 番目のセンテンスを提出する必要があるのですか? もちろん、2 番目のものだけを提出する方がはるかに安価です。

前に言ったように、.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

これを行う最も簡単な方法は、あなたが言及したように str を split() することです。ただし、私の理解では (これへの参照が見つからないため)、jQuery には実際には split() 関数がありません。

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

ご覧のとおり、javascript の split 関数は正規表現を使用できます。ただし、正規表現は完全ではありません (遅くなりつつあります。明日、より良いものを探します)。

文を取得したら、キャレットの位置を取得するまで、各文字列の長さを数えるだけです。したがって、最初の文の長さを取得します。キャレット位置までの = より大きいかどうか、そうでない場合は、2 番目の文字列 + 最初の文字列の長さを取得します。それは = 以上です。それが等しいかそれよりも大きい場合、それが現在の文であり、使用しているインデックスは文番号です。

于 2012-06-20T03:50:10.303 に答える