`

无限级联 下拉框的实现 ... 呜呜呜 __init_xu js 又增加了一个widget

阅读更多
<script>
var json__categories = <?php echo $json__categories; ?> ;
//log(json__categories);

//查找分类
function findcg(id){
	var cg = null , hadFind = false;
	xu.array.each(json__categories['refs'],function(item,index){
		if (hadFind) return ;
		if (item.id == id)	cg = item ;
	});
	return cg ;
}
//改变分类
function chcg(o){
	if (!xu.verify._obj(o)) return ;
	//首先取得选中的id,,再查该id下是否存在子节点
	var cid = o.value;log(cid);
	if (!cid) { // 缺省值时清空节点尾部所有select
		$eo(o).removeAfterAll();
	}
	
	//在json中定位该id所对应的节点
	var categorie = findcg(cid);//log(categorie);
	
	if (!categorie) return ;
	
	//查当前节点的父节点,这个似乎不用考虑,每个节点只用管理其直接子节点
	
	//查当前节点下是否存在子节点,存在'sons'说明有子节点,创建一个下拉框并追加到尾部
	if (categorie['sons']){
		//清空创建的子select对象		
		var subCategories = categorie['sons'];		
		$new_slt = $eo.create('select');		
		$new_slt.on('change',function(){
			// this <-> $new_slt
			chcg(this);
		});
		
		add_opt($new_slt.ele,'选择子分类','',0);
		
		var start = 1;// 选项计数
		xu.array.each(subCategories,function(item){
			add_opt($new_slt.ele,item.name,item.id,start);
			start ++ ;
		});
		$eo(o).removeAfterAll().insertAfter($new_slt.ele);
	}else {
		$eo(o).removeAfterAll();
	}
}
function add_opt(slt_obj,opt_txt,opt_value,index){
	slt_obj.options[index] = new Option(opt_txt,opt_value);
}
function clear_opts(slt_obj){
	// 原有选项计数
	var len = slt_obj.options.length;
	for (var i=0; i < len; i++)
		slt_obj.options[0] = null;// 移除当前选项
}

xu.ready(function(){
	//设置分类的项 -- 首先设置初值项,取第一级分类
	(function(){
		if (!xu.verify._obj(json__categories)) {
			chcg = function(){} ;return ;
		}
		var start = 1;// 选项计数
		xu.array.each(json__categories['tree'],function(item){
			add_opt($eo('article-categorie').ele,item.name,item.id,start);
			start ++ ;
		});
	})();
	
});
</script>

 今天没有时间 抽出来了,下周抽出来 ... 我我我我

 

 

1
1
分享到:
评论
3 楼 vb2005xu 2009-12-21  
var json__categories = <?php echo $json__categories; ?> ;
//log(json__categories);

//查找分类
function findcg(id){
	var cg = null , hadFind = false;
	xu.array.each(json__categories['refs'],function(item,index){
		if (hadFind) return ;
		if (item.id == id)	cg = item ;
	});
	return cg ;
}
//改变分类
function chcg(o){ // o -> select
	if (!xu.verify._obj(o)) return ;
	//首先取得选中的id,,再查该id下是否存在子节点
	var cid = o.value;//log(cid);
	if (!cid) { // 缺省值时清空节点尾部所有select
		$eo(o).removeAfterAll();
		//设置categorie_id的 值,向左找相邻的且选中的分类项		
		var previousSlt = o.previousSibling;
		if (!previousSlt){
			$eo('categorie_id').ele.value = null ;
		}else {
			$eo('categorie_id').ele.value = previousSlt.options[previousSlt.selectedIndex].value ;
		}
		return ;
	}
	//在json中定位该id所对应的节点
	var categorie = findcg(cid);//log(categorie);	
	if (!categorie) return ;
	
	//设置categorie_id的 值
	$eo('categorie_id').ele.value = cid ;
	
	//每个节点只管理其直接子节点,存在'sons'说明有子节点,创建一个下拉框并追加到尾部
	if (categorie['sons']){
		//清空创建的子select对象		
		var subCategories = categorie['sons'];		
		$new_slt = $eo.create('select');		
		$new_slt.on('change',function(){
			// this <-> $new_slt
			chcg(this);
		});
		
		add_opt($new_slt.ele,'选择子分类','',0);		
		add_opts($new_slt.ele,subCategories,1);		
//		log($new_slt.ele.options);
		
		$eo(o).removeAfterAll().insertAfter($new_slt.ele);
		return $new_slt.ele ;
	}else {
		$eo(o).removeAfterAll();
	}
}
function add_opt(slt_obj,opt_txt,opt_value,index){
	slt_obj.options[index] = new Option(opt_txt,opt_value);
}
function find_opt(slt_obj,opt_value){
	var len = slt_obj.options.length;
	for (var i=0; i < len; i++)
		if (slt_obj.options[i].value == opt_value)
			return slt_obj.options[i] ;
}

function clear_opts(slt_obj){
	// 原有选项计数
	var len = slt_obj.options.length;
	for (var i=0; i < len; i++)
		slt_obj.options[0] = null;// 移除当前选项
}
function add_opts(slt_obj,categories,start,slted_value,callback){
	if (slt_obj && slt_obj['options'] && xu.verify._obj(categories)){
		clear_opts(slt_obj); //清除原
		add_opt(slt_obj,'选择子分类','',0);
		
		var start = start || 1 ;// 选项计数		
		xu.array.each(categories,function(item){
			add_opt(slt_obj,item.name,item.id,start);
			start ++ ;
		});
		var opt = find_opt(slt_obj,slted_value);
		if (opt){
			opt.selected = true ;
		}
	}
}
function trigger_opt(slt_obj,slted_value,callback){
	//触发事件
	var opt = find_opt(slt_obj,slted_value);
	if (opt){
		opt.selected = true ; 
		return chcg(slt_obj);//log("选中的opt: ",opt);
	}
}

xu.ready(function(){
	//设置分类的项 -- 首先设置初值项,取第一级分类
	(function(){
		if (!xu.verify._obj(json__categories)) {
			chcg = function(){} ;return ;
		}
		
		//构建顶级分类,然后根据选择构建子级的slt<向右>
		add_opts($eo('categorie').ele,json__categories['tree'],1);	
		
		//文章修改模式 先构建自身slt,然后构建父级的slt<向左>
		if ($eo('categorie_id').ele.value && (this_ctg = findcg($eo('categorie_id').ele.value))){			
			//查当前节点的父节点
			var up_ctgs = [] ;			
			do {
				up_ctgs.push(this_ctg);//从里到外,级别递增
				this_ctg = findcg(this_ctg['parent_id']);
			}while(this_ctg) ;
			
			// 数组长度>1,不处于顶级;<=1,处于顶级
			var slt_obj = $eo('categorie').ele ;
			do {
				var item = up_ctgs.pop();
				slt_obj = (item) ? trigger_opt(slt_obj,item.id) : null;					
			}while(slt_obj) ;
		}
	})();
	
});
2 楼 vb2005xu 2009-12-21  
var callback = (callback && xu.verify._func(callback))? callback : function(){} ;
1 楼 vb2005xu 2009-12-21  
修正版,解决所有可能出现的问题:
var json__categories = <?php echo $json__categories; ?> ;
//log(json__categories);

//查找分类
function findcg(id){
	var cg = null , hadFind = false;
	xu.array.each(json__categories['refs'],function(item,index){
		if (hadFind) return ;
		if (item.id == id)	cg = item ;
	});
	return cg ;
}
//改变分类
function chcg(o){ // o -> select
	if (!xu.verify._obj(o)) return ;
	//首先取得选中的id,,再查该id下是否存在子节点
	var cid = o.value;//log(cid);
	if (!cid) { // 缺省值时清空节点尾部所有select
		$eo(o).removeAfterAll();
		//设置categorie_id的 值,向左找相邻的且选中的分类项		
		var previousSlt = o.previousSibling;
		if (!previousSlt){
			$eo('categorie_id').ele.value = null ;
		}else {
			$eo('categorie_id').ele.value = previousSlt.options[previousSlt.selectedIndex].value ;
		}
//		log($eo('categorie_id').ele.value);
		return ;
	}
	//在json中定位该id所对应的节点
	var categorie = findcg(cid);//log(categorie);	
	if (!categorie) return ;
	
	//设置categorie_id的 值
	$eo('categorie_id').ele.value = cid ;
//	log('选择的文章分类: ' , $eo('categorie_id').ele.value);
	
	//每个节点只管理其直接子节点,存在'sons'说明有子节点,创建一个下拉框并追加到尾部
	if (categorie['sons']){
		//清空创建的子select对象		
		var subCategories = categorie['sons'];		
		$new_slt = $eo.create('select');		
		$new_slt.on('change',function(){
			// this <-> $new_slt
			chcg(this);
		});
		
		add_opt($new_slt.ele,'选择子分类','',0);
		
		add_opts($new_slt.ele,subCategories,1);		
//		log($new_slt.ele.options);
		
		$eo(o).removeAfterAll().insertAfter($new_slt.ele);
		return $new_slt.ele ;
	}else {
		$eo(o).removeAfterAll();
	}
}
function add_opt(slt_obj,opt_txt,opt_value,index,slted){
	slt_obj.options[index] = new Option(opt_txt,opt_value);
	var slted = slted || false;
	if (slted){
		slt_obj.options[index].selected = slted ;
		return slt_obj.options[index] ;
	}
}
function find_opt(slt_obj,opt_value){
	var len = slt_obj.options.length;
	for (var i=0; i < len; i++)
		if (slt_obj.options[i].value == opt_value)
			return slt_obj.options[i] ;
}

function clear_opts(slt_obj){
	// 原有选项计数
	var len = slt_obj.options.length;
	for (var i=0; i < len; i++)
		slt_obj.options[0] = null;// 移除当前选项
}
function add_opts(slt_obj,categories,start,slted_value,callback){
	if (slt_obj && slt_obj['options'] && xu.verify._obj(categories)){
		clear_opts(slt_obj); //清除原
		add_opt(slt_obj,'选择子分类','',0);
		
		var start = start || 1 ;// 选项计数
		var callback = callback || function(){} ;
		xu.array.each(categories,function(item){
			var opt = add_opt(slt_obj,item.name,item.id,start,slted_value == item.id);
			if (opt){				
				callback(slt_obj);
			}
			start ++ ;
		});
	}
}
function trigger_opt(slt_obj,slted_value){
	//触发事件
	var opt = find_opt(slt_obj,slted_value);
	if (opt){
		opt.selected = true ; 
		return chcg(slt_obj);//log("选中的opt: ",opt);
	}
}

xu.ready(function(){
	//设置分类的项 -- 首先设置初值项,取第一级分类
	(function(){
		if (!xu.verify._obj(json__categories)) {
			chcg = function(){} ;return ;
		}
		
		//构建顶级分类,然后根据选择构建子级的slt<向右>
		add_opts($eo('categorie').ele,json__categories['tree'],1);	
		
		//文章修改模式 先构建自身slt,然后构建父级的slt<向左>
		if ($eo('categorie_id').ele.value && (current_categorie = findcg($eo('categorie_id').ele.value))){			
			//查当前节点的父节点
			var parent_categories = [] ;
			
			var parent_categorie = findcg(current_categorie['parent_id']);
			while(parent_categorie) {				
				parent_categories.push(parent_categorie);//从里到外,级别递增
				parent_categorie = findcg(parent_categorie['parent_id']);
			}
			
			// 数组长度>0,不处于顶级;<0,处于顶级
			var item = (parent_categories.length) ? parent_categories.pop() : current_categorie;
			var slt_obj = trigger_opt($eo('categorie').ele,item.id);
			if (slt_obj){//不处于顶级,触发事件会返回新建的slt对象
				while((item = parent_categories.pop())){
					slt_obj = trigger_opt(slt_obj,item.id);
				}
				//选中自身
				trigger_opt(slt_obj,current_categorie.id);
			}
		}
	})();
	
});

相关推荐

    js+xml生成级联下拉框代码.docx

    以下是一个基于JavaScript和XML实现级联下拉框的详细步骤: 首先,我们需要一个XML文件来存储级联数据,例如`regions.xml`。这个文件包含省份和城市的数据,结构如下: ```xml 省份1"&gt; 城市11"/&gt; 城市12"/&gt; ...

    php框架thinkphp实现js(ajax)无限添加级联下拉框

    这个例子中的"php框架thinkphp实现js(ajax)无限添加级联下拉框"是关于如何利用ThinkPHP和JavaScript(AJAX)技术来创建一个动态的、可以无限级联的下拉菜单系统。下面我们将深入探讨这一主题。 1. **ThinkPHP框架...

    级联下拉框效果 jquery

    实现级联下拉框效果,我们通常需要两个或多个`&lt;select&gt;`元素,并通过JavaScript监听第一个下拉框的`change`事件。当用户更改选择时,触发事件处理函数,根据选定的值动态更新第二个下拉框的选项。 以下是一个简单的...

    好用简单的可编辑级联下拉框

    "好用简单的可编辑级联下拉框"就是一个旨在提升用户体验的组件,它将传统的静态下拉框与级联选择功能相结合,并引入了编辑能力,使得用户在选择过程中能够更加灵活和高效。 首先,我们要理解什么是“可编辑下拉框”...

    Android城市级联下拉框(自定义Spinner)

    在Android开发中,有时我们需要实现一个城市级联选择的功能,比如选择省份后,根据省份自动更新市、区的选项。这种效果通常通过自定义Spinner来完成。Spinner是Android中的一个下拉选择控件,它提供了用户友好的交互...

    超简单的级联下拉框例子

    当用户在第一个下拉框中选择一个选项时,通过JavaScript事件监听器触发一个函数,该函数根据所选值动态生成并插入第二个下拉框的选项。这可能涉及到查找特定的DOM节点,创建新的`&lt;option&gt;`元素,并将它们添加到第二...

    excel 级联下拉框用法

    在Excel中,级联下拉框是一种非常实用的功能,它允许用户在选择一个选项后,根据该选项自动显示相关的次级选项。这种交互方式在数据输入时能够保持数据的一致性和准确性,尤其适用于多级分类的数据管理。在本教程中...

    layui-级联下拉框-可配置开启多选-HTML源码

    级联下拉框是一种常见的UI组件,它允许用户在一个下拉框的选择基础上动态加载并显示另一个相关的下拉框,这种联动效果在数据筛选、地区选择等场景中非常常见。 1. HTML基础: HTML(HyperText Markup Language)...

    无限极级联下拉框的封装

    3. 递归级联:为了实现无限级联,我们需要在填充完一个下拉框后,监听这个新下拉框的改变事件,然后重复以上过程。这里的关键是确保每次级联都是基于当前下拉框的选中值,而不是最初的父级下拉框。 ```javascript ...

    Ext combo 下拉框级联

    在IT领域,级联下拉框(Cascading Dropdown)是一种常见的用户界面设计,它用于在两个或更多下拉框之间建立关联关系。在这种设计中,一个下拉框的选项会根据用户在另一个下拉框中的选择动态更新。这种功能在数据筛选...

    AJAX级联下拉框源码

    AJAX级联下拉框是一种常见的前端交互设计,它利用Ajax技术实现在用户选择一个下拉选项时,动态地更新另一个相关联的下拉框内容。这种功能在数据关联、筛选和表单填写中非常常见,例如省份和城市的选择,类别和子类别...

    ajax实现可配置无刷新级联下拉框

    级联下拉框允许用户在一个下拉框中选择一个选项后,根据所选的选项动态更新另一个下拉框的选项。Ajax 技术可以实现这种功能,而无需每次更改时都重新加载整个页面,从而提高应用性能。 Ajax(Asynchronous ...

    jQuery实现级联下拉框实战(5)

    在本文中,我们将探讨如何使用jQuery实现级联下拉框的效果,这是一个常见的前端交互功能,常用于数据筛选和表单填写。级联下拉框允许用户在一个下拉框中做出选择后,根据所选内容动态更新下一个下拉框的选项。这种...

    仿美团网团购搜索级联下拉框DEMO

    2. **级联下拉框**: 级联下拉框是一种交互设计,它允许用户在一个下拉框的选择基础上,打开另一个相关的下拉框,形成一种递进的筛选过程。例如,用户先选择城市,接着在选择的城市基础上展示相应的商圈或者类别。...

    layui-级联-多选下拉框.rar

    layui的插件效果,优化基础layui的原装组件的效果。 layui 是一款采用自身模块规范...其外在极简,却又不失饱满的内在,体积轻盈,组件丰盈,从核心代码到 API 的每一处细节都经过精心雕琢,非常适合界面的快速开发。

    动态级联下拉框构件

    动态级联下拉框构件是一种常见的前端交互组件,主要用于实现多级联动选择的效果。在网页设计中,这种组件常用于地址选择、分类筛选等场景,用户在选择一级选项后,二级甚至多级相关的下拉框内容会随之更新,提供更...

    使用JQuery实现漂亮的三级级联下拉框

    要实现级联下拉框,我们需要监听第一个下拉框的`change`事件,并根据其值来填充第二个下拉框,同样的逻辑也应用于第二个下拉框与第三个下拉框之间。 在HTML结构中,通常每个下拉框会被赋予一个唯一的ID,以便在...

    级联下拉框(支持火狐和IE)

    级联下拉框是一种常见的用户界面元素,常用于在网页或应用程序中提供多级选择功能。在.NET框架中,实现这种交互通常涉及到HTML、CSS、JavaScript(如jQuery)以及服务器端的技术,例如ASP.NET。本示例可能是一个...

    省市地区 局部刷新 级联下拉框

    在ASP.Net开发中,"省市地区 局部刷新 级联下拉框"是一个常见的需求,它涉及到前端用户界面的交互以及后端数据的动态加载。局部刷新技术可以提高用户体验,因为它仅更新页面的特定部分,而不是整个页面,这在处理...

    省份-市-区及镇街道级联下拉框加载

    内部为四级的级联下拉框,分别为省份,市,县及区和镇及街道四级下拉框;(适用任何语言的纯HTML)详细截图可访问:https://blog.csdn.net/weixin_43972758/article/details/86510419 进行查询。

Global site tag (gtag.js) - Google Analytics