MVVM架构~knockoutjs系列之验证信息自定义输出~再续
对于一个项目的表单验证,方式有很多,效果也有很多,具体使用哪种完成取决于产品这边,产品让你用什么,你就要用什么,而做为开发人员,我们要做的就是"整理近可能多的架构方式",这样才可以自由的应变.
对于表单验证,我今天看了新浪的邮箱注册,觉得效果还可以,所以,就写了一个,它利用了knockoutjs里的hasfocus属性,对文本框进行焦点捕捉来实现的.
新浪截图
说明:表单元素为焦点时,自动提示要输入的信息,当元素失去焦点时,提示用户输出的正确性,这个功能使用了hasfocus属性,下面看一下代码
HTML代码
<div class="editor-label"> 账号: </div> <div class="editor-field"> <input data-bind='value: name,validationElement:name,hasfocus:selName' /> <span class="validationWarn" data-bind="visible:selName">请输入用户名账号,它由字母汉字数字组成.</span> <span data-bind="visible:!selName()"><span class="validationError" data-bind="validationMessage:name"></span></span> <span data-bind="visible:!selName()"><span class="validationSuccess" data-bind="visible:name.isValid()"></span></span> </div> <div class="editor-label"> Email: </div> <div class="editor-field"> <input data-bind='value: Email,hasfocus:selEmail' /> <span data-bind="visible:!selEmail()"><span class="validationError" data-bind="validationMessage:Email"></span></span> <span class="validationWarn" data-bind="visible:selEmail">请输入你的Email.</span> <span data-bind="visible:!selEmail()"><span class="validationSuccess" data-bind="visible:Email.isValid()"></span></span> </div> <div class="editor-label"> 手机: </div> <div class="editor-field"> <input data-bind='value: phone,hasfocus:selPhone' /> <span data-bind="visible:!selPhone()"><span class="validationError" data-bind="validationMessage:phone"></span></span> <span class="validationWarn" data-bind="visible:selPhone">请输入你的电话.</span> <span data-bind="visible:!selPhone()"><span class="validationSuccess" data-bind="visible:phone.isValid()"></span></span> </div> <div style="clear: both;"></div> <p> <input type="button" value="Create" data-bind="click:Register" /> </p>
JS代码
var Product = function () { var self = this; ko.validation.configure({//ko.validation相关配置 insertMessages: false,//不自动插入错误消息 errorElementClass: 'errorElementClass',/*元素的CSS样式*/ errorMessageClass: 'errorMessageClass',/*提示信息CSS的样式*/ }); self.name = ko.observable().extend({ minLength: 2, maxLength: { params: 30, message: "名称最大长度为30个字符" }, required: { params: true, message: "请输入名称", } }); self.selName = ko.observable(false); self.phone = ko.observable().extend({ required: true, number: { params: true, message: "电话不合法", } }); self.selPhone = ko.observable(false); self.Email = ko.observable().extend({ required: { params: true, message: "请填写Email" }, email: { params: true, message: "Email格式不正确" } }); self.selEmail = ko.observable(false); self.Register = function () { self.errors = ko.validation.group(self); if (self.isValid()) { alert("验证成功,数据可以提交"); } else { self.errors.showAllMessages(); } }; }; product = new Product(); ko.applyBindings(product);
页面截图
分类:
前端技术
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示