1. 程式人生 > >js實現決策表

js實現決策表

proto collect += light htm 改變 使用 modal adl

最近一段時間一直在做決策表的研發。編寫的過程及其殘忍,當看到結果的那一刻感覺還是不錯的喲。

寫之前在網上搜過,沒有找到,所以決定附上代碼,跟大家分享一下。

決策表功能如下:

技術分享

這裏的彈出框調用的是bootsrap的組件,所以代碼僅供參考,復制上去功能是出不來的,js具體代碼如下:

/**
 * Created by jiqingkuo
 */
define([
        "PDUtilDir/grid",
        "PDUtilDir/util",
        "PDUtilDir/tool",
        "PDUtilDir/dialog",
        "PDUtilDir/searchBlock",
        ‘CommonUtilUploadDir/lar-upload-logo‘,
		‘CommonUtilUploadDir/lar-upload-single‘,
        "CommonUtilCkEditorDir/ckeditor"],
   function(Grid, Util, Tool,Dialog,SearchBlock,LarUploadLogo,LarUploadSingle){
	
		var grid;
		
		var tableJson = {
	    		ruleId:"",
	    		type:"",//結果節點  為空不可添加刪除條件
	    		condition:[],
				result:[]
		};
		//獲取html 條件 標簽元素	
		var $tbody=$("#tbody");
		var $thead=$("#thead");
		//獲取 結果 HTML 元素
		var $resThead=$("#resThead");	
		var $result=$("#result");
        //定義布爾值 checkbox選中狀態
		var isBool;
		/**
    	 * 構造一個DecisionTable函數
    	 */
		function DecisionTable(data){				
			
			DecisionTable.initData.call(this,data);
			
		}
		/**
		 * 初始化數據
		 */
		DecisionTable.initData = function(data){
			
			if(data === undefined){
				$.ajax({
	                type:‘GET‘,
	                url:getServer()+‘/static/app/collection/decisionTable/tb.json‘,
	                dataType:‘JSON‘,
	                success:function(data){	
		 					DecisionTable.renderTable.call(this,data);//渲染tbody 	
	                }
	            });
			}else{
					
					DecisionTable.renderTable.call(this,data);//創建決策表

			}
			
		}
		
		/**
		 * 根據已有Json  渲染tbody
		 */
		DecisionTable.renderTable=function(data){
			//判斷ruleId為空  調用條件添加 創建決策表
			if(data.ruleId!==‘‘ ){
				html=‘‘;
				$thead.empty();
				$tbody.empty();	
				tableJson=data;
				DecisionTable.prototype.renderData(data)
				
			}
			 	DecisionTable.init(this,data);
		}
		
		
		/**
		 * 初始化
		 * 事件綁定
		 */
		DecisionTable.init = function(node){
			DecisionTable.bindAddConditionButtonEvent(this,node);			
			DecisionTable.bindSetResultButtonEvent(this,node);
			DecisionTable.bindDeleteButtonEvent(this,node);
			DecisionTable.bindSaveButtonEvent(this,node);
			
		}
		/**
		 * 點擊添加事件
		 */
		DecisionTable.bindAddConditionButtonEvent = function(node){
			
			$(‘#addBtn‘).unbind(‘click‘).bind(‘click‘ , function(){
					if(tableJson.type === ‘‘){
						//結果節點為空 可添加 刪除
						DecisionTable.prototype.popAddConditionDilog(node);				
					}
					
				
            });
		}
		
		
        			
		/**
		 * 點擊設置結果事件
		 */
		DecisionTable.bindSetResultButtonEvent = function(node){
			$(‘#resBtn‘).unbind(‘click‘).bind(‘click‘ , function(){
				DecisionTable.prototype.popUpSetResultDialog(node);
				
            });
		}
		
		/**
		 * 點擊刪除事件
		 */
		DecisionTable.bindDeleteButtonEvent = function(node){
			$(‘#delBtn‘).unbind(‘click‘).bind(‘click‘ , function(){
				if(tableJson.type === ‘‘){
					//結果節點為空 可調用刪除 方法
					DecisionTable.prototype.popUpDeleteDialog(node);
				}else{
					DecisionTable.prototype.popUpDeleteResultDialog(node);
				}
				
            });
		}
		
		/**
		 * 點擊保存事件
		 */
		DecisionTable.bindSaveButtonEvent = function(node){
			 $(‘#saveBtn‘).bind(‘click‘,function(){
		    	   var aToStr=JSON.stringify(tableJson);//轉換為Json
		    	   alert(aToStr);
		    	   console.log(aToStr);
            });
		}
		/**
		 * 
		 * 原型鏈結構
		 */
		DecisionTable.prototype = {
				
				/**
				 * 根據已有json遍歷生成Dom
				 */
				renderData:function(data){					
					var length=data.condition.length; //獲取數組長度  用於取值
				 	DecisionTable.Js(length);//調用Js通過傳值  返回 2的n次方的計算結果				 	
					 //渲染thead
					 var html=‘‘;			 	
		             	 html+="<tr>" ;	             
		             	 html+="<th style=‘width:10px;‘ id=‘th‘></th>";
		             	 html+="<th style=‘width:180px;‘>條件名稱</th>";	           	
			         for(var j=0;j<n;j++){		   		        	 
			             html+="<th style=‘width:20px;‘>"+"規則"+(j+1)+"</th>";		            
			         }
			         	 html+="</tr>";      
			        
			         //thead內元素添加
					 $thead.append(html);  
						
					 for(i=0;i<length;i++){				
					 		//渲染 tbody		       
						var html=‘‘;	 
							html+="<tr>" ;	             
							html+="		<td style=‘width:10px;‘><input type=‘checkbox‘ name=‘ckb‘/></td>";
							html+="		<td style=‘width:50px;‘><label id=‘cdnName‘>"+data.condition[i].name+"</label></td>";
							for(var m=0;m<n;m++){					 			
							html+="<td style=‘width:20px;‘>"+data.condition[i].rule[m].value+"</td>"
							}					 		                  
							html+="</tr>"; 							
							 //數據渲染 tbody內元素						
							 $("#tbody tr").eq(i).append(html);    
							 $tbody.append(html);      
					 }
				},
				
				
				/**
				 * 創建table結構
				 * rows當前行length
				 * suptdsum 單元格規則條件判斷
				 */
				buildTableStyle:function(node,rows,suptdSum){
					
					 var html=‘‘;			 	
			             html+="<tr>" ;	             
			             html+="<th style=‘width:10px;‘ id=‘th‘></th>";
			             html+="<th style=‘width:180px;‘>條件名稱</th>";	           	
				         for(var i=0;i<n;i++){		   		        	 
				            html+="<th style=‘width:20px;‘>"+"規則"+(i+1)+"</th>";		            
				         }
				         html+="</tr>"; 	
				         
				         //thead內元素添加
						 $thead.append(html);  
						 
						 //if判斷 保留最後一次  生成的元素
				         if ($("#thead tr").length>1 ){	            	
				        	 	$("#thead tr").eq(0).remove();	            
				         }	
				         //表格的 局部生成 
				        for(var j=0;j<=rows;j++){
				        	if(j==rows){//當前行相等				        				       
	  						 var html=‘‘;	 
	  				          	 html+="<tr>" ;	             
	  				             html+="		<td style=‘width:10px;‘><input type=‘checkbox‘ name=‘ckb‘/></td>";
	  				             html+="		<td style=‘width:50px;‘><label id=‘cdnName‘>"+tableJson.condition[j].name+"</label></td>";
	  					         for(var k=0;k<i;k++){
	  					        	   if(k<suptdSum){//if判斷 單元格值  Y 與N 各占一半
	  					        		   html+="<td style=‘width:20px;‘>"+tableJson.condition[j].rule[k].value+"</td>";
	  					        	   }else{
	  					        		   html+="<td style=‘width:20px;‘>"+tableJson.condition[j].rule[k].value+"</td>";
	  					        	   }
	  						            		            		
	  						       }		          
	  					           html+="</tr>"; 		 	  					     
	  					            //數據渲染 tbody內元素
	  					         $tbody.append(html);
				        	}
				        } 
				        DecisionTable.prototype.buildTableCoplete();//調用方法  生成完成table	
				},
				
				/**
				 * 將talbe完整 
				 */
				buildTableCoplete:function(){
								 	
				 	var rows=$("#tbody tr").length;//獲取table當前行數
				 	
				 	DecisionTable.Js(rows);//計算2的n次方 返回值  n
				 	
					
					if(rows === 1){//if判斷 第一次 不需要添加td
						return ;
					}else{
							 
						for(var q=0;q<rows-1;q++){	
							var html=‘‘;
							var arrayCopy=tableJson.condition[q].rule.slice(0);//數組的copy
							tableJson.condition[q].rule.push.apply(tableJson.condition[q].rule,arrayCopy);//數組拼接
							
		        	  		for(var k=0;k<arrayCopy.length;k++){
		        	  			//遍歷新數組 取值
		        	  			 html+="<td style=‘width:20px;‘>"+arrayCopy[k].value+"</td>";
		        	  		}
		        	  		
		        	  		$("#tbody tr").eq(q).append(html);
						}
					}	
				},
				
				/**
				 * express 條件json 創建 
				 */ 
				createJson:function(node,rows,tdSum){
					for(var j=0;j<n;j++){
			        	   if(j<tdSum){
			        		   node.condition[rows].rule.push({
			        			   value:"Y"
			        		   });
			        	   }else{
			        		   node.condition[rows].rule.push({
			        			   value:"N"
			        		   });
			        	   }
				            		            		
				       }					
				},
				/**
				 * result  結果 json 創建
				 */
				createResultJson:function(node,rows,rowIndex,isBool){
					
					for(var j=0;j<n;j++){
						
						if(isBool){
							isBool=true;
						}else{
							isBool=false;
						}
						
							
						node.result[rowIndex].value.push(isBool);	            		
				       }
					
				},
				//條件添加彈框提示
		        popAddConditionDilog:function(node){
	
		             var buttons = [];
		             buttons.push(
		            		 {name:"確定",callback:function(){
		            				 //此處寫擴展代碼    
		 	                     dialog.hide();	 	                    	 
		 	                     var name=$("#conName").val();//條件名稱
		 	  					 var condition=$("#conExpress").val();//條件表達式
		 	  					 var rows=$("#tbody tr").length;//獲取當前tr的length	
			 	  		
		 	  					
		 	  					 DecisionTable.Js(rows+1);//返回 值  為2的次方的結果n		 	  					 
		 	  					 var suptdSum=Math.ceil(n/2);//取整需要補充td數量  suptsSum 
		 	  					 
		 	  					 //將條件,名稱添加到 json數組
			 	  				tableJson.condition.push({
			 	  						name:name,//條件名字
			 	  						condition:condition,//條件表達式
			 	  						rowindex:rows,//當前行
			 	  						rule:[
												 					     
			 	  						]
			 	  			
			 	  				 });
		 	  					DecisionTable.prototype.createJson(tableJson,rows,suptdSum);//調用方法創建 完整JSON
		 	  					
		 	  					//判斷不為空
		 	  					 if(name===‘‘ && condition===‘‘){
		 	  						DecisionTable.prototype.noNullDialog("名稱和條件表達式不能為空");
		 	  					 }else if(name===‘‘){
		 	  						DecisionTable.prototype.noNullDialog("請輸入條件名稱");						 
		 	  					 }else if(condition===‘‘){						
		 	  						DecisionTable.prototype.noNullDialog("請輸入條件表達式");			
		 	  					 }else{			
		 	  						 //表格結構構建
		 	  						DecisionTable.prototype.buildTableStyle(tableJson,rows,suptdSum);
		 	  				     } 		 	  				      
		 	  					   		 	                         
		                     }
		             });
		             var dialog = Dialog({
		                 id:"BaseDialog",
		                 cache:false,                 //是否緩存,默認為true
		                 title:"彈出框",
		                 width:"400px",
		                 height:"200px",
		                 dialogSize:"",               //modal-lg或modal-sm
		                 body:"",
		                 buttons:buttons
		             });
		             //可以通過返回的dialog對象調用相關方法
		             var dialogHtml=‘‘;
		             dialogHtml += ‘<form class="form-horizontal">‘
		             dialogHtml+=		‘<div class="form-group">‘
		             dialogHtml+=			‘<label class="col-sm-3">條件名稱</label>‘
		             dialogHtml+=			‘<input id="conName" type="text" class="col-sm-8" placeholder="條件1" maxlength="20">‘
		             dialogHtml+=		‘</div>‘
		             dialogHtml+=		‘<div class="form-group" style="padding-top:2px;">‘
		             dialogHtml+=			‘<label class="col-sm-3">條件表達式</label>‘
		             dialogHtml+=			‘<textarea id="conExpress" class="col-sm-8" type="text" placeholder="a<b+c"></textarea>‘
		             dialogHtml+=		‘</div>‘
		             dialogHtml+=‘</form>‘;
		             dialog.setBody(dialogHtml);
		            
		             dialog.show();
		        },
		      //調用設置結果彈出框
		        popUpSetResultDialog:function (node){
		           
		            var buttons = [];
		            
		            buttons.push(
		                {
		                    name:"確定",
		                    //回調函數
		                    callback:function(){
		                    	
		                    	 dialog.hide();	 	                    	 
				            	
				                 var name=$("#conName").val();
				                 var condition=$("#conExpress").val();
				                 
				           		 var ruleLength=$("#tbody tr").last().find("td").length;
				           		 var trLength=$("#tbody tr").length;//獲取當前tr的length	
				           		 var rowIndex=$("#result tbody tr").length;
				           		var cbLeng=$(".cb").length;
		 	  					 //將條件,名稱添加到 json數組
				           		tableJson.type="result";
			 	  				tableJson.result.push({
			 	  						name:name,//條件名字
			 	  						condition:condition,//條件表達式
			 	  						rowindex:rowIndex,//當前行
			 	  						value:[
												 					     
			 	  						]
			 	  			
			 	  				 });
								DecisionTable.prototype.createResultJson(tableJson,ruleLength-2,rowIndex,isBool)

			 	  				
			 	  				
		 	  					//判斷不為空
		 	  					 if(name===‘‘ && condition===‘‘){
		 	  						DecisionTable.prototype.noNullDialog("名稱和條件表達式不能為空");
		 	  					 }else if(name===‘‘){
		 	  						DecisionTable.prototype.noNullDialog("請輸入條件名稱");						 
		 	  					 }else if(condition===‘‘){						
		 	  						DecisionTable.prototype.noNullDialog("請輸入條件表達式");			
		 	  					 }else{			
			 	  						var html=‘‘;			 	
			 				             html+="<tr>" ;	             
			 				             html+="<th style=‘width:10px;‘ id=‘th‘></th>";
			 				             html+="<th style=‘width:180px;‘>結果名稱</th>";	           	
			 					         for(var i=0;i<ruleLength-2;i++){		   		        	 
			 					            html+="<th style=‘width:20px;‘>"+"結果"+(i+1)+"</th>";		            
			 					         }
			 					         html+="</tr>"; 	
			 					         
			 					         //thead內元素添加
			 							 $resThead.append(html);  
			 							 if ($("#resThead tr").length>1 ){	            	
			 				        	 	$("#resThead tr").eq(0).remove();	            
			 							 }	
			 							var ahtml
			 	           			 	ahtml+="<tbody style=‘background:#ccffff‘>";
			 	                        ahtml+=		"<tr>" ;
			 	                        ahtml+=         "<td style=‘width:10px;‘><input type=‘checkbox‘ name=‘ckb‘ /></td>";
			 	                        //for(var k=0;k<trLength-1;k++){
				 	                        ahtml+=			"<td style=‘width:10px;‘>"+name+"</td>";	 	                      

			 	                        //}			 	         	                      
				 	           	         for(var j=0;j<ruleLength-2;j++){	 	           	            		
				 	           	        	ahtml+=		"<td style=‘width:10px;‘><input type=‘checkbox‘name=‘ckb‘ class=‘cb‘/></td>";	 	           	            
				 	           	         }
				 	           	         ahtml+="	</tr></tbody>";     
				 	           	         //數據渲染result內元素
				 	           	         $result.append(ahtml);  
				 	           	        
				 	           	         //checkbox綁定事件  獲取到當前元素Index 
							 	         $(".cb").click(function(){
												isBool=$("input[name=‘ckb‘]").is(‘:checked‘);
												
												var rowindex=$(this).parents().parents().parents().index();//當前行的index
												
												var colLength=$(this).parents().index();//當前列的 總長度									
												var colIndex=colLength-2;//當前列的 index
												
												tableJson.result[rowindex-1].value[colIndex]=isBool;//改變當前選中的checkbox值 傳入數組
							 	         });
							 	 
				 	           	     
		 	  				     } 		 	  				      
		 	  					   		 	     
		 	                  }
		             });
		             var dialog = Dialog({
		                 id:"BaseDialog",
		                 cache:false,                 //是否緩存,默認為true
		                 title:"彈出框",
		                 width:"400px",
		                 height:"200px",
		                 dialogSize:"",               //modal-lg或modal-sm
		                 body:"",
		                 buttons:buttons
		             });
		             //可以通過返回的dialog對象調用相關方法
		             var dialogHtml=‘‘;
		             dialogHtml += ‘<form class="form-horizontal">‘
		             dialogHtml+=		‘<div class="form-group">‘
		             dialogHtml+=			‘<label class="col-sm-3">條件名稱</label>‘
		             dialogHtml+=			‘<input id="conName" type="text" class="col-sm-8" placeholder="條件1" maxlength="20">‘
		             dialogHtml+=		‘</div>‘
		             dialogHtml+=		‘<div class="form-group" style="padding-top:2px;">‘
		             dialogHtml+=			‘<label class="col-sm-3">條件表達式</label>‘
		             dialogHtml+=			‘<textarea id="conExpress" class="col-sm-8" type="text" placeholder="a<b+c"></textarea>‘
		             dialogHtml+=		‘</div>‘
		             dialogHtml+=‘</form>‘;
		             dialog.setBody(dialogHtml);
		            
		             dialog.show();    
		               
		        },
				//調用刪除彈出框
		        popUpDeleteDialog:function (node){	
		        	//獲取checkbox 長度
		        	var checkLeng=$("input[name=‘ckb‘]:checked").size();
		        	
		        	
		        	//獲取未選中的 checkbox長度
		        	var unChecked=$("input[name=‘ckb‘]").not("input[name=‘ckb‘]:checked").parents(‘tr‘);
		        	var unCheckLength=unChecked.length;
		        	//定義數組 tmp用來存放 未選中的數組 數據
		        	var tmpName=[];
		        	
		        	for(var j=unCheckLength-1;j>=0;j--){
		        		//將未選中的數據存放 到  新的 數組 tmp
		        		tmpName.push($(unChecked[j]).find("#cdnName").text());
		        	}		        			        	
		        	//if判斷是否選中 並彈窗提示
		        	if(checkLeng === 0){
		        		this.noNullDialog("選擇刪除的內容");
		        	}else{
		        		var buttons=[];
		        		buttons.push(
				                {
				                    name:"確定",
				                    //回調函數
				                    callback:function(){
				                    	dialog.hide();
					                    var conLenth = tableJson.condition.length;//數組的長度
					                    var sum=	conLenth-checkLeng;//未選中的長度
					                    var tdsum= Math.pow(2,conLenth) - Math.pow(2,sum);//計算 需要刪除的 td個數
					                    //for循環 遍歷 從tmp數組取值 
					                    for(var i=0;i<sum;i++){  
					                    					                    	
					                    	tableJson.condition[i].rule.splice(0,tdsum);//刪除 rule 中的 value所對應的值
					                    	tableJson.condition[i].name=tmpName[i]; //tmpName取值 並賦值
					                    	tableJson.condition[i].condition=tmpName[i];					                    	
					                    	
					                    }
					                    
					                  console.log(tableJson);
					                	   tableJson.condition.splice(sum,checkLeng);
					                	   $("#tbody").empty();
					                	   $("#thead").empty();
					                	   //調用renderData方法 重新渲染 tableJson
					                	   DecisionTable.prototype.renderData(tableJson);
					                   
					                    console.log(tableJson);
				                   
				                    	
				                    	
				                }
				        })

				            var dialog = Dialog({
				                id:"BaseDialog",
				                cache:false,
				                title:"添加內容",
				                width:"400px",
				                hieght:"200px",
				                dialogsize:"modal-sm",
				                body:"確定刪除嗎?",
				                buttons:buttons
				            });
				            dialog.show();
				        }
		        },		        
		        /**
		         * 結果的刪除
		         * @param node
		         */
		        popUpDeleteResultDialog:function(node){				 
					 //獲取checkbox 長度
					 var checkLength= $("input[name=‘ckb‘]:checked").size();				 
					 //未選中 狀態判斷 並彈窗提示
			         if(checkLength==0){
			        	 this.popUpAddConditionDialog("選擇刪除的內容");//調用彈窗 
			           }else{
			        	   var buttons = [];
					          buttons.push(
					                   {name:"確定",callback:function(){
					                    	 dialog.hide();
					                    	 
					                    	 $("input[name=‘ckb‘]:checked").each(function(){//?遍歷選中的checkbox
					         	         		var n=$(this).parents().parents().parents().index();//?獲取checkbox所在行的順序
					         	         			var aa=$(this).parents("tr");
					         	         			//刪除當前行
					         	         						         	  
					         	         			
					         	         			//if判斷 index為o時  n+1避免誤刪
					         	         			if(n === 1){
					         	         				delete tableJson.result[n-1]; 	
					         	         				$("#result tbody tr").eq(n-1).empty();
					         	         				tableJson.type=‘‘;
					         	         			}else{
					         	         				delete tableJson.result[n-1]; 	
					         	         				$("#result tbody tr").eq(n-1).empty();
					         	         			}
					         	         			
					                    	 });
					                    	 
					         	      }}
					             );
				        	  
					       //選中之後 提示 是否確定刪除
				      	   var dialog = Dialog({
				                   id:"BaseDialog",
				                   cache:false,                 //是否緩存,默認為true
				                   title:"提示框",
				                   width:"200px",
				                   height:"60px",
				                   dialogSize:"",               //modal-lg或modal-sm
				                   body:"確定刪除?",
				                   buttons:buttons
				               });
			           }
			        	 
				 },
				//調用彈框提示內容不能為空
				noNullDialog:function(item){					
					var dialog = Dialog({
		                id:"BaseDialog",
		                cache:false,                 //是否緩存,默認為true
		                title:"提示框",
		                width:"200px",
		                height:"60px",
		                dialogSize:"",               //modal-lg或modal-sm
		                body:item
		            });
				}
		        
		}
   
		/**
	       * 2的n次方
	       * 計算 返回的結果n
	       */
		DecisionTable.Js=function(num){
		      n=Math.pow(2,num);
		      return n;
		}
		
	/**
	 * 主函數
	 */
	 	return {
			mainInit:function(data){
				return new DecisionTable(data);
			}
		}
});

對了,點擊保存之後前臺將保存成JSON的格式傳給後臺,GIF動圖如下:

技術分享

 gif圖片錄制專用工具GifCam推薦大家使用哦。

js實現決策表