Knockout Numeric Binding

This limits input to numbers only, not sure how knockout knows to give vm property back as number :-(

by Ben Clayton

HTML

<script src="http://knockoutjs.com/downloads/knockout-3.0.0.js"></script>
<span data-bind="text: Interval" ></span>
<input data-bind="numeric, value: Interval" />

JavaScript

ko.bindingHandlers.numeric = {
    init: function (element) {
        $(element).on("keydown", function (event) {
            // Allow: backspace, delete, tab, escape, and enter
            //debugger;
            console.log("keyCode: "+event.keyCode,"event.ctrlKey: ",event.ctrlKey,"event.metaKey: ",event.metaKey,"event.shiftKey: ",event.shiftKey);
            
            if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
                // Allow: Cmd+C  (mac only?)
                (event.keyCode == 67 && event.metaKey === true) ||
                 // Allow: Cmd+V  (mac only?)
                (event.keyCode == 86 && event.metaKey === true) ||
                 // Allow: Ctrl+A
                (event.keyCode == 65 && event.ctrlKey === true) ||
                // Allow: . ,
                (event.keyCode == 188 || event.keyCode == 190 || event.keyCode == 110) ||
                // Allow: home, end, left, right
                (event.keyCode >= 35 && event.keyCode <= 39)) {
                // let it happen, don't do anything
                return;
            }
            else {
                // Ensure that it is a number and stop the keypress
                if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
                    event.preventDefault();
                }
            }
        });
    }    
};

ko.applyBindings({Interval: ko.observable()});