MVVM架构~knockoutjs系列之为validation.js扩展minLength和maxLength
为什么要对minLength和maxLength这两个方法进行扩展呢,是因为这样一个需求,在用户注册时,可以由用户自己决定他们输入的字符,中文,英文,数字均可,这样做了之后,使用户的体验更好,但对于程序来说就有些麻烦了,因为
我们的Length方法只针对英文字符和数字而言的
原因1:事实上,真实的数据存储里,中文和全角他们占用的是两个字符的空间,所以,我们在验证中文时,应该考虑到这点.
原因2:不说计算机基础知识,但说现实世界里,如果你的用户名由4~10位组成,那么,如果你用Length方法,那基本上对中文的名称被90%的拒绝了,因为只有小部分中国文会起四个字的名字,呵呵.
说干就干:
从网站上搜索了一下,找到了一个不错的JS方法,用来验证中文和英文字母的长度,原代码
/**
* 字符串长度-中文和全角符号为2,英文、数字和半角为1
* @param str
* @return {Number}
*/
var getLength = function (str) {
return Math.ceil(str.replace(/^\s+|\s+$/ig, '').replace(/[^\x00-\xff]/ig, 'xx').length);
};
/**
* 按字数截取字符串
* @param str
* @param len
* @return {*}
*/
var subStr = function (str, len) {
if (!str) {
return '';
}
len = len > 0 ? len * 2 : 280;
var count = 0, //计数:中文2字节,英文1字节
temp = ''; //临时字符串
for (var i = 0; i < str.length; i++) {
if (str.charCodeAt(i) > 255) {
count += 2;
}
else {
count++;
}
//如果增加计数后长度大于限定长度,就直接返回临时字符串
if (count > len) {
return temp;
}
//将当前内容加到临时字符串
temp += str.charAt(i);
}
return str;
};
var checkStrLength = function (str, minL, maxL) {
var len = getLength($.trim(str));
var data = {
'checkL': (len >= minL && len <= maxL),
'restL': maxL - len,
'restStr': subStr(str, maxL)
};
return data;
};
我们将它与ko.validation架构进行结合,但它在ko中去呈现
/*扩展的字符长度验证,支持中文占两个字符的空间*/
kv.rules['extMinLength'] = {
validator: function (val, minLength) {
if (!kv.utils.isEmptyVal(val)) {
console.log(getLength(val));
console.log(minLength);
}
return kv.utils.isEmptyVal(val) || getLength(val) >= minLength;
},
message: 'Please enter at least {0} characters.(extension validator for zzl)'
}; kv.rules['extMaxLength'] = {
validator: function (val, maxLength) {
return kv.utils.isEmptyVal(val) || getLength(val) <= maxLength;
},
message: 'Please enter no more than {0} characters.(extension validator for zzl)'
};
下面我们看一下如何去调用它
self.extName = ko.observable().extend({
extMinLength: 4,
extMaxLength: { params: 20, message: "名字太长了" },
});
看一下运行的结果

MVVM架构~knockoutjs系列之为validation.js扩展minLength和maxLength的更多相关文章
- MVVM架构~knockoutjs系列之表单添加(验证)与列表操作源码开放
返回目录 本文章应该是knockoutjs系列的最后一篇了,前几篇中主要讲一些基础知识,这一讲主要是一个实际的例子,对于一个对象的添加与编辑功能的实现,并将项目源代码公开了,共大家一起学习! knoc ...
- MVVM架构~knockoutjs系列之从Knockout.Validation.js源码中学习它的用法
返回目录 说在前 有时,我们在使用一个插件时,在网上即找不到它的相关API,这时,我们会很抓狂的,与其抓狂,还不如踏下心来,分析一下它的源码,事实上,对于JS这种开发语言来说,它开发的插件的使用方法都 ...
- MVVM架构~Knockoutjs系列之验证机制的引入
返回目录 对于Knockoutjs本身来说,没有提供验证模块,不过,有第三方的扩展,就像你为jquery库作extensions一样,这讲中我将介绍一个Knockout插件扩展,knockout.va ...
- MVVM架构~knockoutjs系列之验证信息自定义输出~再续
返回目录 对于一个项目的表单验证,方式有很多,效果也有很多,具体使用哪种完成取决于产品这边,产品让你用什么,你就要用什么,而做为开发人员,我们要做的就是"整理近可能多的架构方式",这样才可以自由的应变 ...
- MVVM架构~knockoutjs系列之验证成功提示显示
返回目录 对于knockout.validation来说,我们已经知道了如何去验证大部分表单元素,而有时,我们的需求希望在每个元素验证成功后,去显示正确的提示,这个我们很容易的使用self.元素.is ...
- MVVM架构~knockoutjs系列之验证信息自定义输出~续
返回目录 上一讲中,我以一个实际中的例子说明了knockoutjs的自定义验证功能,在使用过程中,出现了一个问题,当然了不是问题,只是一种需求,上一讲中自定义验证的表现是:当页面加载后,自动显示有问题 ...
- MVVM架构~knockoutjs系列之扩展ajax验证~验证数据是否存在
返回目录 在大部分网站里,用户名都是唯一的,即当用户注册时,如果用户输入的名字不合法,我们需要提示用户,让用户再起个新名字,而这种复杂的验证一般是通过JS来实现的,如果把它集成到ko里,那就完美了.有 ...
- MVVM架构~knockoutjs系列之扩展ajax验证~验证输入数据是否与后台数据相等
返回目录 在看这篇文章之前,你有必要先看我之前的文章,之前文章是将一个方法以参数的形式传给KO,然后返回一个真假值,去做验证,这类似于面向对象语言里的委托,在JS里我们叫它回调方法,本篇文章与前一文章 ...
- MVVM架构~Knockoutjs系列之js接收C#数据集合的方式
返回目录 在controller里将数据拿到,并且存储到ViewBag对象里,最后在View上显示出来,这是传统的MVC开发方式,事实上引入Knockoutjs以后,这种方式还是适合的,Knockou ...
随机推荐
- 2.Nginx优化
[教程主题]:Nginx优化 [课程录制]: 创E [主要内容] Nginx 优化 nginx介绍 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为"engine ...
- SSE and Websocket
http://www.w3school.com.cn/html5/html_5_serversentevents.asp http://javascript.ruanyifeng.com/htmlap ...
- linux指令记录
sudo mount /dev/sda3 data 挂载硬盘到当前目录下的data文件夹
- Win7 64位 VS2015环境使用qt-msvc2015-5.6.0
QT下载 http://www.qt.io/download-open-source/#section-2 我用的是 qt-opensource-windows-x86-msvc2015-5.6.0. ...
- Microsoft.Office.Interop.Excel 程序集引用 ,Microsoft.Office.Interop.Excel.ApplicationClass 无法嵌入互操作类型
using Microsoft.Office.Interop.Excel 添加程序集引用 方法:在引用--程序集--扩展中,添加引用Microsoft.Office.Interop.Excel,此 ...
- linux系统启动时更改MAC地址
vim /etc/rc.local #change the server's MAC address("00:50:56:84:5C:76" change to 00:50:56: ...
- iOS 报错 :Duplicate interface definition for class’*'
这个是重复导入引起的,但是一般的重复导入会在C里的include.而在项目中我们移动项目的位置,比如从某一文件夹移到另一文件夹,路径改变的话会导致项目的中预编译文件PrefixHeader.pch的路 ...
- 带有两个输入字段和相关标记的简单 HTML 表单:
带有两个输入字段和相关标记的简单 HTML 表单: 意思就是说Male 和id="male"绑定在一起. <html> <body> <p> ...
- 『TCP/IP详解——卷一:协议』读书笔记——18
2013-08-27 15:44:52 第7章 Ping程序 7.1 引言 “ping”这个名字来源于声纳定为操作.Ping程序由Mike Muuss编写,目的是为了测试另一台主机是否可达.该程序发送 ...
- MATLAB不运行也不报错
今天本来挺激动找到能运行的好几个程序 MATLAB忙到busy也是停不下来 本来不以为然 结果呢 吃了个水果 一杯水都喝下去了 还没结果(⊙o⊙) 这时候解决办法只有一个 Ctrl+c