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 相关文章推荐
window.name代替cookie的实现代码
Nov 28 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
Sep 01 Javascript
javascript和jquery实现用户登录验证
May 04 Javascript
了解VUE的render函数的使用
Jun 08 Javascript
Vue.js学习笔记之常用模板语法详解
Jul 25 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
Oct 27 jQuery
三分钟学会用ES7中的Async/Await进行异步编程
Jun 14 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
Aug 25 Javascript
vue集成百度UEditor富文本编辑器使用教程
Sep 21 Javascript
vue点击当前路由高亮小案例
Sep 26 Javascript
微信小程序实现拼图小游戏
Oct 22 Javascript
详解Vue2的diff算法
Jan 06 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开发注意事项总结
2015/02/04 PHP
php通过function_exists检测函数是否存在的方法
2015/03/18 PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
2015/12/22 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
php异常处理捕获错误整理
2019/09/23 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
Jquery 基础学习笔记
2009/05/29 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
javascript 用函数语句和表达式定义函数的区别详解
2014/01/06 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
浅谈js 闭包引起的内存泄露问题
2015/06/22 Javascript
jQuery的事件委托实例分析
2015/07/15 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
vue实现商城上货组件简易版
2017/11/27 Javascript
详解webpack打包第三方类库的正确姿势
2018/10/20 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
举例讲解Linux系统下Python调用系统Shell的方法
2015/11/07 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
python多线程调用exit无法退出的解决方法
2019/02/18 Python
Python格式化字符串f-string概览(小结)
2019/06/18 Python
Django组件content-type使用方法详解
2019/07/19 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
python实现录屏功能(亲测好用)
2020/03/02 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
英国助听器购物网站:Hearing Direct
2018/08/21 全球购物
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
入党积极分子思想汇报
2014/01/02 职场文书
《雾凇》教学反思
2014/02/17 职场文书
事业单位个人总结
2015/02/12 职场文书
经费申请报告范文
2015/05/18 职场文书
高中班主任心得体会
2016/01/07 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang
golang通过递归遍历生成树状结构的操作
2021/04/28 Golang
go语言基础 seek光标位置os包的使用
2021/05/09 Golang