我正在编写一个自定义格式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);
}
};
以下代码按预期工作。这种方法的一个流程是使用删除电话号码backspace
。一旦它删除最后四位数字并点击-
它就不能删除-
也不,( )
因为我是根据长度动态添加-
和。( )
我可以使用箭头键或在这些符号之前单击并开始删除,或者我可以突出显示文本框并一次删除所有内容。但我需要能够通过退格删除符号或动态模拟并从代码中删除它。
关于如何解决此问题的任何建议?
更新
这是JSFIDDLE。我对这个小提琴的唯一问题是它不会更新值变化的值。仅当您按输入或离开文本框时才会更新。不知道如果我错过了其他任何东西......
我已更新我的逻辑以解决我遇到的问题,该问题已修复。但我注意到这两种逻辑还有一个问题。
如果我有电话号码
(123) 456-7890
如果我从区号中删除 1,则光标不会停留在同一位置(在 2 之前)。它移动到字符串的末尾,所有内容都向下移动一个数字。
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;
}