效果:当鼠标指向一个链接,鼠标右下方会显示该网页截图。在留言功能上尤其好用,当鼠标停在名字上,就可预览到留言者的网页缩略图,唯一不好的就是只显示目标网站的首页。 阅读全文>>
完整的GridPanel也有了,我现在需要将它组装到后台管理中去。现在要求点击一下左边Tree中的“人员信息”节点,右边的TabPanel就显示出与之对应的GridPanel。最简单的方法就是在TabPanel的html属性(应该可以这么叫吧)中使用iframe来打开另一个用于显示GridPanel的页面,相关代码如下:
var c1=new Ext.tree.TreeNode({ id:'c1', text:'人员信息', listeners:{ 'click':function(node, event) { event.stopEvent(); var n = tab.getComponent(node.id); if (!n) { //判断是否已经打开该面板 n = tab.add({ 'id':node.id, 'title':node.text, closable:true, //通过html载入目标页 html:'<iframe scrolling="auto" frameborder="0" width="100%" height="100%" src="UserListGridPanel.jsp"></iframe>' }); } tab.setActiveTab(n); } } });
这种做法虽然很简单,但是又带来两个问题:
1.页面会刷新
2.UserListGridPanel.jsp页面中也必须加载庞大的ExtJS库
当然也有办法解决了,可以使用autoLoad来解决。修改上面的代码:
var c1=new Ext.tree.TreeNode({ id:'c1', text:'人员信息', listeners:{ 'click':function(node, event) { event.stopEvent(); var n = tab.getComponent(node.id); if (!n) { //判断是否已经打开该面板 n = tab.add({ 'id':node.id, 'title':node.text, closable:true, //自动载入UserListGridPanel.jsp页面,该页面含有JavaScript,不缓存 autoLoad:{url:'UserListGridPanel.jsp',scripts:true,nocache:true} }); } tab.setActiveTab(n); } } });
用了之后我又头大了,正常的话应该是如图下图所示。

可现在得到的却是下面这种结果。

想来想去,改来改去,最后我猜想应该是渲染的时候出问题了,上面两种方式中UserListGridPanel的renderTo属性一直都是Ext.getBody(),可是显示结果却不一样,也就是说两种情况下的Ext.getBody()不是同一个对象(OOP习惯了,什么都是对象O(∩_∩)O哈哈~)。第一种方式中Ext.getBody()指的就UserListGridPanel.jsp,而第二种方式中Ext.getBody()指的则是main.jsp。
于是试着在UserListGridPanel.jsp中创建一个id为“UserListGridPanel”的div,然后修改rederTo属性为Ext.get(‘UserListGridPanel’),看来猜的没错,这样改确实可以。可是页面又变成下面这样了:

我快抓狂了…
再次把JS翻来覆去的改了N遍,得到的结果还是那样…
可是单独运行UserListGridPanel.jsp却是正常的啊!突然想到了点什么,上面不是说用autoLoad时,被载入的页面中可以不用再载入ExtJS库吗?而我现在的UserListGridPanel.jsp中还载入了ExtJS库,会不会和main.jsp中的发生冲突了?
结果当然不言而喻了。
昨天的GridPanel虽说较为完整了,不过却缺少了数据分页功能。今天又对其再次改进,使其可以进行数据分页。改动不是很大,只是对UserListGridPanel的数据源进行了修改并增加了分页条。

UserListGridPanel = Ext.extend(Ext.grid.GridPanel,{ //初始化数据添加组件和数据修改组件 insertWin:new InsertUserInfoWindow(), updateWin:new UpdateUserInfoWindow(), constructor:function(){ //数据源 this['store'] = new Ext.data.Store({ url:UserListGridPanel.ACT_URL, reader:new Ext.data.JsonReader({ root:'rows', totalProperty:'count' }, Ext.data.Record.create([ 'UId','UName','UTrueName','UPassword' ])) }), UserListGridPanel.superclass.constructor.call(this,{ //将该列表渲染到网页的body中 renderTo:Ext.getBody(), autoHeight:true, bbar:new Ext.PagingToolbar({ pageSize:10,//每页数据大小 store:this.store }), width:300, tbar:[{ text:'添加人员', handler:function(){ this.insertWin.show(); }, scope:this },'-',{ text:'修改人员', handler:function(){ this.updateWin.show(); try{ this.updateWin.load(this.getSelected()); }catch(err){ Ext.Msg.alert('系统提示',err.description); this.updateWin.close(); } }, scope:this },'-',{ text:'删除人员', handler:function(){ Ext.Msg.confirm('警告','删除是不可逆的,是否确定删除?',function(btn){ if(btn == 'yes'){ this.remove(); } },this); }, scope:this }], //列模式 colModel:new Ext.grid.ColumnModel([{ align:'center', header:'用户名', dataIndex:'UName', menuDisabled:true },{ align:'center', header:'真实姓名', dataIndex:'UTrueName', menuDisabled:true },{ align:'center', header:'密码', dataIndex:'UPassword', menuDisabled:true }]), loadMask:{msg:'数据加载中...'}, //选择模式 selModel:new Ext.grid.RowSelectionModel({ singleSelect:true,//只可单选 listeners:{ 'rowselect':{ fn:function(sel,index,r){ this.fireEvent('rowselect',r); }, scope:this } } }) }); //数据加载事件,向服务器递交查询参数,这里每次查询10条数据 this.getStore().load({params:{start:0,limit:10}}); this.insertWin.on('submit',this.onInsertWinSubmit,this); this.updateWin.on('submit',this.onUpdateWinSubmit,this); this.addEvents('rowselect'); }, getSelected:function(){ var sm = this.getSelectionModel(); if(sm.getCount() == 0) throw Error('您尚未选中任何人员记录!'); return sm.getSelected(); }, insert:function(r){ this.getStore().add(r); }, update:function(r){ //更改本地数据 var sr = this.getSelected(); for(var i in sr.data){ sr.set(i,r.get(i)); } //提交更改 sr.commit(); }, //使用AJAX方式删除数据库及数据列表中的选中数据 remove:function(){ try{ var rc = this.getSelected(); Ext.Ajax.request({ url:'user.do?action=delUser', params:rc.data }); this.getStore().remove(rc); }catch(err){ Ext.Msg.alert('警告',err.description); } }, onInsertWinSubmit:function(win,r){ //向列表中插入新数据 this.insert(r); }, onUpdateWinSubmit:function(win,r){ //修改列表中选中的数据 this.update(r); } });
O(∩_∩)O哈哈~终于搞定了,昨天的那些错误也不知道什么原因,后面写着写着就又好了。而且昨天那个仅仅只是读取了数据库的数据,今天这个加上了对数据库的增删改,目前尚未发现任何BUG,加上了不是很详细的注释O(∩_∩)O~,现在这个算是最终的完整版了,今后要实现其他的功能就只需要照着这个来扩充了。
/*********************基础表单,作为新增、修改表单的父类*****************************/ UserInfoFormPanel = Ext.extend(Ext.form.FormPanel,{ constructor:function(cfg){ //将子类所传递的属性参数应用于父类 if(cfg != null){ Ext.apply(this,cfg); } UserInfoFormPanel.superclass.constructor.call(this,{ frame:true,//边框样式 autoHeight:true,//自适应高度 baseCls:'x-plain',//底色与父窗体相同 defaultType:'textfield',//默认类型为文本框 defaults:{allowBlank:false},//默认不允许任何栏位为空 labelWidth:55,//标签宽度 items:[{ inputType:'hidden', name:'UId', allowBlank:true },{ fieldLabel:'用户名', blankText:'用户名不能为空!', name:'UName' },{ fieldLabel:'真实姓名', blankText:'真实姓名不能为空!', name:'UTrueName' },{ fieldLabel:'密码', inputType:'password', blankText:'密码不能为空!', name:'UPassword' }] }); this.addEvents('submit');//声明事件 }, //具体事件操作 submit:function(){ if(this.url != ""){ if(this.getForm().isValid()){ //若表单栏位验证通过,则进行提交 this.getForm().submit({ url:this.url, success:this.onSubmit,//若服务器返回提交成功提示,则调用onSubmit方法 waitTitle:'数据提交', waitMsg:'数据提交中,请稍候...', scope:this }); }else{ Ext.Msg.alert('提示','表单验证失败!'); } } }, //获取表单数据方法 getValues:function(){ if(this.getForm().isValid()){ return new Ext.data.Record(this.getForm().getValues()); }else{ throw Error('表单验证失败!'); } }, //表单数据载入方法 setValues:function(r){ this.getForm().loadRecord(r); }, //表单重置方法 reset:function(){ this.getForm().reset(); }, //触发声明的事件并传递相关参数 onSubmit:function(form,action){ this.fireEvent('submit',this,action,this.getValues()); } }); /********************将表单置于窗口中***********************/ UserInfoWindow = Ext.extend(Ext.Window,{ form:null, url:'', constructor:function(cfg){ Ext.apply(this,cfg); //带参构造 this.form = new UserInfoFormPanel({url:this.url}); UserInfoWindow.superclass.constructor.call(this,{ plain:true, autoHeight:true, width:250, items:this.form, buttonAlign:'center', closeAction:'hide', modal:true, buttons:[{ text:'确定', handler:this.onSubmitClick, scope:this },{ text:'取消', handler:this.onCancelClick, scope:this }] }); //声明事件 this.addEvents('submit'); //当触发submit事件后执行onSubmit this.form.on('submit',this.onSubmit,this); }, //窗口关闭 close:function(){ this.form.reset(); this.hide(); }, //提交表单 onSubmitClick:function(){ this.form.submit(); }, //取消操作 onCancelClick:function(){ this.close(); }, //触发submit事件并传递相关参数 onSubmit:function(form,action,values){ try{ this.fireEvent('submit',this,values); }catch(err){ return; } this.close(); } }); /*********************数据添加窗口*************************/ InsertUserInfoWindow = Ext.extend(UserInfoWindow,{ //窗口标题 title:'添加人员', url:'user.do?action=addUser', //重写父类的onSubmit方法,用于将新增数据的id与该数据作为一条记录添加进GridPanel。 onSubmit:function(form,action,values){ var data = values.data; Ext.apply(data,{id:action.result.id}); try{ this.fireEvent('submit',this,new Ext.data.Record(data)); }catch(err){ Ext.Msg.alert('提示',err.description); return; } this.close(); } }); /*********************数据修改窗口**********************/ UpdateUserInfoWindow = Ext.extend(UserInfoWindow,{ title:'修改人员', url:'user.do?action=updateUser', //载入GridPanel中选中的数据 load:function(r){ this.form.setValues(r); } }); /********************用于显示数据列表*************************/ UserListGridPanel = Ext.extend(Ext.grid.GridPanel,{ //初始化数据添加组件和数据修改组件 insertWin:new InsertUserInfoWindow(), updateWin:new UpdateUserInfoWindow(), constructor:function(){ UserListGridPanel.superclass.constructor.call(this,{ //将该列表渲染到网页的body中 renderTo:Ext.getBody(), autoHeight:true, width:300, tbar:[{ text:'添加人员', handler:function(){ this.insertWin.show(); }, scope:this },'-',{ text:'修改人员', handler:function(){ this.updateWin.show(); try{ this.updateWin.load(this.getSelected()); }catch(err){ Ext.Msg.alert('系统提示',err.description); this.updateWin.close(); } }, scope:this },'-',{ text:'删除人员', handler:function(){ Ext.Msg.confirm('警告','删除是不可逆的,是否确定删除?',function(btn){ if(btn == 'yes'){ this.remove(); } },this); }, scope:this }], //列模式 colModel:new Ext.grid.ColumnModel([{ align:'center', header:'用户名', dataIndex:'UName', menuDisabled:true },{ align:'center', header:'真实姓名', dataIndex:'UTrueName', menuDisabled:true },{ align:'center', header:'密码', dataIndex:'UPassword', menuDisabled:true }]), //数据源,此处使用的是Json数据源 store:new Ext.data.JsonStore({ autoLoad:true, proxy:new Ext.data.HttpProxy({//使用代理获取服务器上的数据 url:UserListGridPanel.ACT_URL }), fields:['UId','UName','UTrueName','UPassword'] }), loadMask:{msg:'数据加载中...'}, //选择模式 selModel:new Ext.grid.RowSelectionModel({ singleSelect:true,//只可单选 listeners:{ 'rowselect':{ fn:function(sel,index,r){ this.fireEvent('rowselect',r); }, scope:this } } }) }); this.insertWin.on('submit',this.onInsertWinSubmit,this); this.updateWin.on('submit',this.onUpdateWinSubmit,this); this.addEvents('rowselect'); }, getSelected:function(){ var sm = this.getSelectionModel(); if(sm.getCount() == 0) throw Error('您尚未选中任何人员记录!'); return sm.getSelected(); }, insert:function(r){ this.getStore().add(r); }, update:function(r){ //更改本地数据 var sr = this.getSelected(); for(var i in sr.data){ sr.set(i,r.get(i)); } //提交更改 sr.commit(); }, //使用AJAX方式删除数据库及数据列表中的选中数据 remove:function(){ try{ var rc = this.getSelected(); Ext.Ajax.request({ url:'user.do?action=delUser', params:rc.data }); this.getStore().remove(rc); }catch(err){ Ext.Msg.alert('警告',err.description); } }, onInsertWinSubmit:function(win,r){ //向列表中插入新数据 this.insert(r); }, onUpdateWinSubmit:function(win,r){ //修改列表中选中的数据 this.update(r); } }); //将与服务器交互的URL提取出来,方便后期维护 UserListGridPanel.ACT_URL ='user.do?action=getList';
通过写这个,我发现写JS真的是要非常非常的细心啊,由于没有相关的开发工具,写的时候也没什么提示,经常会因为一个逗号,分号,字母顺序啦什么的这些搞砸了。写的时候就一定要注意,否则写完后发现没法运行,这类问题很难查出来。
一段Ext中的GridPanel组件的实例代码。目前只有数据的读取(通过访问user.do?action=getlist),而数据的增加、修改及删除等操作都是本地的,没有对数据库进行操作。目前还有一点点小BUG,表单虽然使用了allowBlan:false,但是当点确定提交时还是会被提交。具体原因目前还没找出来,下来再慢慢找吧。
UserInfoFormPanel = Ext.extend(Ext.form.FormPanel,{ constructor:function(){ UserInfoFormPanel.superclass.constructor.call(this,{ frame:true, autoHeight:true, baseCls:'x-plain', defaultType:'textfield', defaults:{allowBlank:false}, labelWidth:55, items:[{ fieldLabel:'用户名', blankText:'用户名不能为空!', name:'UName' },{ fieldLabel:'真实姓名', blankText:'真实姓名不能为空!', name:'UTrueName' },{ fieldLabel:'密码', blankText:'密码不能为空!', name:'UPassword' }] }); }, getValues:function(){ return new Ext.data.Record(this.getForm().getValues()); }, setValues:function(r){ this.getForm().loadRecord(r); }, reset:function(){ this.getForm().reset(); } }); /****************************************************************************/ UserInfoWindow = Ext.extend(Ext.Window,{ form:null, constructor:function(){ this.form = new UserInfoFormPanel(); UserInfoWindow.superclass.constructor.call(this,{ renderTo:Ext.getBody(), plain:true, autoHeight:true, width:250, items:this.form, buttonAlign:'center', closeAction:'hide', modal:true, buttons:[{ text:'确定', handler:this.onSubmitClick, scope:this },{ text:'取消', handler:this.onCancelClick, scope:this }] }); this.addEvents('submit'); }, close:function(){ this.form.reset(); this.hide(); }, onSubmitClick:function(){ this.fireEvent('submit',this,this.form.getValues()); this.close(); }, onCancelClick:function(){ this.close(); } }); /****************************************************************************/ InsertUserInfoWindow = Ext.extend(UserInfoWindow,{ title:'添加人员' }); /****************************************************************************/ UpdateUserInfoWindow = Ext.extend(UserInfoWindow,{ title:'修改人员', load:function(r){ this.form.setValues(r); } }); /****************************************************************************/ UserListGridPanel = Ext.extend(Ext.grid.GridPanel,{ insertWin:new InsertUserInfoWindow(), updateWin:new UpdateUserInfoWindow(), constructor:function(){ UserListGridPanel.superclass.constructor.call(this,{ renderTo:Ext.getBody(), width:300, autoHeight:true, autoWidth:true, tbar:[{ text:'添加人员', handler:function(){ this.insertWin.show(); }, scope:this },'-',{ text:'修改人员', handler:function(){ this.updateWin.show(); try{ this.updateWin.load(this.getSelected()); }catch(err){ Ext.Msg.alert('系统提示',err.description); this.updateWin.close(); } }, scope:this },'-',{ text:'删除人员', handler:function(){ Ext.Msg.confirm('警告','删除是不可逆的,是否确定删除?',function(btn){ if(btn == 'yes'){ this.remove(); } },this); }, scope:this }], //列模式 colModel:new Ext.grid.ColumnModel([{ align:'center', header:'用户名', dataIndex:'UName', menuDisabled:true },{ align:'center', header:'真实姓名', dataIndex:'UTrueName', menuDisabled:true },{ align:'center', header:'密码', dataIndex:'UPassword', menuDisabled:true }]), //数据源,此处使用的是Json数据源 store:new Ext.data.JsonStore({ autoLoad:true, proxy:new Ext.data.HttpProxy({//使用代理获取服务器上的数据 url:UserListGridPanel.DATA_URL }), fields:['UId','UName','UTrueName','UPassword'] }), //选择模式 selModel:new Ext.grid.RowSelectionModel({ singleSelect:true,//只可单选 listeners:{ 'rowselect':{ fn:function(sel,index,r){ this.fireEvent('rowselect',r); }, scope:this } } }) }); this.insertWin.on('submit',this.onInsertWinSubmit,this); this.updateWin.on('submit',this.onUpdateWinSubmit,this); this.addEvents('rowselect'); }, getSelected:function(){ var sm = this.getSelectionModel(); if(sm.getCount() == 0) throw Error('您尚未选中任何人员记录!'); return sm.getSelected(); }, insert:function(r){ this.getStore().add(r); }, update:function(r){ var sr = this.getSelected(); for(var i in sr.data){ sr.set(i,r.get(i)); } sr.commit(); }, remove:function(){ try{ this.getStore().remove(this.getSelected()); }catch(err){ Ext.Msg.alert('警告',err.description); } }, onInsertWinSubmit:function(win,r){ this.getStore().add(r); }, onUpdateWinSubmit:function(win,r){ this.update(r); } }); UserListGridPanel.DATA_URL ='user.do?action=getList';
昨天在用MyEclipse写东西的时候突然停电了,半小时后来电了,打开电脑,写了一天的代码全没了,代码文件的大小都没变,但是打开之后有的全显示“0”,有的则一片空白,差点没哭出来…~~~~(>_<)~~~~
今天在写一个EXTJS的登陆窗口的时候遇到了点问题:怎么在ASPX文件中获取Ext.Ajax以POST方式发送过来的数据呢?

当前我用EXTJS构建的表单代码如下:
- <link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css" />
- <script type="text/javascript" src="ext/ext-base.js"></script>
- <script type="text/javascript" src="ext/ext-all.js"></script>
- <script type="text/javascript">
- Ext.onReady(function(){
- var myForm = new Ext.form.FormPanel({
- title:"管理登录",
- renderTo:Ext.getBody(),
- width:250,
- frame:true,
- url:"Get.aspx",
- listeners:{
- "actioncomplete":function(form,action){
- var result = action.response.responseText;
- if(result == "y"){
- alert(this.xtype);
- }
- }
- },
- errorReader:new Ext.data.XmlReader({record:""},[]),
- items:[{
- layout:"form",
- xtype:"panel",
- labelWidth:50,
- baseCls:"x-plain",
- defaultType:"textfield",
- defaults:{allowBlank:false},
- style:"padding:4px",
- items:[{
- fieldLabel:"用户名"
- },{
- inputType:"password",
- fieldLabel:"密 码"
- }]
- }],
- buttons:[{
- text:"确定",
- handler:function(){
- this.ownerCt.getForm().submit();
- }
- },{
- text:"重置",
- handler:function(){
- this.ownerCt.getForm().reset()
- }
- }]
- });
- });
- </script>
<link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css" /> <script type="text/javascript" src="ext/ext-base.js"></script> <script type="text/javascript" src="ext/ext-all.js"></script> <script type="text/javascript">Ext.onReady(function(){ var myForm = new Ext.form.FormPanel({ title:"管理登录", renderTo:Ext.getBody(), width:250, frame:true, url:"Get.aspx", listeners:{ "actioncomplete":function(form,action){ var result = action.response.responseText; if(result == "y"){ alert(this.xtype); } } }, errorReader:new Ext.data.XmlReader({record:""},[]), items:[{ layout:"form", xtype:"panel", labelWidth:50, baseCls:"x-plain", defaultType:"textfield", defaults:{allowBlank:false}, style:"padding:4px", items:[{ fieldLabel:"用户名" },{ inputType:"password", fieldLabel:"密 码" }] }], buttons:[{ text:"确定", handler:function(){ this.ownerCt.getForm().submit(); } },{ text:"重置", handler:function(){ this.ownerCt.getForm().reset() } }] }); });</script>
一直以来都是直接点击按钮在其事件中使用this.txtUserName.text的方式获取页面中的数据的,如果是URL重写方式传值(即GET),那么就用Request.QueryString["id"]来获取,可是如果是POST方式呢?POST方式的取值方法我只是隐约见过,于是百度了一下得到答案:
使用Request["userName"]来获取POST表单中的值,方括号中的userName是表单中对应项的ID。
至此就要对前面写的EXTJS稍加修改了,修改后的代码如下:
- <link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css" />
- <script type="text/javascript" src="ext/ext-base.js"></script>
- <script type="text/javascript" src="ext/ext-all.js"></script>
- <script type="text/javascript">
- Ext.onReady(function(){
- var myForm = new Ext.form.FormPanel({
- title:"管理登录",
- renderTo:Ext.getBody(),
- width:250,
- frame:true,
- url:"Get.aspx",
- listeners:{
- "actioncomplete":function(form,action){
- var result = action.response.responseText;
- if(result == "y"){
- alert(this.xtype);
- }
- }
- },
- errorReader:new Ext.data.XmlReader({record:""},[]),
- items:[{
- layout:"form",
- xtype:"panel",
- labelWidth:50,
- baseCls:"x-plain",
- defaultType:"textfield",
- defaults:{allowBlank:false},
- style:"padding:4px",
- items:[{
- id:"name",
- fieldLabel:"用户名"
- },{
- id:"pwd" >,
- inputType:"password",
- fieldLabel:"密 码"
- }]
- }],
- buttons:[{
- text:"确定",
- handler:function(){
- this.ownerCt.getForm().submit();
- }
- },{
- text:"重置",
- handler:function(){
- this.ownerCt.getForm().reset()
- }
- }]
- });
- });
- </script>
不细看的话是看不出来代码的变化的…呵呵~
5步就能学会使用这个ConfirmButtonExtender控件,半个代码都不需要你手动去写,微软出品的东西总是简单易用,貌似完全把使用者当白痴对待,汗~
1.在ASP.NET AJAX-Enabled Web Site中新建一个ConfirmButton.aspx文件。
2.拖入一个ScriptManager和一个UpdatePanel。
3.向UpdatePanel中拖入一个Button控件和一个ConfirmButtonExtender控件。
4.修改ConfirmButtonExtender控件的TargetControlID属性为Button的ID。
5.修改Button的ConfirmText属性,输入一段信息:尼克技术博客http://www.ineeke.com欢迎您光临!这段信息将在弹出的窗口中显示。
现在这个AJAX效果已经做好了,运行这个程序,单击一下Button就能看到效果了。不过这个效果用不着这么麻烦吧,微软是不是脑子秀逗了,完全可以直接用JavaScript弹的嘛!
开始学习ASP.NET的AJAX控件了,不过默认安装的VS2005上是没有这个控件库的,需要我们自己手动安装。
1,下载并安装 ASPAJAXExtSetup.msi
http://download.microsoft.com/download/5/4/6/5462bcbd-e738-45fa-84ca-fa02b0c4e1c2/ASPAJAXExtSetup.msi
下载完 ASPAJAXExtSetup.msi 安装更新后在你的系统盘下的(以C盘为例)出现这个文件夹:
C:\Program Files\Microsoft asp.NET\ASP.NET 2.0 ajax Extensions\v1.0.61025
安装这个后我们就可以创建Asp.net AJAXEnabledWebSite站点了,这其实就是个ajax.net网站的模板。但是我们现在还不能使用微软给我们开发好的ajax控件。
2,下载AjaxControlToolkit
http://www.codeplex.com/AjaxControlToolkit/Release/ProjectReleases.aspx?ReleaseId=11121
有带源代码的和不带源代码的toolkit。下载完成后把该文件解压到:
C:\Program Files\Microsoft asp.NET\ASP.NET 2.0 ajax Extensions\v1.0.61025\AjaxContronlToolkit\
双击运行AjaxControlToolkit.sln。
用vs2005 打开这个sln,编译TemplateVSI这个项目后,把在C:\Program Files\Microsoft asp.NET\ASP.NET 2.0 AJAX Extensions\SampleWebSite\Bin下面生成的AjaxControlToolkit.dll和 AjaxControlToolkit.pdb复制到
C:\Program Files\Microsoft asp.NET\ASP.NET 2.0 AJAX Extensions\Binaries文件夹下面,这样我们就可以在vs2005中使用ajax.net这些控件了。
新建一个Ajax ControlToolkitWebSite 类型的web项目。在工具栏中新添加一个选项卡起名:AjaxControltoolkit
在这个选项卡上右键选择项->浏览找到刚才复制过去的AjaxControlToolkit.dll,添加进来。这样我们就ajax.net控件成功引用到vs2005中了 。
进入本人ajax学习第三课,使用ajax获取XML文档中信息。效果图
以下是HTML部分的代码:
<html>
<head>
<title>ajax 3</title>
<script type="text/javascript">
var xmlHttp;
var requestType="";
function createXMLHttpRequest(){
if(window.ActiveXObject){
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}else if(window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest();
}
}
function startRequest(requestedList){
requestType = requestedList;
createXMLHttpRequest();
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.open("GET","paresXML.xml",true);
xmlHttp.send(null);
}
function handleStateChange(){
if(xmlHttp.readyState == 4){
if(xmlHttp.status == 200){
if(requestType == "north"){
listNorthStates();
}else if(requestType == "all"
listAllStates();
}
}
}
}
function listNorthStates(){
var xmlDoc = xmlHttp.responseXML;
var northNode = xmlDoc.getElementsByTagName("north")[0];
var out = "Northern States";
var northStates = northNode.getElementsByTagName("state");
outputList("Northern States",northStates);
}
function listAllStates(){
var xmlDoc = xmlHttp.responseXML;
var allStates = xmlDoc.getElementsByTagName("state");
outputList("All States in Document",allStates)
}
function outputList(title,states){
var out = title;
var currentState = null;
for(var i = 0 ; i < states.length; i++){
currentState = states[i];
out = out+"\n"+currentState.childNodes[0
].nodeValue;
alert(out);
}
}
</script>
</head>
<body>
<input type="button" value="查看所有" onclick="startRequest('all')" /><br />
<input type="button" value="查看north" onclick="startRequest('north')" />
</body>
</html>
以下是XML文件代码:
<?xml version="1.0" encoding="UTF-8"?>
<states>
<north>
<state>Minnesota</state>
<state>Iowa</state>
<stae>North Dakota</stae>
</north>
<south>
<state>Texas</state>
<state>Oklahoma</state>
<state>Louisiana</state>
</south>
<east>
<state>New York</state>
<state>North Carolina</state>
<state>Massachusetts</state>
</east>
<west>
<state>California</state>
<state>Oregon</state>
<state>Nevad</state>
</west>
</states>
首先listAllStates函数创建了一个局部变量xmlDoc,并将这个变量初始化设置为服务器返回的XML文档,这个XML文档是使用XMLHttpRequest对象的responseXML属性得到的。利用XML文档的getElementsByTagName方法可以获取文档中所有标记名为state的元素。getElementsByTagName方法返回了包含所有state元素的数组,这个数组将付给名为allStates得局部变量。从XML文档获取了所有state元素之后,listAllStates函数调用outputList函数并在警告框中显示这些state元素。listAllStates方法将迭代处理state元素的数组,将各各元素的响应州名逐个追加到一个串中,这个串最后将显示在警告框中。 outputList函数迭代处理数组中的所有元素,将当前元素赋给currentState变量。因为表示州名的文本元素总是state元素的第一个子元素,所以可以使用chinldNodes属性来得到文本元素。 listNorthStates函数与listAllStates函数是类似的,唯一不同的是它使用了getElementsByTagName方法获得north标记,从而获得XML文档中的north元素。因为文档只包含一个north元素,而且getElementsByTagName方法总是返回一个数组,所以用[0]下标来抽取north元素。注:此ajax学习资料来自 方正apabi联盟制作的《ajax基础教程》译自:《Founations of Ajax》
本例具体步骤如下(这里并没有真正的搜索什么,而是仅仅用于学习测试,希望自己将来能够写出来吧): 1.点击search按钮,调用startSearch函数,该函数先调用createXMLHttpRequest函数来初始化XMLHttpRequest对象的一个新实例。 2.startSearch函数将回调函数设置为handleStateChange函数。 3.startSearch函数使用opne()方法来设置请求方法(GET)及请求目标,并且设置为异步的完成请求。 4.使用XMLHttpRequest对象的内部状态每次有变化时,都会调用handleStateChange函数。一旦接收到响应(如果readyState属性的值为4),div元素的innerHTML属性就将使用XMLHttpRequest对象的responseText属性设置。 index.html具体代码如下:
<script language="javascript">
var xmlHttp;
function createXMLHttpRequest(){
if(window.ActiveXObject){
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}else if(window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest();
}
}
function startSearch(){
createXMLHttpRequest();
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.open("GET","innerHTML.xml",true);
xmlHttp.send(null);
}
function handleStateChange(){
if(xmlHttp.readyState == 4){
if(xmlHttp.status == 200){
document.getElementById("result").innerHTML = xmlHttp.responseText;
}
}
}
</script><input type="button" onclick="startSearch()" value="