这几天一直在用Ajax实现添加一个简历的功能,由于不熟悉js和ajax,就这个页面做了3天和二个通宵,呵呵.以下是这几天的收获:
1. 如果想通过name获取控件,如: var comName = document.getElementsByName("txtComName");那么标识有runat="server"的控件,是获取不到值的. 在cs文件里,通过Request.Form("txtComName")也获取不到,去掉runat="server"就可以了.
如果想通过id获取控件,如:var comName = document.getElementsById("txtComName");不管有没有runat="server"都能获取得到.
2. 在cs文件里,通过Request.Form("txtComName")可以获取所有name是txtComName文本框的值,多个文本框的值是用","连接的.
3. 给Select添加下拉值
function FillMonth(aa_month)
{
for(var j=0; j<aa_month.length;j++)
{
for(var i=1;i<13;i++)
{
var oOption = document.createElement("option");
oOption.text = i;
oOption.value = i;
aa_month[j].add(oOption);
}
}
}
4.点击按钮添加同样一个<div>的内容,这样写
function addTextBox()
{
var txt = " <div><input type=/"text/" name=/"txt1/" /><select name=/"Select1/"></select></select>";
txt = txt+ "</div>";
var obj = document.getElementById("divEdu");
var html = obj.innerHTML;
obj.innerHTML = html + txt;
}
5. txt = "<select name=/"Select1/">";给name加个变量,txt就得这样写txt = "<select name=/"Select1" + num + "/">";
6. 想实现这样的功能:在服务端点击按钮,插入数据后,在客户端得到返回最新的Id.(页面的上半部分在服务端运行,下半部分在客户端运行).
在Button事件里这样写,可以将服务端的值传到客户端,调用客户端的方法 Page.ClientScript.RegisterStartupScript( typeof( string ), "aa", "provinceSelect('" + strProvince + "','" + strCity + "');", true );
在客户端可以得到最新Id的,但是下半部分的客户端数据就丢失了.
如果不写在button事件里,在一个服务端的方法里写,但又得不到在DataList中CheckBox选中的值
两种解决方案:
第一种:全在服务端得到数据,用Request.Form();另一种就全在客户端得到数据,用js.
我选择在客户端得到数据.但又有了新的问题:DataList运行后的Html代码是这样的:(只有checkBox控件,数据绑定在Text上)<label for=ma__chk>aaaa</label><input id="ma__chk" type="checkbox" name="ma$chk" />
想了很多办法,可以用innerText得到"aaaa",但无法将label的for跟input的Id联系起来.后来在DataList里用label加checkBox的方式,运行后的html代码就变成这样了:<span id="ma_labMa">挖掘机</span><input id="ma_chkMa" type="checkbox" name="mac$chkMa" />
这样就能得到span的Id和input的id,并且还能联系起来,整个代码如下(先得到Table,再得到Tr,Td,span,input):
var mylist=document.getElementById("machineList");
var machine = "";
for (i=0; i<mylist.childNodes.length; i++)
{
var tr=mylist.childNodes[i]; //得到TR
for(j=0;j<tr.childNodes.length; j++)
{
var td=tr.childNodes[j]; //得到TD
for(x=0;x<td.childNodes.length;x++)
{
var ss = td.childNodes[x];
var count = 0;
for(y=0;y<ss.childNodes.length;y++)
{
count++;
if(count==1)
{
var spanMa = ss.childNodes[1].id; //得到span的ID
var index = spanMa.lastIndexOf("_");
var span_id = spanMa.substring(0,index);
var checkMa = ss.childNodes[3].id; //得到input的ID
var indexCh = checkMa.lastIndexOf("_");
var check_id = checkMa.substring(0,indexCh);
if(span_id == check_id)
{
if(ss.childNodes[3].checked) //如果相等并且checkBox被选中
{
machine= machine + ss.childNodes[1].innerText + ",";
}
}
}
}
}
}
}
7. 页面中的年月没有用日历控件,用的是数组绑定的.开始日期,就有两个同样的年和月.刚开始时,我把所以的年和月的name都命名为select1和select2,这样
只有一个工作经历时,没问题,但添加多个以后,年月的下拉列表就出现了很多重复的.只好改成select1+num这样的形式了.
代码如下:
var beginDate;
var endDate;
if(i==0)
{
year = document.getElementsByName("select2");
month = document.getElementsByName("select3");
}
else
{
year = document.getElementsByName("select2"+num);
month = document.getElementsByName("select3"+num);
}
//年份
var year_index;
//第一个select2
year_index = year[0];
for(var j = 0; j<year_index.length;j++)
{
//开始年份
if(year_index.options[j].selected)
{
beginDate = year_index.options[j].text;
}
}
//第二个select2
year_index = year[1];
for(var j = 0; j<year_index.length;j++)
{
//结束年份
if(year_index.options[j].selected)
{
endDate = year_index.options[j].text;
}
}
//月份
var month_index;
//第一个select3
month_index = month[0];
for(var j = 0; j<month_index.length;j++)
{
//开始月份
if(month_index.options[j].selected)
{
beginDate = beginDate + "-" + month_index.options[j].text;
}
}
//第二个select3
month_index = month[1];
for(var j = 0; j<month_index.length;j++)
{
//结束月份
if(month_index.options[j].selected)
{
endDate = endDate + "-" + month_index.options[j].text;
}
}
8.客户端调用服务端的方法
pageLoad: Ajax.Utility.RegisterTypeForAjax( typeof( Admin_Admin_AddResume ) );
html: Admin_Admin_AddResume.addValue(strApply,strEdu,strJob);