⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 index.js

📁 難得的JavaScript TreeGrid / TreeList
💻 JS
字号:
Ext.onReady(function(){
	Ext.BLANK_IMAGE_URL='resources/images/default/s.gif';
	//指定EXT 的占位图片的位置
	var root=new Ext.tree.AsyncTreeNode({
	//声明一个根节点
		id:'0',//id为0
		text:'0',//显示文字为0
		children:[{//子节点
			text:'loading',//显示文字为loading
			iconCls: 'loading',//使用图标为loading 在index.html style 中定义
			leaf:true//是叶子节点,不在包含子节点
		}]
	});
	var treeLoader=new Ext.tree.TreeLoader();//指定一个空的TreeLoader
	var tree = new Ext.tree.TreePanel({//声明一个TreePanel显示tree
		id:'tree',//id为tree
		region:'west',//设定显示区域为东边,停靠在容器左边
		split:true,//出现拖动条
		collapseMode:'mini',//拖动条显示类型为mini,可出现拖动条中间的尖头
		width: 210,//初始宽度
		minSize: 210,//拖动最小宽度
		maxSize: 300,//拖动最大宽度
		collapsible: true,//允许隐藏
		title: "树",//显示标题为树
		loader: treeLoader,//指定数据载入的loader对象,现在定义为空
		lines:true,//出现节点间虚线
		autoScroll:true,//自动出现滚动条
		root:root//根节点为 root 对象
	});
	root.on('expand',gettree);//当根节点展开后触发gettree事件
	
	function gettree(node)
	{//此方法使用mootools框架的AJAX实现对子节点的异步读取,没使用EXT的是为了表达 EXT的灵活性和可扩展性
		if(node.firstChild.text=='loading'){//如果当前展开节点的第一个子节点为loading,则调用异步方法取得子节点数据,否则直接展开
			var url = 'getTree.action';//请求的地址,因为使用的 struts2 所以请求为.action
			var params ='id='+node.id;//请求数据
			//创建Ajax对象(mootools提供),对应于发送请求
			var myAjax = new Ajax(url ,{method:'post',data:params,onComplete:function(){
			//	url:请求位置 method:请求方式 可以使用get或post data:请求数据 
			//  onComplete:当异步调用完成时调用的方法,即响应内容完全获得后调用该方法
				var myObject = Json.evaluate(this.response.text);
				//将返回的响应数据转换为JS对象,返回数据为JSON格式,Json对象(mootools提供)
				//alert(this.response.text);
				var tl=myObject.tl;//获取tl数组,该数组中数据为子节点数据,由ACTION处理后获得
				//alert(tl);
				for(var i=0;i<tl.length;i++){//循环数组,添加子节点
					var cnode=new Ext.tree.AsyncTreeNode({//声明子节点对象
						//tl[i].id 此处tl为action返回的数据,也就是在action中定义的List tl=new ArrayList();
						//tl中元素都为 treeNode对象,所以可是使用treeNode中属性访问
						//tl[i].id 则访问tl数组中,第i个元素的id属性值
						//tl[i].name 则访问tl数组中,第i个元素的name属性值
						//tl[i].leaf 则访问tl数组中,第i个元素的leaf属性值
						id:tl[i].id+node.id,//id 为服务器返回id+父节点id
						text:tl[i].name+node.id,//显示内容为服务器返回id+父节点id
						leaf:tl[i].leaf,//是否为叶子节点,根据服务器返回内容决定是否为叶子节点
						children:[{//添加子节点,如果服务器返回tl[i].leaf为ture则孩子节点将无法显示
							text:'loading',
							iconCls: 'loading',
							leaf:true
						}]
					});
					cnode.on('expand',gettree);//定义当前节点展开时调用gettree方法,再次异步读取子节点
					node.appendChild(cnode);//将当前节点添加为待展开节点子节点
				}
				node.firstChild.remove();//删除当前节点第一个孩子节点(loading节点)
			}});
			myAjax.request();//发送ajax异步请求
		}
	}
	var Data = [];//定义一个空的data数组,使得表格最开始显示数据为空
	var store=new Ext.data.Store({//定义数据源
			reader: new Ext.data.ArrayReader(//数据读取对象
			{}, [
			   {name: 'c1'},//指定数据列,第一列为c1
			   {name: 'c2'},//指定数据列,第一列为c2
			   {name: 'c3'} //指定数据列,第一列为c3
			]),
			data: Data//使用数据为Data,暂时为空
		});
	var sm=new Ext.grid.CheckboxSelectionModel();//表格复选列
	var selectNode;//当前选择的叶子节点
	var cpage=1;//当前数据显示的页,默认为1
	var ccount=25;//页显示数据个数,默认为25
	var grid=new Ext.grid.GridPanel({//定义表格
		id:'grid',//id为grid
		border:true,//出现边框
		title:'表格',//标题内容为 表格
		region:'center',//设定显示区域为中心,停靠在容器中心
		layout: 'fit',//表格内列内容填充满,按列头比例填充
		ds:store ,//数据源为store 上边定义
		cm: new Ext.grid.ColumnModel([//定义表格显示列头
			new Ext.grid.RowNumberer(),//第一列为编号列
			sm,//第二列为复选列
			{header: "列1", width: 40, sortable: true, dataIndex: 'c1'},
			//显示文字为列1,宽度40,允许排序,使用数据源中c1列数据
			{header: "列2", width: 40, sortable: true, dataIndex: 'c2'},
			{header: "列3", width: 40, sortable: true, dataIndex: 'c3'}
		]), 
		sm:sm,//复选方式按sm定义方式
		bbar:[//底端 工具条
			{iconCls: 'first', handler:function(){ccount=Ext.getCmp('txtCount').value;getData(selectNode,1,ccount);}},
			//使用图标为first(index.html-style中定义)
			//handler :当点击此按钮时触发事件,调用getData方法
			{iconCls: 'pre', handler:function(){ccount=Ext.getCmp('txtCount').value;getData(selectNode,cpage-1,ccount);}},
			'第',new Ext.form.TextField({value:'1',id:'txtPage',width:'20',listeners:{change:function(txt,n,o){if(n>0 && n<9999)getData(selectNode,n,ccount);}} }),'页',
			{iconCls: 'next', handler:function(){ccount=Ext.getCmp('txtCount').value;getData(selectNode,cpage+1,ccount);}},
			{iconCls: 'last', handler:function(){ccount=Ext.getCmp('txtCount').value;getData(selectNode,99999,ccount);}},'-',
			{iconCls: 'loading', handler:function(){ccount=Ext.getCmp('txtCount').value;getData(selectNode,cpage,ccount);}},'-',
			'每页显示',new Ext.form.TextField({value:'25',id:'txtCount',width:'15',listeners:{change:function(txt,n,o){getData(selectNode,cpage,n);}} }),'条数据',
			'->','<div id="msg">共 条数据,当前显示的是 条</div>'
		],
		viewConfig: {
			sortAscText:'升序',
			sortDescText:'降序',
			columnsText:'显示列',
            forceFit:true
        }
	})
	var viewport = new Ext.Viewport({
		layout:'border',
		items:[
			tree,grid
		 ]
	});//end viewport  
	
	tree.on('click',function(node){//当树节点被点击时触发
		if(node.isLeaf()){//如果不是叶子节点则不处理
			//请求的地址
			selectNode=node;//设置选择节点为当前节点
			var url = 'getData.action';//请求位置
			var params ='id='+node.id;//请求数据
			params+='&page=1&count=25';//请求数据
			
			cpage=1;//设定显示页为第一页
			count=25;//设定显示个数为25个
			Ext.getCmp('txtPage').setValue(cpage);//设置工具条中页文本内容为1
			Ext.getCmp('txtCount').setValue(count);//设置工具条中个数文本内容为25
			$('msg').innerHTML='共'+node.id+'条数据,当前显示的是0-25条';//设置工具条中显示文字
			//创建Ajax.Request对象,对应于发送请求
			var myAjax = new Ajax(url ,{method:'post',data:params,onComplete:function(){//异步响应完成时的回调方法
					var myObject = Json.evaluate(this.response.text);
					var dl=myObject.dl;//返回的数据数组,此处返回的数据都为object类型,另我很纳闷
					var data=[];
					for(var i=0;i<dl.length;i++){//将返回dl数组,转换为2维数组,grid显示用
						data[i]=new Array(dl[i].c1,dl[i].c2,dl[i].c3)
						//dl[i].c1 此处dl为action返回的数据,也就是在action中定义的List dl=new ArrayList();
						//dl中元素都为 data对象,所以可是使用 data中属性访问
						//dl[i].c1 则访问dl数组中,第i个元素的c1属性值
					}
					store.loadData(data);//数据源从新载入数据,显示到grid中
					
				}
				
			});
			myAjax.request();//发送请求
		
		}
	})
	function getData(node,page,count){//读取数据的方法,翻页时调用
		//node当前选择的节点,page显示页,count显示个数
		if (!node) {alert('请先选择一个叶节点!');return;}//如果还没有叶子节点被选中则提示
		if (count<1 && count>9999) count=25;//如果显示个数不在1-9999中间,则设置为25
		cpage=page;//当前页改为显示页值
		if (cpage<1) cpage=1;//如果小于1则为1
		if (cpage>node.id/count) cpage=Math.floor(node.id/count+1);//如果大于最大页则为最大页

		Ext.getCmp('txtPage').setValue(cpage);//设置工具条中页文本内容为当前页
		Ext.getCmp('txtCount').setValue(count);//设置工具条中个数文本内容为当前显示个数
		var url = 'getData.action';//请求位置
		var params ='id='+node.id;//请求数据
		params +='&page='+cpage+'&count='+count;//请求数据
		var start=(cpage-1)*count+1;
		var end=cpage*count;
		if (end>node.id)end=node.id;
		$('msg').innerHTML='共'+node.id+'条数据,当前显示的是'+start+'-'+end+'条';
		//alert(params);
		//创建Ajax.Request对象,对应于发送请求
		var myAjax = new Ajax(url ,{method:'post',data:params,onComplete:function(){
				var myObject = Json.evaluate(this.response.text);
				var dl=myObject.dl;
				var data=[];
				for(var i=0;i<dl.length;i++){
					data[i]=new Array(dl[i].c1,dl[i].c2,dl[i].c3)
				}
				store.loadData(data);
			}
		});
		myAjax.request();
	}
});

	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -