1. #为operamasks增加HTML扩展方式的组件调用
  2.  
  3. ##背景
  4. 之前的[博文](http://www.cnblogs.com/p2227/p/3540858.html)中有提及到,发现easyui中的combobox,datebox,layout都有效率问题,其中layout的问题在[这里](http://www.cnblogs.com/p2227/p/3541162.html)有直接的解决方法,而combobox,datebox的问题其实在layout的DEMO中也处理了,这里主要是写其处理过程。
  5.  
  6. ##处理旧问题,发现新问题
  7. 既然easyui的组件有问题,没什么好说了,换另外一个组件好了,当时试了很多UI解决方案,鉴于界面、效率及源代码的质量问题,决定用`operamasks`去替换easyui中的comboboxdatebox
  8.  
  9. 但是用惯了easyui的人会发现,easyui有一个很大的特点是,有很多属性可以直接写在html上,例如
  10.  
  11. **<div id="win" iconCls="icon-save" title="My Window"></div>**
  12.  
  13. iconClstitle就会直接加上去产生的组件上,而且也可以用类名去声明组件,这些operamasks都没有
  14.  
  15. 但是不要紧,两边的源代码都有,研究一下就OK
  16.  
  17. ##分析easyui源代码
  18. 虽然easyui的源代码混淆了,但是认真看也能发现问题的(PS:后来发现[这里](http://jquery-easyui.googlecode.com/svn/trunk)有未经混淆的代码了)
  19. 里面有一个叫`parseOptions`的函数,就是把HTML上的属性转化为组件能使用的属性。
  20.  
  21. 而根据类名去渲染就更加容易找到了,因为API中直接就有一个`$.parser.parse`的方法,分析一下其源代码即可。
  22.  
  23. ##为operamasks增加HTML扩展方式的组件调用
  24. 经过测试和其他细节调整,最后代码是这样的
  25. ```javascript
  26. var om = {
  27. dataStore:{},
  28. parse:function(key){
  29. var setData = {
  30. "Button":{
  31. parseOptions:function(obj){
  32. var $obj = obj instanceof jQuery ? obj : $(obj);
  33. return {
  34. //图片是用地址放上去的,而不是css,不科学,待改进
  35. icons: {left:$obj.attr("iconLeft") || $obj.attr("iconCls"),right:$obj.attr("iconRight")}
  36. }
  37. }
  38. },
  39. "Calendar":{
  40. parseOptions:function(obj){
  41. var $obj = obj instanceof jQuery ? obj : $(obj);
  42. return {
  43. }
  44. }
  45. },
  46. "Combo":{
  47. parseOptions:function(obj){
  48. var $obj = obj instanceof jQuery ? obj : $(obj);
  49. return {
  50. value:$obj.val(),
  51. readOnly:/(readonly)|(true)/i.test($obj.attr("readOnly")) ? true : false,
  52. dataSource:$obj.attr("dataSource"),
  53. inputField:$obj.attr("inputField"),
  54. optionField:$obj.attr("optionField") || "text",
  55. valueField:$obj.attr("valueField") || "value"
  56. }
  57. }
  58. },
  59. "NumberField":{
  60. parseOptions:function(obj){
  61. var $obj = obj instanceof jQuery ? obj : $(obj);
  62. return {
  63. allowDecimals:/true/i.test($obj.attr("allowDecimals")) ? true : false,
  64. allowNegative:/true/i.test($obj.attr("allowNegative")) ? true : false,
  65. decimalPrecision:$obj.attr("decimalPrecision")
  66. }
  67. }
  68. },
  69. "Panel":{
  70. parseOptions:function(obj){
  71. var $obj = obj instanceof jQuery ? obj : $(obj);
  72. return {
  73. width:$obj.css('width'),
  74. height:$obj.css("height"),
  75. collapsed:$obj.attr("collapsed") == "true",
  76. collapsible:$obj.attr("collapsible") == "true" || $obj.attr("collapsed") == "true" || true
  77. }
  78. }
  79. },
  80. "Tabs":{
  81. parseOptions:function(obj){
  82. var $obj = obj instanceof jQuery ? obj : $(obj);
  83. return {
  84. }
  85. }
  86. }
  87. }
  88. return key ? setData[key] : setData;
  89.  
  90. },
  91. omDocReady:function(){
  92. //$.om.omCombo.prototype.options.editable = false;
  93. $.extend($.om.omCombo.prototype.options,{ //改变下拉框的默认值
  94. forceSelection : true,
  95. filterDelay : 200,
  96. listMaxHeight : 200,
  97. inputField:"text",
  98. optionField:"text",
  99. valueField:"value"
  100. });
  101. $.om.omCalendar.prototype.options.editable = false;
  102.  
  103. var sd = om.parse();
  104. $.each(sd,function(key,val){
  105. $(".oma-"+key).each(function(oid,odm){
  106. var $obj = $(odm);
  107. var conf = sd[key].parseOptions($obj);
  108. $obj["om"+key](conf);
  109. });
  110. })
  111. }
  112. }
  113.  
  114. ```
  115. [完整的DEMO](http://p2227.github.io/demo/applyLayout/playout.html)
  116.  
  117. ##HTML扩展方式与纯JS调用
  118. 一开始使用extjs的时候,推崇的是纯JS调用式的使用组件,即
  119. ```javascript
  120. $("#id").Component({
  121. properties1:value1,
  122. properties2:value2
  123. })
  124. ```
  125. 现在在项目实践中发现,easyui可以直接把属性定义在HTML上,通过源代码的察看发现,其实他们最终都是纯JS调用在起作用,但是直接定义在HTML上更加容易入门,对于项目中一些新手来说更加好用。反正经过我的封装,项目组的其他不太熟悉前端的人使用起来是方便了。

为operamasks增加HTML扩展方式的组件调用的更多相关文章

  1. 实战MEF(1):一种不错的扩展方式

    在过去,我们完成一套应用程序后,如果后面对其功能进行了扩展或修整,往往需要重新编译代码生成新的应用程序,然后再覆盖原来的程序.这样的扩展方式对于较小的或者不经常扩展和更新的应用程序来说是可以接受的,而 ...

  2. 实战MEF(1)一种不错的扩展方式

    在过去,我们完成一套应用程序后,如果后面对其功能进行了扩展或修整,往往需要重新编译代码生成新的应用程序,然后再覆盖原来的程序.这样的扩展方式对于较小的或者不经常扩展和更新的应用程序来说是可以接受的,而 ...

  3. 扩展 jquery miniui 组件实现自动查询数据

    主题 之前写过一篇文章分享了公司basecode查找数据后台是怎么实现的(http://www.cnblogs.com/abcwt112/p/6085335.html).今天想分享一下公司前台是怎么扩 ...

  4. 一步一步学习underscore的封装和扩展方式

    前言 underscore虽然有点过时,这些年要慢慢被Lodash给淘汰或合并. 但通过看它的源码,还是能学到一个库的封装和扩展方式. 第一步,不污染全局环境. ES5中的JS作用域是函数作用域. 函 ...

  5. jQuery插件主要有两种扩展方式

    jQuery插件主要有两种扩展方式: 扩展全局函数方式. 扩展对象方法方式. 扩展全局函数方式 扩展全局函数方式定义的插件,即类级别插件,可以通过jQuery.extend()来进行定义.定义格式为: ...

  6. MBR分区操作-增加、扩展、删除

    MBR分区操作-增加.扩展.删除 GPT分区参考 http://www.blogjava.net/haha1903/archive/2011/12/21/366942.html l  fdisk 显示 ...

  7. Unity3D编辑器扩展(四)——扩展自己的组件

    前面已经写了三篇: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 今天写第四篇,扩展自己 ...

  8. Spark:几种给Dataset增加列的方式、Dataset删除列、Dataset替换null列

    几种给Dataset增加列的方式 首先创建一个DF对象: scala> spark.version res0: String = .cloudera1 scala> val , , 2.0 ...

  9. 使用vue开发输入型组件更好的一种解决方式(子组件向父组件传值,基于2.2.0)

    (本人想封装一个带有input输入框的组件) 之前使用vue开发组件的时候,在遇到子组件向父组件传递值时我采用的方法是这样的: 比如子组件是一个输入框,父组件调用时需要获取到子组件输入的值,子组件通过 ...

随机推荐

  1. URL重写的优缺点分析

    如何增强您网站地址的可读性.如何让搜索引擎快速收录到您的站点,这就需要优化您的Url,即Url的重写技术,大家熟悉的可能有很多服务器都提供Url重写技术,以前我们用的最多的就是Apache,Jboss ...

  2. Zend13.0 +XAMPP3.2.2 调试配置

    Zend 调试PHP有3种方式: (1)PHP CLI APPLICATION (2)PHP Web Application (3)PHP UnitTest (1).(2)两种方式配置相似,下图是配置 ...

  3. Hibernate下的Many-to-Many的级联删除

    hibernate下的Many-to-Many的级联删除 Hibernate多对多的例子不少,但仔细一看,大多数都是保存的,删除谈的少,但问题还不少,因此有必须简单测试一下,以下我们来个简单的多对多关 ...

  4. DHT11温湿度传感器

    一.硬件介绍 RH是相对湿度,是用零点温度来定义的,一般,RH在45%~65%之间最为合适. 注:NTC为热敏电阻,输出为:单总线数字信号,单线双向串行通讯. 注:上拉电阻情况下,配置为开漏输出,可以 ...

  5. Java深入学习之--初始化

    目录 1.方法重载 2.默认构造器 3.this关键字 4.static关键字 5.初始化 1.方法重载 java中方法重载的意思是在同一个类中可以存在方法名相同的方法,而方法的参数类型不同,即使两个 ...

  6. win7 64位系统 Oracle32bit + PL/SQL访问Orale服务,Oracle 11g的安装,中文乱码问题的解决

    前几天装了个Oracle32bit客户端 + PL/SQL连接不上oracle,我安装完打开PL/SQL登录界面跟正常的界面不一样,没有那个连接为Normal.SYSDBA的选项,下面有解释,至于我为 ...

  7. Machine Learning for hackers读书笔记(一)使用R语言

    #使用数据:UFO数据 #读入数据,该文件以制表符分隔,因此使用read.delim,参数sep设置分隔符为\t #所有的read函数都把string读成factor类型,这个类型用于表示分类变量,因 ...

  8. POJ 2774 (后缀数组 最长公共字串) Long Long Message

    用一个特殊字符将两个字符串连接起来,然后找最大的height,而且要求这两个相邻的后缀的第一个字符不能在同一个字符串中. #include <cstdio> #include <cs ...

  9. 编译busybox错误

    为了制作一个文件系统,首先要用busybox编译出文件系统所需要的应用程序.在下载了busybox-1.13.0.tar.bz2后,编译出现如下错误: In file included from /o ...

  10. Java中String为什么是final

    final概念: 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父亲被继承.因此,一个类不能既被声明为abstract,又被声明为final. 将变量或方法声明为final,可以 ...