複数のユーザー間でテキストフィールドの同期が必要な学校のプロジェクトに 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」を認識していないことを示唆しているようです。誰でも助けることができますか?