これは私がこれまでに思いついた最高のものです。よりコンパクトな、またはより好ましい代替案を誰かが知っているかどうかを聞いてうれしいです。
編集:イベント登録の新しいパターンに更新されたコード スニペット。
import 'dart:html';
void main() {
query("#inputbox")
..onChange.listen(handler)
..onKeyDown.listen(handler)
..onKeyUp.listen(handler)
..onCut.listen(handler)
..onPaste.listen(handler);
}
void handler(Event event) {
print((query("#inputbox") as TextAreaElement).value);
}
正確な動作は、ブラウザとオペレーティング システムによって異なります。
スキップすることもできますがkeyDown
、keyDownとkeyUpの動作は OS の影響を受け、対称であることが保証されていないことに注意してください。少なくとも次のkeyUpまたはchangeイベントが発生するまで、変更を見逃す可能性があります。実際、Windows 7 で孤立した WM_KEYDOWN メッセージを Dartium と IE9 に送信する小さなアプリを作成して、これを証明しました。
keyPress
keyUpとkeyDownの代わりに使用できますが、バックスペースや削除などの特定のキーのイベントは生成されません。
cut
マウスで実行されたカットまたはペーストに即座にpaste
反応します。それらを使用しない場合、change
イベントは変更をキャプチャしますが、フィールドがフォーカスを失うまで、または場合によっては後で.
このinput
イベントは上記のすべてのリスナーを置き換えることができ、Dartium ではうまく機能するようですが、IE9 では文字の追加のみをキャプチャし、削除はキャプチャしません。
カーソルキー、ホーム、終了、シフトなどの追加の望ましくないイベントを生成する可能性があることに注意keyUp
してください (IE9 など)。keyDown
ユーザーがこれらのアクションにショートカット キーを使用すると、カット/ペースト リスナーに加えて起動します。
質問は Dart に固有のものですが、上記の議論の多くは DOM をリッスンするすべてのコードに当てはまります。keyCode の値でさえ、ブラウザー間で標準化されていません(詳細)。
また、 KeyboardEventControllerクラスをチェックアウトすることも価値があるかもしれませんが、私がテストしたところ、概して、エッジ ケースの動作は上記のものと似ていました。それは設計による場合とそうでない場合があります。Dart の開発者は、ブラウザー間の不一致からユーザーを隔離するためにいくらかの努力をしていますが、それはまだ進行中の作業です。
また、 textareaについて話している間は、 textプロパティではなく、value
そのプロパティを使用することを忘れないでください。最後に、キーボード アクティビティの「バースト」に対する反応を抑制するようにしてください (たとえば、ハンドラーの内臓を一時的に延期し、その間に発生する追加のイベントをロールアップするある種のタイマーなど)。handler
関連する質問とリンク: