javascript动态控制服务器控件实例


Posted in Javascript onSeptember 05, 2014

最近多个页面需要加载一些下拉列表框,供用户选择,原来都是在服务器端进行加载应运用。最后由于业务逻辑方面的考虑,需要将DropDownList的部分功能放到客户端实现。现在下拉列表的功能使用起来感觉比全部放到服务器端性能好多了。

具体方法:

在页面中放入一个DropDownList控件,并添加一项,用来分析其产生的HTML代码,这样在使用js进行动态控制时,将会非常清晰其测试代码如下所示:

<asp:DropDownList ID="DropDownList1" runat="server">
<asp:ListItem>1</asp:ListItem>
</asp:DropDownList>

在浏览器中查看,并对Html进行分析:以下是DropDownList控件生成的HTML代码。和普通的select没

有区别。那么也就可以通过js来动态填充、删除、选择等控制。

<select name="DropDownList1" id="DropDownList1">
<option value="1">1</option>
</select>

可以将<asp:ListItem>1</asp:ListItem>删除,现在添加两个HTML button控件,分别用来实现添加选项,和删除所有选项。Button源码如下:

<input id="Button1" type="button" value="添加Option" onclick="addOption()" />

<input id="Button2" type="button" value="全部删除Option" onclick="delOption()" />

添加和删除函数如下所示:

function addOption(){

var ddlObj = document.getElementById("DropDownList1");//获取对象

if(ddlObj.length>0)

delOption();//先删除所有的,之后在添加 

var optText = new Array("founder","china","beijing");

var optValue = new Array("0","1","2");

var oOption = null;

for(var i=0;i<optText.length;i++){

oOption = new Option(optText[i],optValue[i]);

ddlObj.options.add(oOption);

}

}

function delOption(){

var ddlObj = document.getElementById("DropDownList1");//获取对象
for(var i=ddlObj.length-1;i>=0;i--){
ddlObj.remove(i);//firefox不支持ddlCurSelectKey.options.remove(),IE两种均支持
}
}

在浏览器中查看,可以轻松地创建选择下拉选项,由于这些是客户端生成,因此其效率上要高于服务器

端工作的代码。但是这个时候如果要使用DropDownList1.SelectedValue获取用户选择的选项,那么你会得

到一个错误。这是由于DropDownList是由JS动态添加的,因此,它的项不属于ViewState,并且不被维护,

也就是说我们无法在服务器端对其进行处理。为了解决这一问题,可以使用两种方式:1、Hidden控件保存

用户选项方式;2、Request.Form方式。(参见msdn品味Ajax)

1、我们在页面中添加一个Hidden控件,用它来保存DropDownList选项变化的信息,这样在用户选择感

兴趣的信息之后,我们就可以在服务器端获取信息,并进行处理,合理地实现客、服之间的分工。

对DropDownList控件添加一个onchange事件,此时它的html代码如下所示:

<asp:DropDownList ID="DropDownList1" runat="server" onchange="ResvItem()">
</asp:DropDownList>

Onchange事件如下所示,该事件主要保存用户选定的value:

function ResvItem(){
var objDdl = document.getElementById("DropDownList1");
document.getElementById("HiddenField1").value = objDdl.options[objDdl.selectedIndex].value;
}

在此之后,我们使用一个asp:button控件来测验结果:

protected void Button1_Click(object sender, EventArgs e)
{
Response.Write(HiddenField1.Value);
}

到此,已经完成了所有的工作,但是还有一个问题,DropDownList的change事件只有在用户改变下拉选

项时才会触发。因此,用户使用默认选项进行提交时,则获取空值。因此我们可以在填充option时,即对

hidden初始化。对addOption事件添加一行代码如下:

function addOption(){

var ddlObj = document.getElementById("DropDownList1");//获取对象

if(ddlObj.length>0)

delOption();//先删除所有的,之后在添加 

var optText = new Array("founder","china","beijing");

var optValue = new Array("0","1","2");
var oOption = null;

for(var i=0;i<optText.length;i++){

oOption = new Option(optText[i],optValue[i]);

ddlObj.options.add(oOption);

}
document.getElementById("HiddenField1").value = optValue[0];
}

不过以上红色部分在TT浏览器下ADD不成功,其他浏览还没试过,以下是另一个种写法:

function GetDeptList()
{
var ddlCityType = document.getElementById("ddlCityType");
var ddlPosition = document.getElementById("ddlPosition");
var v = ddlCityType.options[ddlCityType.selectedIndex];
//alert(v.value);

var DeptList=Guest_UserRegister.GetDeptList(v.value).value;

var deptList=new Array();
deptList=DeptList.split(';');
for(var i=0;i<deptList.length;i++)
{
if(deptList[i]!="")
{
var dept=deptList[i].split(',');
var opt = document.createElement("option"); 
opt.innerHTML = dept[1];
opt.value = dept[0];
ddlPosition.insertBefore(opt, ddlPosition.firstChild);
}
}
}
function DelOption()
{
var ddluserSchool = document.getElementById("ddluserSchool");
var num=ddluserSchool.length;
while(num>0)
{
for(var j=0;j<num;j++)
{
ddluserSchool.remove(j);
}
num=ddluserSchool.length;
}

}
function GetSchoolList()
{
DelOption();
var ddlProvince = document.getElementById("ddlProvince");
var ddluserSchool = document.getElementById("ddluserSchool");
var v = ddlProvince.options[ddlProvince.selectedIndex];
var DeptList=Guest_UserRegister.GetSchoolList(v.value).value;
var deptList=new Array();
deptList=DeptList.split(';');
for(var i=0;i<deptList.length;i++)
{
if(deptList[i]!="")
{
var dept=deptList[i].split(',');
var opt = document.createElement("option"); 
opt.innerHTML = dept[1];
opt.value = dept[0];
ddluserSchool.insertBefore(opt, ddluserSchool.firstChild);
}
}
}
Javascript 相关文章推荐
JavaScript的类型简单说明
Sep 03 Javascript
JavaScript 中的日期和时间及表示标准介绍
Aug 21 Javascript
原生javascript实现无间缝滚动示例
Jan 28 Javascript
JavaScript 学习笔记之语句
Jan 14 Javascript
实践中学习AngularJS表单
Mar 21 Javascript
JavaScript笔记之数据属性和存储器属性
Mar 31 Javascript
AngularJs表单验证实例详解
May 30 Javascript
jQuery AJAX timeout 超时问题详解
Jun 21 Javascript
JavaScript模板引擎Template.js使用详解
Dec 15 Javascript
详解Angular 4.x Injector
May 04 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
Jul 26 Javascript
js抽奖转盘实现方法分析
May 16 Javascript
setTimeout()递归调用不加引号出错的解决方法
Sep 05 #Javascript
jQuery动态创建html元素的常用方法汇总
Sep 05 #Javascript
jquery单行文字向上滚动效果的实现代码
Sep 05 #Javascript
Javascript保存网页为图片借助于html2canvas库实现
Sep 05 #Javascript
JavaScript立即执行函数的三种不同写法
Sep 05 #Javascript
JavaScript实现生成GUID(全局统一标识符)
Sep 05 #Javascript
JavaScript判断textarea值是否为空并给出相应提示
Sep 04 #Javascript
You might like
php is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
php入门学习知识点七 PHP函数的基本应用
2011/07/14 PHP
php4与php5的区别小结(配置异同)
2011/12/20 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
2019/09/30 PHP
Javascript 遍历对象中的子对象
2009/07/03 Javascript
JavaScript QueryString解析类代码
2010/01/17 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
node.js中的fs.lstat方法使用说明
2014/12/16 Javascript
详解JS正则replace的使用方法
2016/03/06 Javascript
JavaScript实现水平进度条拖拽效果
2017/01/18 Javascript
学习使用jQuery表单验证插件和日历插件
2017/02/13 Javascript
Javasript设计模式之链式调用详解
2018/04/26 Javascript
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[02:22]完美世界DOTA2联赛PWL S3 集锦第一期
2020/12/15 DOTA
[01:00:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第三场 1月10日
2021/03/11 DOTA
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
python在指定目录下查找gif文件的方法
2015/05/04 Python
python 匹配url中是否存在IP地址的方法
2018/06/04 Python
Anaconda的安装及其环境变量的配置详解
2020/04/22 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
印度购物网站:TATA CLiQ
2017/11/23 全球购物
咖啡厅创业计划书范本
2014/01/22 职场文书
运动会开幕式解说词
2014/02/05 职场文书
大学校务公开实施方案
2014/03/31 职场文书
大学生毕业求职信
2014/06/12 职场文书
担保书范文
2015/01/20 职场文书
在酒桌上的敬酒词
2015/08/12 职场文书
妇产科护理心得体会
2016/01/22 职场文书
Nginx的gzip相关介绍
2022/05/11 Servers
详解CSS中postion和opacity及cursor的特性
2022/08/14 HTML / CSS