Knockout.jsで入力テキストの文字数を表示させるような場合、value bindingのvalueUpdateで入力イベントに連動して表示を更新します。
公式のサンプル通りにafterkeydownを利用して文字数表示を行うと、Firefoxなどでは日本語入力中にkeydownイベントが発生しないため正しく更新することができません。
解決策として、監視するイベントにinputイベントを指定します。
<input data-bind="value: comment, valueUpdate: 'afterinput'">
<span data-bind="text: letterCount"></span>
<script>
function viewModel() {
var self = this;
self.comment = ko.observable("");
self.letterCount = ko.computed(function() {
return self.comment().length;
});
};
ko.applyBindings(new viewModel());
</script>
inputイベントはinput/textareaの入力内容が変化したタイミングで発生するイベントで、日本語入力中で未確定な状態やコピー&ペーストで編集した場合でも検出することができます。
主要なブラウザではサポート済み(IE8でも動作確認)ですが、未対応のブラウザまで考慮する必要がある場合には、keydownとinputをどちらも指定することで、少なくともkeydownイベントでは処理を実行させることができるでしょう(input対応時には2回ずつ実行されてしまいますが…)。
inputイベントをブラウザが処理した後に反映されるよう、prefixにはafterを付加します。
####参考