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 相关文章推荐
幻宇的层模拟窗口效果-提供演示和下载
Jan 20 Javascript
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
Apr 01 Javascript
javascript 模式设计之工厂模式详细说明
May 10 Javascript
onsubmit阻止form表单提交与onclick的相关操作
Sep 03 Javascript
Javascript Objects详解
Sep 04 Javascript
Javascript编程之继承实例汇总
Nov 28 Javascript
详解jQuery中的事件
Dec 14 Javascript
JavaScript实现无刷新上传预览图片功能
Aug 02 Javascript
AngularJS 购物车全选/取消全选功能的实现方法
Aug 14 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
Sep 03 Javascript
Layui点击图片弹框预览的实现方法
Sep 16 Javascript
JS实现手写 forEach算法示例
Apr 29 Javascript
利用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执行速度全攻略(上)
2006/10/09 PHP
php中经典方法实现判断多维数组是否为空
2011/10/23 PHP
深入php self与$this的详解
2013/06/08 PHP
zf框架的registry(注册表)使用示例
2014/03/13 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
简单解决新浪SAE无法上传文件的问题
2015/05/13 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
2016/11/14 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
js 删除数组的几种方法小结
2014/02/21 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
2015/03/01 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
jQuery Validate 数组 全部验证问题
2017/01/12 Javascript
表格展示利器 Bootstrap Table实例代码
2017/09/06 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
vue中实现弹出层动画效果的示例代码
2020/09/25 Javascript
[52:27]2018DOTA2亚洲邀请赛 3.31 小组赛B组 paiN vs Secret
2018/04/01 DOTA
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
python字符串排序方法
2014/08/29 Python
Python基础之函数用法实例详解
2014/09/10 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
pytorch实现mnist数据集的图像可视化及保存
2020/01/14 Python
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
什么是跨站脚本攻击
2014/12/11 面试题
高级Java程序员面试题
2016/06/23 面试题
上课迟到检讨书
2014/01/19 职场文书
交通安全教育制度
2014/02/02 职场文书
法定代表人授权委托书
2014/09/19 职场文书
转让协议书
2015/01/27 职场文书
起诉状范本
2015/05/20 职场文书
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android
Python echarts实现数据可视化实例详解
2022/03/03 Python