私は、(米国の) 電話番号を入力時に次の形式でフォーマットするカスタムbindingHandler
を書いています。knockout
(xxx) xxx - xxxx
HTML コード...
<input type="text" data-bind="phoneNumber: phone" />
そしてバインディングハンドラー...
ko.bindingHandlers.phoneNumber = {
init: function(element, valueAccessor, allBindings) {
ko.bindingHandlers.value.init(element,valueAccessor, allBindings);
},
update: function(element, valueAccessor) {
var phone = ko.utils.unwrapObservable(valueAccessor());
if (!phone) return;
var output;
input = phone;
input = input.replace(/[^0-9]/g, '');
var areaCode = input.substr(0, 3);
var nextThreeDigits = input.substr(3, 3);
var lastFourDigits = input.substr(6, 4);
if (areaCode.length < 3) {
output = "(" + areaCode;
} else if (areaCode.length == 3 && nextThreeDigits.length < 3) {
output = "(" + areaCode + ")" + " " + nextThreeDigits;
} else if (areaCode.length == 3 && nextThreeDigits.length == 3) {
output = "(" + areaCode + ")" + " " + nextThreeDigits + "-" + lastFourDigits;
}
var phoneObs = valueAccessor();
phoneObs(output);
}
};
次のコードは期待どおりに機能します。このアプローチの 1 つのフローは、を使用して電話番号を削除することbackspace
です。最後の 4 桁を削除してヒットすると、長さに基づいてandを動的に追加しているため、 norを-
削除できません。矢印キーを使用するか、それらの記号の前をクリックして削除を開始するか、テキスト ボックスを強調表示して一度にすべて削除することができます。しかし、バックスペースまたはシミュレートによってシンボルを削除し、コードから動的に削除できる必要があります。-
( )
-
( )
この問題を解決する方法について何か提案はありますか?
アップデート
これがJSFIDDLEです。このフィドルで私が抱えている唯一の問題は、値の変更時に値が更新されないことです。Enterキーを押すか、テキストボックスを離れた場合にのみ更新されます。他に何か欠けているかどうかはわかりません...
発生している問題を説明するためにロジックを更新しましたが、修正されました。しかし、どちらのロジックにももう 1 つ問題があることに気付きました。
電話番号があれば
(123) 456-7890
市外局番から 1 を削除すると、カーソルは同じ場所 (2 の前) にとどまりません。文字列の最後に移動し、すべてが 1 桁下にシフトします。
if (areaCode.length <= 3 && nextThreeDigits == "") {
output = "(" + areaCode;
} else if (areaCode.length == 3 && nextThreeDigits < 3) {
output = "(" + areaCode + ")" + " " + nextThreeDigits;
} else if (areaCode.length == 3 && nextThreeDigits.length <= 3 && lastFourDigits.length == "") {
output = "(" + areaCode + ")" + " " + nextThreeDigits;
} else if (areaCode.length == 3 && nextThreeDigits.length == 3 && lastFourDigits.length <= 4) {
output = "(" + areaCode + ")" + " " + nextThreeDigits + "-" + lastFourDigits;
}