1

複数のユーザー間でテキストフィールドの同期が必要な学校のプロジェクトに Opa を使用しています。これを解決する簡単な方法は、ユーザーの 1 人が変更を行うたびに完全なフィールドを送信することです。もちろん、より良い方法は、変更のみを送信することです。

私の考えは、テキストフィールドでキャレット位置を使用することでした。ユーザーが入力すると、キャレットの位置に基づいて最後に入力された文字 (単にキャレットの前の文字) を取得できます。DOM 要素には、selectionStart という名前の使いやすいフィールドがあります。私はこれのためにこの小さなJavascriptを持っています:

document.getElementById('content').selectionStart

キャレットがフィールドの 5 番目の文字にある場合、正しく 5 を返します。Opa では、DOM でも dom_element でも selectionStart を使用できないため、小さなプラグインを作成しようと考えました。結果は次のとおりです。

##extern-type dom_element

##register jsGetCaretPosition: dom_element -> int
##args(node)
{
    return node.selectionStart;
}

これは問題なく opp-builder でコンパイルされ、この小さなコード行を Opa スクリプトに入れると、次のようになります。

#pos = %%caret.jsGetCaretPosition%%(Dom.of_selection(Dom.select_id("content")));

これも問題なくコンパイルされます。ただし、スクリプトを実行すると、常に「未定義」が返され、何が間違っているのかわかりません。API をDom.of_selection(Dom.select_id("content"))調べたところ、対応する dom_element 型付きデータを取得してプラグインに渡す正しい方法のように見えました。プラグインが「未定義」を返すという事実は、選択された要素がメンバー「selectionStart」を認識していないことを示唆しているようです。誰でも助けることができますか?

4

1 に答える 1

1

Opa dom_element には、jQuery 選択の結果 (つまり、dom ノードの配列) があります。したがって、私があなたのプログラムをよく理解していれば、node[0].selectionStart代わりに のようなものを書くべきですnode.selectionStart

さらに、空の選択と textarea ノードを含まない選択 (selectionStart プロパティなし) に注意する必要があります。おそらく正しいコードはtmp == undefined ? -1 : tmp = node[0].selectionStart == undefined ? -1 : tmp

于 2013-01-04T10:04:08.970 に答える