.NET人字拖
博客园
::
首页
::
新随笔
::
联系
::
订阅
::
管理
posts - 104, comments - 516, trackbacks - 49
公告
Name:
网魂小兵
QQ:
596130025
Addr:
福建厦门
MSN:
myxbing#hotmail.com
与我联系
发短消息
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
(2)
给我留言
查看留言
我参加的小组
AJAX
竞技游戏
.NET 3.x
C/C++
我的标签
sqlserver(1)
identity(1)
fts(1)
regex(1)
正则表达式(1)
.NET(1)
boost(1)
vs2008(1)
随笔分类
(145)
AJAX(doc)(8)
ASP.NET(42)
C#3.0+(11)
C/C++(16)
CommunityServer(7)
Database(10)
Enterprise Library (7)
JavaScript(10)
ServerContols(7)
UML(1)
VC++/MFC(8)
WPF/SilverLight(3)
XNA Game(2)
翻译(4)
今天我当家(7)
设计模式(2)
随笔档案
(104)
2008年3月 (1)
2008年2月 (3)
2008年1月 (1)
2007年11月 (4)
2007年10月 (3)
2007年9月 (9)
2007年8月 (3)
2007年7月 (2)
2007年6月 (9)
2007年5月 (9)
2007年4月 (14)
2007年3月 (6)
2007年2月 (3)
2007年1月 (15)
2006年12月 (9)
2006年11月 (2)
2006年10月 (4)
2006年9月 (7)
收藏夹
(5)
All(5)
I Like Links
ASP.NET
Codeplex
XNADevelopment
My Friend's Blog
陆巍杰
孙小雨
探丫头
网络安全&Linux
搜索
积分与排名
积分 - 148373
排名 - 222
最新随笔
1. VS2008下安装boost
2. [easy]正则表达式调试器
3. 删除TFS项目
4. [Sql Server]重新设置IDENTITY列重新从1开始记数
5. [转]vc中socket编程步骤
6. [字符集]Unicode和UTF-8之间的转换详解
7. [VC++]编译,没有找到 mspdb80.dll 的解决办法
8. [VC++]最小化图标至托盘中
9. [ADO&VC一]使用ADO智能指针_ConnectionPtr,_CommandPtr及_RecordsetPtr
10. [MFC入门二]四种不同对象
11. [MFC入门一]基于消息,事件驱动(Message Based,Event Driven)
12. [ASP.NET用户验证一]Forms验证
13. ASP.NET中导致程序重启的几个东东
14. [C++程序语言设计笔记一]面向对象编程抽象,继承,重写基本介绍
15. [AJAX]有史以来最简单的AJAX回调库
最新评论
1. re: [AJAX]有史以来最简单的AJAX回调库
在页面上实现很容易,但把功能转到ascx中就有问题,请指点下啊!
--ms51cn
2. re: 在存储过程中实现分页.
这样写性能有测试过吗?好像不大好吧。记得几年前我也这样写过。 现在这样写:alter procedure cr_test @returnCount int =10 , @pageint int...
--没有钱的职业
3. re: [js对象]JS入门之ActiveXObject对象
辛苦了
--天堂的狼
4. re: [C#/C++]C#调用非托管DLL的APIs
mark
--求知无傲
5. re: [js对象]JS入门之arguments对象
ding
--liyunming
阅读排行榜
1. [GridView控件]自定义分页(6579)
2. [JS.IntelliSense]VS2008(Orcas) So Cool(6447)
3. [C#3.0]新特性概览(4468)
4. [C#/C++]C#调用非托管DLL的APIs(4253)
5. [字符集]Unicode和UTF-8之间的转换详解(4121)
6. 在IIS 7.0中架设网站,并用VS2005来调试Web项目(3917)
7. [AJAX]有史以来最简单的AJAX回调库(3631)
8. [VS2008”Orcas”]ASP.NET将引入新控件ListView(3615)
9. [C#3.0体验]Orcas中内置的LinQ,XLinQ[DLinQ]扩展方法(3233)
10. 在Web.config配置文件中自定义配置节点(3205)
评论排行榜
1. [JS.IntelliSense]VS2008(Orcas) So Cool(39)
2. [C#3.0]新特性概览(36)
3. 工行华虹U盾在Vista和IE7下的解决方案(31)
4. [AJAX]有史以来最简单的AJAX回调库(31)
5. [字符集]Unicode和UTF-8之间的转换详解(31)
6. [GridView控件]自定义分页(25)
7. [C#3.0体验]Orcas中内置的LinQ,XLinQ[DLinQ]扩展方法(23)
8. [Prototype.js1.5.1_rc2]prototype.js入门(19)
9. 在存储过程中实现分页.(19)
10. 通过COM来获取CookieContainer,简单又好用(18)
[CommunityServer]AJAX客户端说明,XMLHttpRequest对象
在CommunityServer中运用了自己的AJAX机制,没有借助其他的辅助控件。其中客户的XMLHttpRequest对象的封装,就足以让人大饱眼福,在一般的浏览器其都能够运行AJAX。下面我们来学习学习这个咚咚,希望能给更多的人带来帮助。
首先当然是要了解一下浏览器中的XMLHttp对象了:
XMLHTTP方法:
备注:客户机可以使用XMLHTTP对象发送任意的HTTP请求,接受HTTP应答,还可以对应答的XML文档进行解析。
Open方法:初始化一个Msxml2.XMLHTTP请求,指定HTTP请求方式、URL以及鉴定信息。
语法:
Open( bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword )
参数介绍:
bstrMethod: 数据传送方式,即GET或POST。
bstrUrl: 服务网页的URL。
varAsync: 是否同步执行。缺省为True,即同步执行,但只能在DOM中实施同步执行。用中一般将其置为False,即异步执行。
bstrUser: 用户名,可省略。
bstrPassword:用户口令,可省略。
Send方法:发送HTTP请求到服务器,返回应答。
语法:
oXMLHttpRequest.send(varBody)
说明:此方法是否同步取决于Open方法的varAsync参数。如果设为True则为同步,调用立刻返回,如果设为False调用直到整个应答被接收了才返回。
setRequestHeader( bstrHeader, bstrvalue )
bstrHeader:HTTP 头(header)
bstrvalue: HTTP 头(header)的值
如果Open方法定义为POST,可以定义表单方式上传:
xmlhttp.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded")
XMLHTTP属性:
onreadystatechange:在同步执行方式下获得返回结果的事件句柄。只能在DOM中调用。
responseBody: 结果返回为无符号整数数组。
responseStream: 结果返回为IStream流。
responseText : 结果返回为字符串。
responseXML: 结果返回为XML格式数据。
运用这个原理也可以做网络小偷程序,网络爬虫应该就是应用这个东西来完成的吧,不过我没有做过,可能在不久的将来会制作个来玩玩,这里我们最主要的是看看CS中是如何封装他的:
1
//
Ajax Start
2
/**/
///
<summary>
3
///
创建回调对象,如果存在window.XMLHttpRequest()对象,则返回此对象,如果是IE则搜索Msxml2.XMLHTTP各个版本及Microsoft.XMLHTTP并创建对象返回。
4
///
</summary>
5
function Ajax_GetXMLHttpRequest()
{
6
if
(window.XMLHttpRequest)
{
7
return
new
XMLHttpRequest();
8
}
else
{
9
if
(window.Ajax_XMLHttpRequestProgID)
{
10
return
new
ActiveXObject(window.Ajax_XMLHttpRequestProgID);
11
}
else
{
12
var progIDs
=
[
"
Msxml2.XMLHTTP.5.0
"
,
"
Msxml2.XMLHTTP.4.0
"
,
"
MSXML2.XMLHTTP.3.0
"
,
"
MSXML2.XMLHTTP
"
,
"
Microsoft.XMLHTTP
"
];
13
for
(var i
=
0
; i
<
progIDs.length;
++
i)
{
14
var progID
=
progIDs[i];
15
try
{
16
var x
=
new
ActiveXObject(progID);
17
window.Ajax_XMLHttpRequestProgID
=
progID;
18
return
x;
19
}
catch
(e)
{
20
}
21
}
22
}
23
}
24
return
null
;
25
}
26
/**/
///
<summary>
27
///
Ajax回调。
28
///
</summary>
29
///
<param name="type">
调用服务端函数所在的类包括命名空间(如:NExplus.Controls.SiteHeader)。
</param>
30
///
<param name="id">
客户端所对应的标记的ID(如:
<div id="ID"></div>
)。
</param>
31
///
<param name="method">
服务端(方法)函数名称(被AjaxMethod标记)。
</param>
32
///
<param name="args">
传到服务器的字符串。
</param>
33
///
<param name="clientCallBack">
同步或异步回调。
</param>
34
///
<param name="debugRequestText">
调试/请求字符串。
</param>
35
///
<param name="debugResponseText">
调试/输出字符串。
</param>
36
///
<param name="debugErrors">
调试的错误信息。
</param>
37
///
<param name="includeControlValuesWithCallBack">
是否和控件及其值一起回调。
</param>
38
///
<param name="url">
Url地址。
</param>
39
function Ajax_CallBack(type, id, method, args, clientCallBack, debugRequestText, debugResponseText, debugErrors, includeControlValuesWithCallBack, url)
{
40
41
if
(
!
url)
42
{
43
url
=
window.location.href;
44
url
=
url.replace(
/
\#.
*
$
/
,
''
);
//
去除URL中标签部分,即"#"之后的字符串。
45
//
加入参数Ajax_CallBack并设为true,说明是AJAX回调。
46
if
(url.indexOf(
'
?
'
)
>
-
1
)
47
url
+=
"
&Ajax_CallBack=true
"
;
48
else
49
{
50
if
(url.substr(url.length
-
1
,
1
)
==
"
/
"
)
51
url
+=
"
default.aspx
"
;
52
53
url
+=
"
?Ajax_CallBack=true
"
;
54
}
55
}
56
57
var x
=
Ajax_GetXMLHttpRequest();
//
取得XMLHttpRequest对象。
58
var result
=
null
;
59
if
(
!
x)
{
60
result
=
{
"
value
"
:
null
,
"
error
"
:
"
NOXMLHTTP
"
}
;
61
if
(debugErrors)
{
62
alert(
"
error:
"
+
result.error);
63
}
64
if
(clientCallBack)
{
65
clientCallBack(result);
66
}
67
return
result;
68
}
69
70
x.open(
"
POST
"
, url, clientCallBack
?
true
:
false
);
//
以Post方式打开对象,这样在服务端就可以用Request.Form获取参数。
71
x.setRequestHeader(
"
Content-Type
"
,
"
application/x-www-form-urlencoded; charset=utf-8
"
);
72
if
(clientCallBack)
{
73
//
如果同步,判断状态,输出错误消息。
74
x.onreadystatechange
=
function()
{
75
var result
=
null
;
76
77
if
(x.readyState
!=
4
)
{
78
return
;
79
}
80
81
if
(debugResponseText)
{
82
alert(x.responseText);
83
}
84
85
try
86
{
87
var result
=
eval(
"
(
"
+
x.responseText
+
"
)
"
);
88
if
(debugErrors
&&
result.error)
{
89
alert(
"
error:
"
+
result.error);
90
}
91
}
92
catch
(err)
93
{
94
if
(window.confirm(
'
The following error occured while processing an AJAX request:
'
+
err.message
+
'
\n\nWould you like to see the response?
'
))
95
{
96
var w
=
window.open();
97
w.document.open(
'
text/plain
'
);
98
w.document.write(x.responseText);
99
w.document.close();
100
}
101
102
result
=
new
Object();
103
result.error
=
'
An AJAX error occured. The response is invalid.
'
;
104
}
105
106
clientCallBack(result);
107
}
108
}
109
var encodedData
=
"
Ajax_CallBackType=
"
+
type;
110
if
(id)
{
111
encodedData
+=
"
&Ajax_CallBackID=
"
+
id.split(
"
$
"
).join(
"
:
"
);
112
}
113
encodedData
+=
"
&Ajax_CallBackMethod=
"
+
method;
114
if
(args)
{
115
for
(var i
in
args)
{
116
encodedData
+=
"
&Ajax_CallBackArgument
"
+
i
+
"
=
"
+
encodeURIComponent(args[i]);
117
}
118
}
119
//
如果加入控件,则加入控件数据。
120
if
(includeControlValuesWithCallBack
&&
document.forms.length
>
0
)
{
121
var form
=
document.forms[
0
];
122
for
(var i
=
0
; i
<
form.length;
++
i)
{
123
var element
=
form.elements[i];
124
if
(element.name)
{
125
var elementValue
=
null
;
126
if
(element.nodeName
==
"
INPUT
"
)
{
127
var inputType
=
element.getAttribute(
"
TYPE
"
).toUpperCase();
128
if
(inputType
==
"
TEXT
"
||
inputType
==
"
PASSWORD
"
||
inputType
==
"
HIDDEN
"
)
{
129
elementValue
=
element.value;
130
}
else
if
(inputType
==
"
CHECKBOX
"
||
inputType
==
"
RADIO
"
)
{
131
if
(element.
checked
)
{
132
elementValue
=
element.value;
133
}
134
}
135
}
else
if
(element.nodeName
==
"
SELECT
"
)
{
136
elementValue
=
element.value;
137