我知道有人提出了这方面的变化,但我的要求是,不需要格式化/舍入输入的值,我甚至不允许用户在小数点后输入多个数字.我有一些适用于decimalFormatter绑定处理程序的东西,但它很笨重 – 也就是说,它允许你输入像’20’这样的值.并且由于我编写正则表达式的方式,您无法擦除所有值.我意识到我可以修改它以接受整个条目的可选数字,但我真正想要的是,如果用户删除该值,它将恢复为0.0.并且,允许他们进入’20’.然后选项卡(onblur)并将其重新格式化为20.0,使其看起来更完整.目前,如果用户输入’20’.然后保存表单,它确实存储整数值20,当你重新打开/检索数据库中的值时,它显示20.0,所以它在重新加载时看起来很好.

我想过添加一个onblur事件,但是我们不想在覆盖被淘汰的数据绑定时做到这一点.我们希望保持ko视图模型的所有约束,因此这不是一个选项.我也看到一些建议计算的observable(例如这个SO post)但我的绑定已经做到了.在第二个想法,淘汰赛event binding将成为这里的方式???

HTML:

<input style="width:38px" data-bind="decimalFormatter: percentage"/>

JavaScript的:

ko.bindingHandlers.decimalFormatter = {
    init: function (element,valueAccessor) {
    var initialValue;

    //$(element).on('keydown',function (event) {
    $(element).keydown(function (event) {
        initialValue = $(element).val();

        // Allow: backspace,delete,tab,escape,and enter
        if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
        // Allow: Ctrl combinations
        (event.ctrlKey === true) ||
        // Allow decimal/period
        (event.keyCode === 110) || (event.keyCode === 190) ||
        // 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();
            }
        }
    });

    $(element).keyup(function (event) {
        if (!$(element).val().match(/^\d+\.?\d?$/)) {
            event.preventDefault();
            $(element).val(initialValue);
        }
        else
            return;
    });        

    var observable = valueAccessor();

    var interceptor = ko.computed({
        read: function () { return formatWithComma(observable(),1); },write: function (newValue) {
            observable(reverseFormat(newValue,1));
        }
    });

    if (element.tagName == 'INPUT')
        ko.applyBindingsToNode(element,{ value: interceptor });
    else
        ko.applyBindingsToNode(element,{ text: interceptor });
    },update: function (element,valueAccessor) {
    }
}

// Formatting Functions
function formatWithComma(x,precision,seperator) {
    var options = {
        precision: precision || 2,seperator: seperator || '.'
    }
    var formatted = parseFloat(x,10).toFixed(options.precision);
    var regex = new RegExp('^(\\d+)[^\\d](\\d{' + options.precision + '})$');
    formatted = formatted.replace(regex,'$1' + options.seperator + '$2');
    return formatted;
}

function reverseFormat(x,seperator: seperator || '.'
    }

    var regex = new RegExp('^(\\d+)[^\\d](\\d+)$');
    var formatted = x.replace(regex,'$1.$2');
    return parseFloat(formatted);
}

var viewmodel = function () {
    var self = this;
    self.percentage = ko.observable(20.0);
};

var vm = new viewmodel();
ko.applyBindings(vm);

JSFiddle

解决方法

好吧,我使用AUTONUMERIC插件进行数字格式化,这是可靠和令人敬畏的.

我只是根据你的要求做了一个小样,检查它here

查看型号:

var vm = function(){   
this.Amount=ko.observable(""); 
this.Onloadamount=ko.observable(143); //onLoad Test
ko.bindingHandlers.autoNumeric = {
       init: function (el,valueAccessor,bindingsAccessor,viewmodel) {
            var $el = $(el),bindings = bindingsAccessor(),settings = bindings.settings,value = valueAccessor();

            $el.autoNumeric(settings);
            $el.autoNumeric('set',parseFloat(ko.utils.unwrapObservable(value()),10));
            $el.change(function () {
                value(parseFloat($el.autoNumeric('get'),10));
            });
        },update: function (el,newValue = ko.utils.unwrapObservable(valueAccessor()),elementValue = $el.autoNumeric('get'),valueHasChanged = (newValue != elementValue);

            if ((newValue === 0) && (elementValue !== 0) && (elementValue !== "0")) {
                valueHasChanged = true;
            }

            if (valueHasChanged) {
                $el.autoNumeric('set',newValue);
            }
        }
    };
}

  ko.applyBindings(new vm());

查看:

<input type="text"  data-bind="autoNumeric:$data.Amount,settings:{mDec:1,aSep: ''} " />

这里mDec:1将数字限制为1和asep的十进制数:”表示它不会用逗号等来编号

PS:我们可以限制输入无效字符并轻松完成许多其他操作.

完整参考检查here

jquery – KnockoutJS拦截到一个小数位的更多相关文章

  1. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. 详解使用postMessage解决iframe跨域通信问题

    这篇文章主要介绍了详解使用postMessage解决iframe跨域通信问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码

    这篇文章主要介绍了HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  5. 浅谈html5之sse服务器发送事件EventSource介绍

    本篇文章主要介绍了浅谈html5之sse服务器发送事件EventSource介绍,具有一定的参考价值,有兴趣的可以了解一下

  6. 使用layui实现左侧菜单栏及动态操作tab项的方法

    这篇文章主要介绍了使用layui实现左侧菜单栏及动态操作tab项的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  7. HTML5 拖放(Drag 和 Drop)详解与实例代码

    本篇文章主要介绍了HTML5 拖放(Drag 和 Drop)详解与实例代码,具有一定的参考价值,有兴趣的可以了解一下

  8. ios – Swift中的非响应流委托

    所以我在Swift中使用套接字并试图将应用程序与我的服务器连接起来.我让应用程序连接到服务器的IP地址,并在服务器上使用netcat进行测试.在执行期间,应用程序的控制台输出显示它已成功连接到服务器.但是,流委托似乎没有响应.当我输入netcat时,app控制台没有打印任何内容.我已经搜索了很长一段时间,发现我的实现与其他实现非常相似.也许我在这里遗漏了一些我看不到的东西.任何想到这个问题的人都将不胜感激!

  9. ios – UIScrollView内容不允许用户交互

    我有一个启用了分页的UIScrollView,如下所示:在UIScrollView中,我添加了几个UIWebViews,并将其启用的交互设置为是这样的.它打破了UIScrollView上的分页和所有触摸.如果我将用户交互设置为NO,则页面有效,但我无法在UIWebView中突出显示文本.我试着像下面那样对UIScrollView进行子类化,但是会出现同样的情况.任何的想法?

  10. ios – 如何知道用户在iPhone中的播放控件上单击快进和快退按钮

    还是有其他方法吗?

随机推荐

  1. jquery-plugins – 是否可以使用猫头鹰旋转木马实现循环/无限轮播?

    我正在使用猫头鹰旋转木马,它的工作完美,除了它不支持循环/无限滚动.我没有搜索google和stackoverflow的想法,没有运气.有没有人在猫头鹰旋转木马上实现圆形/无限滚动?

  2. jQuery动态输入字段焦点

    我想使用以下jQuery向我的页面动态添加一个输入字段:在这样做之后,我希望输入字段具有闪烁的文本光标的焦点,所以我想在创建后立即输入.有人可以告诉我我该怎么办?

  3. jquery – 为什么$(window).height()这样错了?

    我试图获取当前浏览器的视口高度,使用但我得到的价值观太低了.当视口高度高达850px时,我从height()获取大约350或400像素的值.这是怎么回事?

  4. jquery – 如果在此div之外和其他draggables内部(使用无效和有效的还原选项),则可拖动恢复

    例如这样但是由于明显的原因,这不行.我可以说这个吗?

  5. 创建一个jQueryUI 1.8按钮菜单

    现在jQueryUI1.8已经出来了,我正在浏览更新,并且遇到了新的Buttonwidget,特别是SplitButtonwithadropdown的演示之一.这个演示似乎表明Buttonwidget可以在这里创建一个下拉菜单.作为讨论的问题,我想知道使用这个新的Button小部件来创建一个下拉菜单有什么方法.干杯.解决方法您必须在按钮下方列出一个列表,方式类似于此处为自动完成提供的演示:http

  6. 灰色divs使用JQuery

    我试图使用这个代码:为了淡出一大堆名为MySelectorDiv的div,唯一的是,它只会淡出第一个而不是所有的div,为什么呢?

  7. 使用jQuery动态插入到列表中

    我有两个订单列表在彼此旁边.当我从一个列表中选出一个节点时,我想按照字母顺序插入到另一个列表中.抓住的是我想要把一个元素放在另一个列表中,而不刷新整个列表.奇怪的是,当我插入到右边的列表中,它工作正常,但是当我插入到左边的列表中时,顺序永远不会出来.我也尝试将所有内容读入数组,并将其排序在一起,以防止children()方法没有按照显示顺序返回任何东西,但是我仍然得到相同的结果.这是我的jQuer

  8. 没有回应MediaWiki API使用jQuery

    我试图从维基百科获取一些内容作为JSON:但我没有回应.如果我粘贴到浏览器的地址栏,就像我得到预期的内容.怎么了?解决方法您需要通过添加&callback=?来触发具有$.getJSON()的JSONP行为?在querystring上,像这样:Youcantestithere.没有使用JSONP,你正在击中same-originpolicy,阻止XmlHttpRequest获取任何数据.

  9. jQuery Ajax请求每30秒

    我有这段代码,但是有些人在我的网站上的值可能会改变.我需要每30秒钟更新一次#financediv.这可以做吗解决方法您可以将代码放在单独的函数中,如下所示:然后每30秒建立一个定时器调用该函数:祝你好运!总结以上是DEVMAX为你收集整理的jQueryAjax请求每30秒全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  10. jquery – keypress事件在IE和Chrome中不工作,但在FF工作

    任何想法为什么会这样发生?我通常认为Chrome会更加宽容代码?这是我的按键键.我错过了什么吗?右图();和leftimage();是应该工作的功能,因为我在其他地方使用这些功能谢谢您的帮助!

返回
顶部