xmlplus组件设计系列之文本框(TextBox)(3)


Posted in Javascript onMay 03, 2017

文本框是页面中最常用的输入组件,它的默认使用方式如下:

<input type='text'/>

当然,这里的 `type='text' 可以略去不写。大部分情况下,使用默认的文本框作为输入组件是没什么问题的,但在具体的项目中,难免会有功能扩展的需求。这里仅以如何增加文本框数据的格式化输入输出能力为例说明如何扩展原生的文本框组件。除了本章的内容,你也可以参考官方文档中的 参数映射 一章。

目标组件的功能分析

对于原生的文本框,我们获取到的值是文本类型的,就像下面的示例所展示的:

Example: {
  xml: "<input id='input' value='text'/>",
  fun: function (sys, items, opts) {
    console.log(typeof this.prop("value")); // string
  }
}

如果需要其它类型的数值,就需要对获取到的数据进行格式化操作。比如,如果需要整型数,就需要用到 parseInt 函数;如果需要浮点型数,就需要用到 parseFloat 函数。如果我们能够将格式化数据的操作封装起来,那使用起来一定会相当的方便。为了明确我们的预期,不妨先给出目标组件的使用示例。

Index: {
  xml: "<div id='index'>\
       <TextBox id='foo'/>\
       <TextBox id='bar' format='int'/>\
     </div>",
  fun: function (sys, items, opts) {
    items.foo.value = "hello, world";
    items.bar.value = 27.1828;
    console.log("foo", items.foo.value);
    console.log("bar", items.bar.value);
  }
}

此示例实例化了两个组件 Input。组件 Input 允许接收一个 format 参数作为其静态接口输入,并提供一个属性 value 作为其动态输入输出接口。format 参数有三种可能的值:string (默认)、int 以及 float。这三种值分别对应三种数据类型:字符串型、整型和浮点型。属性 value 根据 format 的值来进行格式化输入输出。示例的输出结果应该会是下面这样子:

hello, world
227

目标组件的实现

为了完成上面的目标组件,我们先给出一个文本框的组件框架。

TextBox: {
  xml: "<input id='input' type='text'/>",
  opt: { format: "string" },
  fun: function (sys, items, opts) {
    var parse = {"int": parseInt, "float": parseFloat, "string": String}[opts.format];
    function getValue() {
      // 这里需要获取 input 的值并根据 opts.format 值选择适当的格式化函数,
    }
    function setValue(value) {
      // 这里需要根据 opts.format 值选择适当的格式化函数,对 value 进行格式化后同去赋值
    }
    return Object.defineProperty({}, "value", { get: getValue, set: setValue });
  }
}

上面关键的地方在于格式化函数的选取,为了简单化,我们采用的是表查询方式。在组件初始化阶段该函数就已经准备就绪了,上述的 parse 函数即所需的格式化函数。不过需要注意的是,该组件的格式化函数类型在组件初始化时就固定了。如果需要可变的格式化函数,你需要对组件做些修正。好了,下面可以给出完整的的文本框组件了。

TextBox: {
  xml: "<input id='input' type='text'/>",
  opt: { format: 'string' },
  map: { attrs: { input: "disabled value placeholder readonly" } },
  fun: function (sys, items, opts) {
    var parse = {"int": parseInt, "float": parseFloat, "string": String}[opts.format];
    function getValue() {
      return parse(sys.input.prop("value"));
    }
    function setValue(value) {
      sys.input.prop("value", parse(value));
    }
    return Object.defineProperty({}, "value", { get: getValue, set: setValue });
  }
}

另外请注意,上面组件添加了部分属性映射的内容,这可以在具体的项目中根据需要进行增删。

本系列文章基于 xmlplus 框架。如果你对 xmlplus 没有多少了解,可以访问 www.xmlplus.cn。这里有详尽的入门文档可供参考。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS效率个人经验谈(8-15更新),加入range技巧
Jan 09 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
Aug 08 Javascript
如何将php数组或者对象传递给javascript
Mar 20 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
May 10 Javascript
在vue中获取dom元素内容的方法
Jul 10 Javascript
深入理解vue $refs的基本用法
Jul 13 Javascript
关于vue.js组件数据流的问题
Jul 26 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
Sep 20 jQuery
详解Web使用webpack构建前端项目
Sep 23 Javascript
5分钟学会Vue动画效果(小结)
Jul 21 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
Nov 15 Javascript
vue实现滑动解锁功能
Mar 03 Vue.js
利用Mongoose让JSON数据直接插入或更新到MongoDB
May 03 #Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
May 03 #Javascript
javascript过滤数组重复元素的实现方法
May 03 #Javascript
JS实现图片点击后出现模态框效果
May 03 #Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
May 03 #Javascript
javascript 判断一个对象为数组的方法
May 03 #Javascript
深入理解node.js之path模块
May 03 #Javascript
You might like
PHP中3种生成XML文件方法的速度效率比较
2012/10/06 PHP
php session劫持和防范的方法
2013/11/12 PHP
php中explode函数用法分析
2014/11/15 PHP
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
2014/11/20 PHP
dedecms集成财付通支付接口
2014/12/28 PHP
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
js 单击式的下拉菜单效果实例
2013/08/13 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
2013/11/23 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
详解Javascript中DOM的范围
2017/02/13 Javascript
webpack踩坑之路图片的路径与打包
2017/09/05 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
vue路由对不同界面进行传参及跳转的总结
2019/04/20 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
2020/07/21 Javascript
vue setInterval 定时器失效的解决方式
2020/07/30 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
了不起的11个JavaScript代码重构最佳实践小结
2021/01/11 Javascript
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
通过python将大量文件按修改时间分类的方法
2018/10/17 Python
python中的句柄操作的方法示例
2019/06/20 Python
python模拟斗地主发牌
2020/04/22 Python
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
CLR与IL分别是什么含义
2016/08/23 面试题
什么是ARP(Address Resolution Protocol)地址解析协议
2013/10/31 面试题
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
煤矿安全承诺书
2014/05/22 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
Python机器学习之逻辑回归
2021/05/11 Python