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 相关文章推荐
kmock javascript 单元测试代码
Feb 06 Javascript
没有document.getElementByName方法
Aug 19 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
Mar 23 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
Jun 19 Javascript
jquery实现顶部向右伸缩的导航区域代码
Sep 02 Javascript
jQuery Validate初步体验(二)
Dec 12 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
Dec 12 Javascript
微信小程序 常用工具类详解及实例
Feb 15 Javascript
微信小程序实现炫酷的弹出式菜单特效
Jan 28 Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
Apr 07 Javascript
Node.js API详解之 dgram模块用法实例分析
Jun 05 Javascript
js实现类选择器和name属性选择器的示例步骤
Feb 07 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
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
处理php自动反斜杠的函数代码
2010/01/05 PHP
浅谈php冒泡排序
2014/12/30 PHP
PHP表单验证内容是否为空的实现代码
2016/11/14 PHP
浅谈PHP的反射机制
2016/12/15 PHP
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
JQuery UI的拖拽功能实现方法小结
2012/03/14 Javascript
浏览器解析js生成的html出现样式问题的解决方法
2012/04/16 Javascript
浅析ajax请求json数据并用js解析(示例分析)
2013/07/13 Javascript
js动态修改input输入框的type属性(实现方法解析)
2013/11/13 Javascript
seaJs的模块定义和模块加载浅析
2014/06/06 Javascript
node.js中的dns.getServers方法使用说明
2014/12/08 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
js自定义回调函数
2015/12/13 Javascript
深入理解angular2启动项目步骤
2017/07/15 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
vue-列表下详情的展开与折叠案例
2020/07/28 Javascript
关于element的表单组件整理笔记
2021/02/05 Javascript
Python中的urllib模块使用详解
2015/07/07 Python
Python采集代理ip并判断是否可用和定时更新的方法
2018/05/07 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
Flask中endpoint的理解(小结)
2019/12/11 Python
pandas 对group进行聚合的例子
2019/12/27 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
logging level级别介绍
2020/02/21 Python
使用Keras构造简单的CNN网络实例
2020/06/29 Python
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
大学毕业生个人自荐信范文
2014/01/08 职场文书
村委会贫困证明
2014/01/14 职场文书
中文教师求职信
2014/02/22 职场文书
保护环境建议书
2014/03/12 职场文书
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server