Gibt es eine Bindung, um einen Eingabewert von 123456789
zu 123,456,789
zu formatieren. Die Bindung sollte bei jedem Tastendruck funktionieren und den Wert validieren, wenn es sich um eine gültige Zahl handelt. Ich habe dieses solution gefunden, aber es formatiert nicht auf Tastendruck.KnockoutJs Bindung für Eingabe-Tag zur Formatnummer mit Komma
-1
A
Antwort
0
Ich endete beim Erstellen benutzerdefinierte Bindung. Es funktioniert nur auf IE10 und höher für die Verwendung von event input
. Hier ist der Code. Siehe Geige here.
String.prototype.countOccurence = function(char){
return (this).split(char).length - 1;
}
$.fn.selectRange = function(start, end){
if(end === undefined)
end = start;
return this.each(function() {
if("selectionStart" in this){
this.selectionStart = start;
this.selectionEnd = end;
} else if(this.setSelectionRange)
this.setSelectionRange(start, end);
else if(this.createTextRange){
var range = this.createTextRange();
range.collapse(true);
range.moveEnd("character", end);
range.moveStart("character", start);
range.select();
}
});
};
ko.helper = {};
ko.helper['toNumber'] = function (value, limit){
limit = limit || 10;
var num = Number((value || "").toString().replace(/[^0-9]/gi, "").substring(0, limit));
return num;
}
ko.bindingHandlers['formatNumber'] = {
init: function(element, valueAccessor, allBindings){
var value = valueAccessor();
var limit = allBindings.get("limit") || 10; //billion
var position = 0;
var navigationKeys = [33, 34, 35, 36, 37, 38, 39, 40, 9];
var isBackSpace = false;
var oldLengthValue = (value() || "").toString().length;
function isKeyControls(e){
if(e.ctrlKey && (e.keyCode == 67 || e.keyCode == 86 || e.keyCode == 65)){
return true;
}
if(e.shiftKey && (e.keyCode == 37 || e.keyCode == 39)){
return true;
}
return false;
}
$(element).on("keyup", function(e) {
if(this.selectionStart == this.value.length)
return;
if(isKeyControls(e) || e.shiftKey){
return;
}
var navigation = (e.keyCode == 37
? -1
: e.keyCode == 39
? 1
: 0);
var customSelectionStart = this.selectionStart; // + navigation;
//customSelectionStart = customSelectionStart
var positionMinusOne = customSelectionStart == 0
? -1
: customSelectionStart;
positionMinusOne = positionMinusOne + (positionMinusOne == -1 ? 0 : navigation);
var previousCharacter = positionMinusOne == -1
? ""
: this.value.substring(customSelectionStart - 1, customSelectionStart);
if(previousCharacter == ","){
$(this).selectRange(customSelectionStart +
(isBackSpace ? -1 : 0));
}
var currentCommaOccurence = this.value.countOccurence(",");
var commaValue = oldLengthValue > currentCommaOccurence ? -1
: oldLengthValue < currentCommaOccurence ? 1
: 0;
if(commaValue != 0){
$(this).selectRange(customSelectionStart +
commaValue);
}
oldLengthValue = this.value.countOccurence(",");
});
$(element).on("keydown", function (e) {
if (isKeyControls(e)) {
return;
}
var navigation = (e.keyCode == 37
? -1
: e.keyCode == 39
? 1
: 0);
var customSelectionStart = this.selectionStart + navigation;
//customSelectionStart = customSelectionStart
var positionMinusOne = customSelectionStart == 0
? -1
: customSelectionStart;
positionMinusOne = positionMinusOne + (positionMinusOne == -1 ? 0 : navigation);
var previousCharacter = positionMinusOne == -1
? ""
: this.value.substring(customSelectionStart - 1, customSelectionStart);
if(previousCharacter == ",")
$(this).selectRange(customSelectionStart);
isBackSpace = e.keyCode == 8;
if(isBackSpace)
return;
//Navigation
if(navigationKeys.some(function(key) {
return key == e.keyCode;
}))
return;
//Other Keys
var isNumber = (e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105);
var isLimit = (limit + parseInt(limit/3)) == this.value.length;
if(!(isNumber)
|| isLimit){
e.preventDefault();
return;
}
});
$(element).on("input", function(e, a, b, c) {
console.log(this.selectionStart, this.selectionEnd);
var convertedValue = ko.helper.toNumber(this.value, limit);
var formatted = convertedValue
? ko.helper.toNumber(this.value, limit).toLocaleString()
: "";
position = this.selectionStart == this.value.length
? formatted.length
: this.selectionStart;
value(convertedValue || "");
this.value = formatted;
$(this).selectRange(position);
});
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
$(element).off();
});
ko.bindingHandlers["formatNumber"].update(element, valueAccessor, allBindings);
},
update: function(element, valueAccessor, allBindings){
var value = valueAccessor();
var limit = allBindings.get("limit") || 10; //billion
var convertedValue = ko.helper.toNumber(value(), limit);
var formatted = convertedValue
? ko.helper.toNumber(value(), limit).toLocaleString()
: "";
element.value = formatted;
}
};
Verwandte Themen
- 1. KnockoutJS Dynamische CheckBox Bindung
- 2. knockoutjs Klick-Bindung innerhalb foreach Bindung
- 3. Bootstrap Datepicker Bindung in Knockoutjs
- 4. Swipe-Aktion Bindung in knockoutjs
- 5. KnockoutJS Brauch typeahead.js Bindung allBindingsAccessor Funktion
- 6. knockoutjs afterRender Funktion in foreach Bindung
- 7. KnockoutJS benutzerdefinierte Bindung feuern mehrere Male
- 8. Eine knockoutJS benutzerdefinierte Bindung für einfaches jQuery-Plugin erstellen
- 9. Kommentar foreach vs foreach Bindung in knockoutjs
- 10. knockoutjs Auswahländerungsereignis wird ausgelöst, wenn die Bindung
- 11. KnockoutJS viewModel Bindung auf mehreren Seiten
- 12. Parameter mit KnockoutJS
- 13. Binden Sie unauffällige Validierung mit benutzerdefinierten KnockoutJS Bindung
- 14. AngularJS: Formatnummer nach locale
- 15. Oracle to_char Formatnummer mit Füllmodus (FM0000)
- 16. Binding Datum mit Knockoutjs
- 17. Knockoutjs beobachtbaren Array von Objekten Bindung Selektor namentlich
- 18. Bindung Tastendruck Ereignis auf Knockoutjs, beobachtbar nicht bevölkert
- 19. Verwenden des Prototyps für KnockoutJS berechnete Eigenschaften
- 20. KnockoutJS: Kann nicht verarbeiten Bindung "wenn: function() {Gespräche zurückzukehren}"
- 21. Winkelmesser mit KnockoutJS
- 22. Suchfilter mit KnockoutJS
- 23. valueUpdate: 'afterkeydown' für input type = "numerisch" in Knockoutjs 2.0
- 24. KnockoutJS Speicherleck
- 25. twitter Bootstrap Autocomplete Dropdown/Combobox mit Knockoutjs
- 26. Google Maps und knockoutjs
- 27. Asp classic Formatnummer zeigt keine abschließenden Nullen
- 28. convert Komma getrennte Zeichenfolge mit zur Liste Linq
- 29. Deaktivieren Sie das Optionsfeld mit KnockoutJS
- 30. Formatnummer, nachdem es zählen zuerst in mysql