2

私はテキストボックスを持っています。ユーザーが入力できるようにしたいのは、括弧だけです。また、括弧のみを削除できる必要があります。私はこれを行うのにたくさんの問題を抱えています。

現在、次のような関数があります。

        '#myTextArea input': function (el, ev) {

        }

入力を使用したので、人々の貼り付けを処理できます。

ただし、これから入力された文字を見つける方法はわかりません。特に、括弧だけが削除されたことを確認する方法がわかりません。これを行う良い方法を知っている人はいますか?

編集 明確にするために、テキストボックスにはすでにテキストが入力されています。ユーザーは、既にそこにあるテキストに括弧を追加および削除できるはずです。

編集2

ユーザーが括弧のみを入力できるように機能しました。これは貼り付けを考慮しておらず、削除も考慮していません。まだやり方がわかりません……。

        '#myTextArea keydown': function (el, ev) {
            if ((ev.keyCode != 48 && ev.keyCode != 57) || ev.shiftKey == false){
                return false;
            }
        }
4

1 に答える 1

1

考えられる解決策の 1 つは、keyup イベントでプログラムによって実行することです。挿入時 (キーを押すか貼り付ける) の場合のみを示します。

文字キーが押された場合でも、Ctrl-V が押された場合でも、一般に、文字列に部分文字列が挿入されます。キャレット位置は、その部分文字列の最後になります。

私のアルゴリズムは、その部分文字列を 2 つの位置の間の文字列として見つけます。

  • 最長の共通接頭辞の終わり (異なる最初の文字は、挿入された部分文字列の始まりです)
  • キャレット位置

次に、関数 filterString を使用して文字列をフィルタリングし、括弧以外のすべての記号を "" に置き換えます。

最後に、入力値を最長の共通プレフィックス + フィルタリングされた文字列 + キャレットの後のテキストに更新します

キャレット操作には、この jquery プラグインが必要です: http://jcaret.googlecode.com/

<input id="myTextArea" value="a*(b*(c+d))">
</input>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="http://jcaret.googlecode.com/files/jquery.caret.1.02.min.js"></script>

<script type="text/javascript">
var old_value = $('#myTextArea').val();

function filterString(a) {
    return a.replace(/[^\(\)]/g,"");
}

$('#myTextArea').keyup(function(){
    var end_of_insertion = $(this).caret().start;
    var new_value = $(this).val();

    var i=0;

    while(i<old_value.length && i<new_value.length && old_value[i]==new_value[i]) {
        i++;
    }
    if(i>=end_of_insertion)return;

    // i now points to first different character in strings old_value and new_value

    new_value = new_value.substr(0,i)
        + filterString(new_value.substr(i,end_of_insertion-i))
        + new_value.substr(end_of_insertion);

    $('#myTextArea').val(new_value).caret({start: end_of_insertion, end: end_of_insertion});
    old_value = new_value;
});
</script>
于 2012-12-14T23:36:23.837 に答える