一.来看下数据数据解析
首先后台先生成一种数据格式,这种格式跟JSON差不多(不知道为什么不用JSON),查看HTML源代码
ComboBox2.Data = [[['Text','a'],['Value','b']],[['Text','b'],['Value','c']],[['Text','c'],['Enabled',0],['Value','b']],[['CssClass','comboItemHover'],['Text','d'],['Value','c'],['Id','ComboBoxItem1']],[['Text','a'],['Value','b']],[['Text','b'],['Value','c']],[['Text','c'],['Enabled',0],['Value','b']],[['CssClass','comboItemHover'],['Text','d'],['Value','c'],['Id','ComboBoxItem2']],[['Text','a'],['Value','b']],[['Text','b'],['Value','c']],[['Text','c'],['Enabled',0],['Value','b']],[['CssClass','comboItemHover'],['Text','d'],['Value','c'],['Id','ComboBoxItem3']],[['Text','a'],['Value','b']],[['Text','b'],['Value','c']],[['Text','c'],['Enabled',0],['Value','b']],[['CssClass','comboItemHover'],['Text','d'],['Value','c'],['Id','hello']]];
2.需要定义一个ComboBoxItem对象(自然要定义数据集合类型了),其中js也要定义,数据结构采用HashTable,查找速度快.其中定义了一个JavaScriptArray用来转换数据
3.前台处理数据
数据得到以后就要处理
前段的ComboBox(Initialize)初始化时会调用Render方法,Render方法会调用RenderDropDown方法,RenderDropDown方法调用RenderItem方法,把每项都呈现出来
二.展开下拉框
看这部分花了我一些时间.
本来的话展开下拉框和关闭下拉框只需要设置一个css样式就可以了的.事情上确实可以这么做.
ComboBox同时还提供了2个属性CollapseSlide用于设置滑动效果,CollapseDuration用于设置滑动效果的持续时间.
客户端api提供了Collapse和Expand方法,用于关闭和展开下拉框.按照我的思维就是直接设置下xx.style.display="none"了事.这样就可以用了.为了给控件加上滑动时的效果.这个两个方法基本没做什么.而是调用了相关的方法如ComponentArt_ComboBox_CollapseStep方法.
这里涉及到递归的使用.在Collapse方法中设置了一个当前时间this.CollapseStartTime=(new Date()).getTime();
然后ComponentArt_ComboBox_CollapseStep方法再获取现在时间与CollapseStartTime相比较,时间差与CollapseDuration属性相比较.当时间差达到CollapseDuration属性值时,即递归结束.
看代码
1.
ComponentArt_ComboBox.prototype.Collapse=function (){
if(this.Resizing){
return ;
}
var _20=document.getElementById(this.Id+"_DropDown");
if(_20&&_20.style.display!="none"){
_20.style.overflow="hidden";
this.CollapseElement=_20;
//设置当前时间
this.CollapseStartTime=(new Date()).getTime();
var _21=_qFF(_20);
//递归调用
ComponentArt_ComboBox_CollapseStep(this,_21);
//_20.style.display="none";
}
this.Expanded=false;
};
if(this.Resizing){
return ;
}
var _20=document.getElementById(this.Id+"_DropDown");
if(_20&&_20.style.display!="none"){
_20.style.overflow="hidden";
this.CollapseElement=_20;
//设置当前时间
this.CollapseStartTime=(new Date()).getTime();
var _21=_qFF(_20);
//递归调用
ComponentArt_ComboBox_CollapseStep(this,_21);
//_20.style.display="none";
}
this.Expanded=false;
};
2.
window.ComponentArt_ComboBox_CollapseStep = function(_d, _e) {
if (!_d.CollapseElement) {
return;
}
var _f = (new Date()).getTime()-_d.CollapseStartTime;
var _10 = ComponentArt_SlidePortionCompleted(_f, _d.CollapseDuration, _d.CollapseSlide);
if (_10 == 1) {
//alert(_d.CollapseElement.style.height);
//_d.CollapseElement.style.height = 280+"px";
//隐藏
_d.CollapseElement.style.display = "none";
_d.CollapseElement = null;
_d.HideOverlay();
var _11 = _d.get_events().getHandler("collapse");
if (_11) {
_11(_d, Sys.EventArgs.Empty);
}
} else {
var _12 = Math.ceil((1-_10)*_e);
if (_d.ExpandDirection == 1) {
_d.CollapseElement.style.top = (_d.ExpandBaseLine-_12)+"px";
}
//高度的滚动在此更改
_d.CollapseElement.style.height = _12+"px";
//alert(_d.CollapseElement.style.height);
//递归调用
setTimeout("ComponentArt_ComboBox_CollapseStep("+_d.Id+","+_e+");", ComponentArt_ComboBox_SlideDelay);
}
//document.getElementById("aa").innerHTML+="_f---------"+_f+"_10-------"+_10+"-----------"+_d.CollapseElement.style.height+"<br>"
//alert("_10"+_10+"<br>"+_d.CollapseElement.style.height);
};
if (!_d.CollapseElement) {
return;
}
var _f = (new Date()).getTime()-_d.CollapseStartTime;
var _10 = ComponentArt_SlidePortionCompleted(_f, _d.CollapseDuration, _d.CollapseSlide);
if (_10 == 1) {
//alert(_d.CollapseElement.style.height);
//_d.CollapseElement.style.height = 280+"px";
//隐藏
_d.CollapseElement.style.display = "none";
_d.CollapseElement = null;
_d.HideOverlay();
var _11 = _d.get_events().getHandler("collapse");
if (_11) {
_11(_d, Sys.EventArgs.Empty);
}
} else {
var _12 = Math.ceil((1-_10)*_e);
if (_d.ExpandDirection == 1) {
_d.CollapseElement.style.top = (_d.ExpandBaseLine-_12)+"px";
}
//高度的滚动在此更改
_d.CollapseElement.style.height = _12+"px";
//alert(_d.CollapseElement.style.height);
//递归调用
setTimeout("ComponentArt_ComboBox_CollapseStep("+_d.Id+","+_e+");", ComponentArt_ComboBox_SlideDelay);
}
//document.getElementById("aa").innerHTML+="_f---------"+_f+"_10-------"+_10+"-----------"+_d.CollapseElement.style.height+"<br>"
//alert("_10"+_10+"<br>"+_d.CollapseElement.style.height);
};
3.
window.cart_slidetype_none=0;
window.cart_slidetype_exponentialaccelerate=1;
window.cart_slidetype_exponentialdecelerate=2;
window._q87=3;
window.cart_slidetype_quadraticaccelerate=4;
window.cart_slidetype_quadraticdecelerate=5;
/**
*
* @param {Object} 时间差
* @param {Object} 持续时间
* @param {Object} 效果
*/
window.ComponentArt_SlidePortionCompleted=function (_4a,_4b,_4c){
if(_4c==cart_slidetype_none||_4a>=_4b){
return 1;
}
var _4d=(_4c==cart_slidetype_exponentialaccelerate)||(_4c==cart_slidetype_quadraticaccelerate);
if(_4d){
_4a=_4b-_4a;
}
//4a(时间差计算)与_4b相比较
var _4e=_4a/_4b;
var _4f;
switch(_4c){
case _q87:
_4f=_4e;
break;
case cart_slidetype_exponentialdecelerate:
case cart_slidetype_exponentialaccelerate:
_4f=1-Math.pow(1/300,_4e);
break;
case cart_slidetype_quadraticdecelerate:
case cart_slidetype_quadraticaccelerate:
_4f=Math.pow(_4e,2);
break;
}
if(_4d){
_4f=1-_4f;
}
//document.getElementById("aa").innerHTML+=Math.min(Math.max(0,_4f),1)+"<br>";
return Math.min(Math.max(0,_4f),1);
};
window.cart_slidetype_exponentialaccelerate=1;
window.cart_slidetype_exponentialdecelerate=2;
window._q87=3;
window.cart_slidetype_quadraticaccelerate=4;
window.cart_slidetype_quadraticdecelerate=5;
/**
*
* @param {Object} 时间差
* @param {Object} 持续时间
* @param {Object} 效果
*/
window.ComponentArt_SlidePortionCompleted=function (_4a,_4b,_4c){
if(_4c==cart_slidetype_none||_4a>=_4b){
return 1;
}
var _4d=(_4c==cart_slidetype_exponentialaccelerate)||(_4c==cart_slidetype_quadraticaccelerate);
if(_4d){
_4a=_4b-_4a;
}
//4a(时间差计算)与_4b相比较
var _4e=_4a/_4b;
var _4f;
switch(_4c){
case _q87:
_4f=_4e;
break;
case cart_slidetype_exponentialdecelerate:
case cart_slidetype_exponentialaccelerate:
_4f=1-Math.pow(1/300,_4e);
break;
case cart_slidetype_quadraticdecelerate:
case cart_slidetype_quadraticaccelerate:
_4f=Math.pow(_4e,2);
break;
}
if(_4d){
_4f=1-_4f;
}
//document.getElementById("aa").innerHTML+=Math.min(Math.max(0,_4f),1)+"<br>";
return Math.min(Math.max(0,_4f),1);
};
看个截图
好了,结束