日期:2014-05-16 浏览次数:20418 次
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script>
/**
* @description js与DOM结合的无限级下拉
* @Copy-Right: All Free
* @author zjstandup@126.com
* @version beta 1
* 全国省市两级数据在IE6中测试内存消耗不断增长,火狐下不会
* 有优化方式麻烦联系作者,谢谢
*/
function infinity(){
this.selectWidth = '100px'; //下拉表的宽度
this.selectSize = 0; //下拉表显示的行数
//初始化
this.init = function( objDiv, objTarget, id){
this.objDiv = objDiv; //要挂载SELECT元素的对象
this.objTarget = objTarget; //分类数组,格式为: target[id] = [parent_id, 'cate_name']; 顶级分类的parent_id为0
this.recursion( id); //向上递归,选中默认的值
this.next( id); //如果还有子类
}
this.recursion = function ( id){
var select = this.mkselect(); //创建一个SELECT元素
select.options.add( this.mkoption()); //附加一个'请选择'下拉
//如果是上一级,则要附加在最前边,与next想反
this.objDiv.lastChild ? this.objDiv.insertBefore(select, this.objDiv.firstChild) : this.objDiv.appendChild( select);
for(var i in this.objTarget){
//如果没有默认值则选中顶级分类
if( (id&&this.objTarget[i][0] == this.objTarget[id][0])||(!id&&this.objTarget[i][0]==0)){
var option = this.mkoption(i, this.objTarget[i][1])
select.options.add( option);
option.selected = (i==id) ? 'selected' : '';
}
}
//如果上级分类不为0,向上递归
if( id && this.objTarget[id][0] !=0 ){
this.recursion( this.objTarget[id][0])
}
}
this.mkselect = function (){
var objThis = this;
var obj = document.createElement('select');
obj.size = this.selectSize;
obj.style.width = this.selectWidth;
//CHANGE事件,改变下拉表,则清除子分类下拉,闭包?内存泄漏?
function change(){
while( obj.nextSibling)
{
typeof(obj.nextSibling.detachEvent)!='undefined' ? obj.nextSibling.detachEvent('onchange', change) : obj.nextSibling.removeEventListener('change', change, false);
obj.nextSibling.parentNode.removeChild( obj.nextSibling);
}
objThis.next( obj.value);
} <