把JSON数据载入到页面表单的两种思路(对easyui自带方法进行改进)

把JSON数据载入到页面表单的两种思路(对easyui自带方法进行改进)

背景

项目中经常需要把JSON数据填充到页面表单,一开始我使用easyui自带的form load方法,觉得效率很低,经常在载入数据的时候有假死现象(实际项目中的表单一般都100-200个字段以上),而且不能处理radio/checkbox的情况。(easyui的思路是把它们都用combo去处理)

思路

问题可以转化为,现在有一堆JSON数据,有一个表单,可能是一一对应的,要把这个数据填写到表单上,一般说来有两种思路

  1. 方案一针对数据,一个个选择元素进行填充
  2. 方案二先选择所有的元素,再针对数据进行填充

到底哪种比较优呢?

测试验证

可能也有人大概想到较优方案,但是对于实事求是的我,还是要写些代码去测试验证

我的测试例子

效果截图:

把JSON数据载入到页面表单的两种思路(对easyui自带方法进行改进)

结果

方案二的思路明显要比方案一的优,而且查看原代码后发现,easyui自带的form load方案是以方案一为基准去处理的,再加上一些细节的处理,效率非常的慢.

改进

实际上我们还要处理radio/checkbox的情况,以及处理其他一些细节,故最后整理封装的代码如下

  1. !function($){
  2. $.fn.extend({
  3. /*
  4. 把JSON数据填充进表单,兼容easyui渲染过的表单
  5. * 20140203 reconstructed by p2227
  6. * 参数:
  7. * relateTable:关系表,key-value对象,即JSON数据与表单有不对应时的另外对照表
  8. * data:要填充的JSON数据
  9. * callBack:填充完数据后的回调函数,一般说来填充完数据要进行表单验证
  10. *
  11. * 用法:
  12. * $(‘form‘).loadForm({data:{key,value}});
  13. * */
  14. loadForm:function(conf){
  15. conf = conf || {};
  16. conf.relateTable = conf.relateTable || {};
  17. var rt = conf.relateTable;
  18. var formObj = this;
  19. var jsonData = conf.data;
  20. var newData = {};
  21. function fill1EasyUI(dom,data1){ //填充值到一个easyUI表单对象上
  22. //目测针对combobox和datebox,其他表单对象 建议调用 easyUI本身的 form.load方法
  23. var eDom = $("[comboName=‘" + dom.name + "‘]",formObj); //找到easyUI起作用的dom元素(不带name)
  24. if(eDom.length<=0) return;
  25. var type = eDom[0].className.match(/(\w*?)-f/); //该dom的类上第一个带 "任意字母-f"的类
  26. if(type && type.length>0){
  27. type = type[1];
  28. if(/datebox/i.test(type)){
  29. data1 = flitDate(data1);
  30. }
  31. if (eDom[type]("options").multiple){
  32. eDom[type]("setValues", data1.replace(/\s*,\s*/g,",").split(","));
  33. } else {
  34. eDom[type]("setValue", data1);
  35. }
  36. }else{
  37. if(eDom.next("span.datebox").length>0){ //for IE7 IE6
  38. eDom.datebox("setValue", flitDate(data1));
  39. }
  40. }
  41. }
  42. /* 输入:2012-04-04 00:00:00,2012.2.2,2012/4/7
  43. * 输出:2012-04-04
  44. * */
  45. function flitDate(dStr){
  46. if(dStr){
  47. var dreg = /(\d{4})([-\/.])(\d{1,2})\2(\d{1,2})/;
  48. var sval = dStr.match(dreg)[0].replace(dreg,"$1-$3-$4");
  49. return sval;
  50. }else{
  51. return dStr;
  52. }
  53. }
  54. function fill1Simple(dom,data1){
  55. if(dom == undefined){ return;}
  56. if(dom.className.match(/combo-value/i)){
  57. fill1EasyUI(dom,data1); //按照easyUI的法则填充数据
  58. }else{
  59. var $dom = $(dom);
  60. if($dom.is("span.om-combo>input")){
  61. $dom.omCombo(‘value‘,data1)
  62. }else{
  63. dom.value = data1; //普通的html元素赋值
  64. }
  65. }
  66. }
  67. //把网页上需要额外对照的数据也加到填充数据中
  68. $.each(rt,function(key,value){
  69. if(jsonData[key]){
  70. jsonData[value.replace(/\\*/g,‘‘)]=jsonData[key];
  71. }
  72. });
  73. /* 填充数据的主函数
  74. *
  75. * 是用表单为主循环还是数据为主循环快???要做测试。
  76. * 测试结果:以表单为主循环,必需将EasyUI和一般表单项分开处理
  77. *
  78. * 必须要把radio,checkbox放在同一起处理,因为你也不清楚对照表里面的项目是text还是radio
  79. * */
  80. var nameflag="";//name标记 如果找到有name相同的 data,那就设置标记,以便循环只运行一次
  81. $("input[name],textArea[name],select[name]",formObj).each(function(){
  82. //在实际项目中,有这样的需要:JSON数据key总是大写,也要填充到页面;按表单中属性为fillBack的去填充,故在此进行扩充
  83. var filldata1 = jsonData[this.name] || jsonData[this.name.toUpperCase()] || jsonData[this.getAttribute("fillBack")];
  84. if(jsonData[this.name] === 0 || jsonData[this.name.toUpperCase()] === 0 || jsonData[this.getAttribute("fillBack")] === 0){
  85. filldata1 = 0;
  86. }
  87. if(filldata1 === undefined || filldata1 === "" || filldata1 === null|| filldata1 === "null"){
  88. return;
  89. }else{
  90. if(/radio/i.test(this.getAttribute("type"))){
  91. if(this.name==nameflag){ return; }
  92. nameflag = this.name;
  93. $("input[name=‘"+ nameflag +"‘][value=" + $.trim(filldata1) + "]").prop("checked",true);
  94. }else if(/checkbox/i.test(this.getAttribute("type"))){
  95. if(this.name==nameflag){ return; }
  96. nameflag = this.name;
  97. $("input[name=‘"+ nameflag +"‘]").prop("checked",false)//首先要清空原有数据
  98. $.each(filldata1.split(‘,‘),function(k,v){
  99. $("input[name=‘"+ nameflag +"‘][value=‘" + $.trim(v) + "‘]").prop("checked",true);
  100. })
  101. }else{
  102. this.value = "";//首先要清空原有数据
  103. fill1Simple(this,filldata1);
  104. }
  105. }
  106. });
  107. if(typeof conf.callBack == "function"){
  108. conf.callBack(jsonData);
  109. }
  110. }
  111. });
  112. }(jQuery);

把JSON数据载入到页面表单的两种思路(对easyui自带方法进行改进)

上一篇:php调用osflv播放器


下一篇:jQuery 如何创建基本插件(翻译)