近来忙毕业设计,又很长时间没写blog了。
学ajax也有段时间了,理论是看了不少,也对MagicAjax框架做了下了解,当然要吃透它还是有很长的路要走。
一直觉得对Ajax底层的代码应该总结一下。其实很底层的代码是比较简洁明了的,但功能却比较简单。一般我们都用Send(null).以前我一直在想我怎么来控制当异步传送Http请求时要调用的后台的指定的(我想用的)代码,现在终于明白了(唉,对自己的智商表示怀疑),那就要在Send方法中传送参数。参数中应该包括事件的触发者和它的参数,还有就是ViewState的值。
具体代码如下(里面我加了些注释,后面不再解释):
1
__PageForm = null;
2![](/Images/OutliningIndicators/None.gif)
3
function AjaxCallObject()
4
{
5
this.Init();
6
}
7![](/Images/OutliningIndicators/None.gif)
8
AjaxCallObject.prototype.Init = function()
9
{
10
this.XmlHttp = this.GetHttpObject();
11
}
12
13
AjaxCallObject.prototype.GetHttpObject = function()
14
{
15
var xmlhttp;
16
if (!xmlhttp)
17
{
18
try
19
{
20
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
21
}
22
catch (e)
23
{
24
xmlhttp = false;
25
}
26
}
27
return xmlhttp;
28
}
29![](/Images/OutliningIndicators/None.gif)
30
AjaxCallObject.prototype.HookAjaxCall = function()
31
{
32
__PageForm = document.getElementById('Form1');
33
if (typeof __doPostBack != 'undefined')
34
__doPostBack = this.DoPostBack;
35
}
36![](/Images/OutliningIndicators/None.gif)
37
// Replaces normal __doPostBack
38
AjaxCallObject.prototype.DoPostBack = function(eventTarget, eventArgument)
39
{
40
AJAXCbo.DoAjaxCall(eventTarget, eventArgument);
41
}
42
43
AjaxCallObject.prototype.DoAjaxCall = function(eventTarget, eventArgument)
44
{
45
var theData = '';
46
var theform = __PageForm;
47
48
if(theform == null)
49
{
50
return;
51
}
52
53
var thePage = theform.action;//得到页面地址
54
var eName = '';
55![](/Images/OutliningIndicators/InBlock.gif)
56
theData = '__EVENTTARGET=' + this.EncodePostData(eventTarget.split("$").join(":")) + '&';//得到事件的发起者,也就是object Sender
57
theData += '__EVENTARGUMENT=' + this.EncodePostData(eventArgument) + '&';//得到参数,就是EventArgs e
58![](/Images/OutliningIndicators/InBlock.gif)
59
var elemCount = theform.elements.length;
60
for( var i=0; i<elemCount; i++ )
61
{
62
curElem = theform.elements[i];
63
eName = curElem.name;
64
if( eName && eName != '' && curElem.tagName != "EMBED")
65
{
66
if( eName == '__EVENTTARGET' || eName == '__EVENTARGUMENT' )
67
{}
68
else
69
{
70
var type = curElem.type;
71
var val = curElem.value;
72![](/Images/OutliningIndicators/InBlock.gif)
73
if ( type == "submit" || type == "button" )
74
continue;
75![](/Images/OutliningIndicators/InBlock.gif)
76
val = this.EncodePostData(val);
77![](/Images/OutliningIndicators/InBlock.gif)
78
if ( type == "select-multiple" || type == "select-one" )
79
{
80
var selectLength = curElem.options.length;
81
var optNameStr = this.EncodePostData(eName);
82
for (var j=0; j < selectLength; j++)
83
if (curElem.options[j].selected)
84
theData = theData + optNameStr + '=' + this.EncodePostData(curElem.options[j].value) + '&';
85
}
86
else if ( (type != "checkbox" && type != "radio") || curElem.checked )
87
{
88
theData = theData + this.EncodePostData(eName) + '=' + val + '&';
89
}
90
}
91
}
92
}
93
94
if (theData.substr(theData.length-1) == "&")
95
theData = theData.substr(0, theData.length-1);
96
//alert(theData);
97
98
if( this.XmlHttp )
99
{
100
//注释的是旧的代码,有问题,回送回来的状态都是0,原因还不明
101
/*AJAXCbo = new AjaxCallObject();
102![](/Images/OutliningIndicators/InBlock.gif)
103
if( this.XmlHttp.readyState == 4 || this.XmlHttp.readyState == 0 )
104
{
105
// Asynchronous
106
this.XmlHttp.open("POST", thePage, true);
107
this.XmlHttp.onreadystatechange = function(){ AJAXCbo.ReadyStateChange(); };
108
this.XmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
109
this.XmlHttp.send(theData);
110
}*/
111
var oThis = this;
112
AJAXCbo = new AjaxCallObject();
113![](/Images/OutliningIndicators/InBlock.gif)
114
if( this.XmlHttp.readyState == 4 || this.XmlHttp.readyState == 0 )
115
{
116
ajaxCallType = "async";
117
118
if ( ! ajaxCallType || ajaxCallType.toLowerCase() != "sync")
119
{
120
// 异步传输
121
this.XmlHttp.open("POST", thePage, true);
122
this.XmlHttp.onreadystatechange = function(){ oThis.ReadyStateChange(); };
123
this.XmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
124
this.XmlHttp.send(theData);
125
}
126
else
127
{
128
// 同步传输,页面会刷新
129
window.setTimeout(
130
function()
131
{
132
oThis.XmlHttp.open("POST", thePage, false);
133
oThis.XmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
134
oThis.XmlHttp.send(theData);
135![](/Images/OutliningIndicators/InBlock.gif)
136
if( oThis.XmlHttp.status == 200 && oThis.XmlHttp.statusText == "OK" )
137
oThis.OnComplete(oThis.XmlHttp.responseText, oThis.XmlHttp.responseXML);
138
else
139
oThis.OnError(oThis.XmlHttp.status, oThis.XmlHttp.statusText, oThis.XmlHttp.responseText);
140
}, 1);
141
}
142
}
143
}
144
return true;
145
}
146![](/Images/OutliningIndicators/None.gif)
147
/*AjaxCallObject.prototype.OnLoading = function()
148
{
149
// Loading
150
}
151![](/Images/OutliningIndicators/InBlock.gif)
152
AjaxCallObject.prototype.OnLoaded = function()
153
{
154
// Loaded
155
}
156![](/Images/OutliningIndicators/InBlock.gif)
157
AjaxCallObject.prototype.OnInteractive = function()
158
{
159
// Interactive
160
}
161
*/
162
AjaxCallObject.prototype.OnComplete = function(responseText, responseXml)
163
{
164
this.SetHtmlOfPage(responseText);
165
return true;
166
}
167![](/Images/OutliningIndicators/None.gif)
168
/*AjaxCallObject.prototype.OnAbort = function()
169
{}*/
170![](/Images/OutliningIndicators/None.gif)
171
AjaxCallObject.prototype.OnError = function(status, statusText, responseText)
172
{
173
if (status==200)
174
{
175
// a weird bug of Opera sometimes invokes OnError when there's no error
176
this.OnComplete(responseText);
177
return;
178
}
179![](/Images/OutliningIndicators/InBlock.gif)
180
document.close(); // for IE
181
document.write(responseText);
182
document.close(); // for Firefox
183
}
184![](/Images/OutliningIndicators/None.gif)
185
AjaxCallObject.prototype.ReadyStateChange = function()
186
{
187
/*if( this.XmlHttp.readyState == 1 )
188
{
189
this.OnLoading();
190
}
191
else if( this.XmlHttp.readyState == 2 )
192
{
193
this.OnLoaded();
194
}
195
else if( this.XmlHttp.readyState == 3 )
196
{
197
this.OnInteractive();
198
}
199
else */
200
//alert("ly");
201
//alert(this.XmlHttp.readyState);
202
if( this.XmlHttp.readyState == 4)
203
{
204
/*if( this.XmlHttp.status == 0 )
205
this.OnAbort();
206
else*/
207
if( this.XmlHttp.status == 200 )
208
{
209
this.OnComplete(this.XmlHttp.responseText, this.XmlHttp.responseXML);
210
}
211
else
212
{
213
this.OnError(this.XmlHttp.status, this.XmlHttp.statusText, this.XmlHttp.responseText);
214
}
215
}
216
}
217![](/Images/OutliningIndicators/None.gif)
218
AjaxCallObject.prototype.EncodePostData = function(data)
219
{
220
return data.split("%").join("%25").split("=").join("%3d").split("&").join("%26").split("+").join("%2b");
221
}
222![](/Images/OutliningIndicators/None.gif)
223
AjaxCallObject.prototype.SetHtmlOfPage = function(html)
224
{
225
document.close(); // for IE
226
document.write(html);//用新的html代码替代页面上的html代码
227
document.close(); // for Firefox
228
}
229![](/Images/OutliningIndicators/None.gif)
230
var AJAXCbo = new AjaxCallObject();
代码长了点,不过可以直接用了,只要在相应的后台代码中给服务器控件加段代码就成了。比如说,Web页面上放了个按钮控件,ID为Button1,那么在后台代码的Page_Load中加上下面一段代码:![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
26
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
29
![](/Images/OutliningIndicators/None.gif)
30
![](/Images/OutliningIndicators/None.gif)
31
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
36
![](/Images/OutliningIndicators/None.gif)
37
![](/Images/OutliningIndicators/None.gif)
38
![](/Images/OutliningIndicators/None.gif)
39
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
42
![](/Images/OutliningIndicators/None.gif)
43
![](/Images/OutliningIndicators/None.gif)
44
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
68
![](/Images/OutliningIndicators/InBlock.gif)
69
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
70
![](/Images/OutliningIndicators/InBlock.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/InBlock.gif)
73
![](/Images/OutliningIndicators/InBlock.gif)
74
![](/Images/OutliningIndicators/InBlock.gif)
75
![](/Images/OutliningIndicators/InBlock.gif)
76
![](/Images/OutliningIndicators/InBlock.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/InBlock.gif)
79
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
80
![](/Images/OutliningIndicators/InBlock.gif)
81
![](/Images/OutliningIndicators/InBlock.gif)
82
![](/Images/OutliningIndicators/InBlock.gif)
83
![](/Images/OutliningIndicators/InBlock.gif)
84
![](/Images/OutliningIndicators/InBlock.gif)
85
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
86
![](/Images/OutliningIndicators/InBlock.gif)
87
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
88
![](/Images/OutliningIndicators/InBlock.gif)
89
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
90
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
91
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
92
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
93
![](/Images/OutliningIndicators/InBlock.gif)
94
![](/Images/OutliningIndicators/InBlock.gif)
95
![](/Images/OutliningIndicators/InBlock.gif)
96
![](/Images/OutliningIndicators/InBlock.gif)
97
![](/Images/OutliningIndicators/InBlock.gif)
98
![](/Images/OutliningIndicators/InBlock.gif)
99
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
100
![](/Images/OutliningIndicators/InBlock.gif)
101
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
102
![](/Images/OutliningIndicators/InBlock.gif)
103
![](/Images/OutliningIndicators/InBlock.gif)
104
![](/Images/OutliningIndicators/InBlock.gif)
105
![](/Images/OutliningIndicators/InBlock.gif)
106
![](/Images/OutliningIndicators/InBlock.gif)
107
![](/Images/OutliningIndicators/InBlock.gif)
108
![](/Images/OutliningIndicators/InBlock.gif)
109
![](/Images/OutliningIndicators/InBlock.gif)
110
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
111
![](/Images/OutliningIndicators/InBlock.gif)
112
![](/Images/OutliningIndicators/InBlock.gif)
113
![](/Images/OutliningIndicators/InBlock.gif)
114
![](/Images/OutliningIndicators/InBlock.gif)
115
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
116
![](/Images/OutliningIndicators/InBlock.gif)
117
![](/Images/OutliningIndicators/InBlock.gif)
118
![](/Images/OutliningIndicators/InBlock.gif)
119
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
120
![](/Images/OutliningIndicators/InBlock.gif)
121
![](/Images/OutliningIndicators/InBlock.gif)
122
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
123
![](/Images/OutliningIndicators/InBlock.gif)
124
![](/Images/OutliningIndicators/InBlock.gif)
125
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
126
![](/Images/OutliningIndicators/InBlock.gif)
127
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
128
![](/Images/OutliningIndicators/InBlock.gif)
129
![](/Images/OutliningIndicators/InBlock.gif)
130
![](/Images/OutliningIndicators/InBlock.gif)
131
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
132
![](/Images/OutliningIndicators/InBlock.gif)
133
![](/Images/OutliningIndicators/InBlock.gif)
134
![](/Images/OutliningIndicators/InBlock.gif)
135
![](/Images/OutliningIndicators/InBlock.gif)
136
![](/Images/OutliningIndicators/InBlock.gif)
137
![](/Images/OutliningIndicators/InBlock.gif)
138
![](/Images/OutliningIndicators/InBlock.gif)
139
![](/Images/OutliningIndicators/InBlock.gif)
140
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
141
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
142
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
143
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
144
![](/Images/OutliningIndicators/InBlock.gif)
145
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
146
![](/Images/OutliningIndicators/None.gif)
147
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
148
![](/Images/OutliningIndicators/InBlock.gif)
149
![](/Images/OutliningIndicators/InBlock.gif)
150
![](/Images/OutliningIndicators/InBlock.gif)
151
![](/Images/OutliningIndicators/InBlock.gif)
152
![](/Images/OutliningIndicators/InBlock.gif)
153
![](/Images/OutliningIndicators/InBlock.gif)
154
![](/Images/OutliningIndicators/InBlock.gif)
155
![](/Images/OutliningIndicators/InBlock.gif)
156
![](/Images/OutliningIndicators/InBlock.gif)
157
![](/Images/OutliningIndicators/InBlock.gif)
158
![](/Images/OutliningIndicators/InBlock.gif)
159
![](/Images/OutliningIndicators/InBlock.gif)
160
![](/Images/OutliningIndicators/InBlock.gif)
161
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
162
![](/Images/OutliningIndicators/None.gif)
163
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
164
![](/Images/OutliningIndicators/InBlock.gif)
165
![](/Images/OutliningIndicators/InBlock.gif)
166
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
167
![](/Images/OutliningIndicators/None.gif)
168
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
169
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
170
![](/Images/OutliningIndicators/None.gif)
171
![](/Images/OutliningIndicators/None.gif)
172
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
173
![](/Images/OutliningIndicators/InBlock.gif)
174
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
175
![](/Images/OutliningIndicators/InBlock.gif)
176
![](/Images/OutliningIndicators/InBlock.gif)
177
![](/Images/OutliningIndicators/InBlock.gif)
178
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
179
![](/Images/OutliningIndicators/InBlock.gif)
180
![](/Images/OutliningIndicators/InBlock.gif)
181
![](/Images/OutliningIndicators/InBlock.gif)
182
![](/Images/OutliningIndicators/InBlock.gif)
183
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
184
![](/Images/OutliningIndicators/None.gif)
185
![](/Images/OutliningIndicators/None.gif)
186
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
187
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
188
![](/Images/OutliningIndicators/InBlock.gif)
189
![](/Images/OutliningIndicators/InBlock.gif)
190
![](/Images/OutliningIndicators/InBlock.gif)
191
![](/Images/OutliningIndicators/InBlock.gif)
192
![](/Images/OutliningIndicators/InBlock.gif)
193
![](/Images/OutliningIndicators/InBlock.gif)
194
![](/Images/OutliningIndicators/InBlock.gif)
195
![](/Images/OutliningIndicators/InBlock.gif)
196
![](/Images/OutliningIndicators/InBlock.gif)
197
![](/Images/OutliningIndicators/InBlock.gif)
198
![](/Images/OutliningIndicators/InBlock.gif)
199
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
200
![](/Images/OutliningIndicators/InBlock.gif)
201
![](/Images/OutliningIndicators/InBlock.gif)
202
![](/Images/OutliningIndicators/InBlock.gif)
203
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
204
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
205
![](/Images/OutliningIndicators/InBlock.gif)
206
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
207
![](/Images/OutliningIndicators/InBlock.gif)
208
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
209
![](/Images/OutliningIndicators/InBlock.gif)
210
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
211
![](/Images/OutliningIndicators/InBlock.gif)
212
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
213
![](/Images/OutliningIndicators/InBlock.gif)
214
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
215
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
216
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
217
![](/Images/OutliningIndicators/None.gif)
218
![](/Images/OutliningIndicators/None.gif)
219
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
220
![](/Images/OutliningIndicators/InBlock.gif)
221
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
222
![](/Images/OutliningIndicators/None.gif)
223
![](/Images/OutliningIndicators/None.gif)
224
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
225
![](/Images/OutliningIndicators/InBlock.gif)
226
![](/Images/OutliningIndicators/InBlock.gif)
227
![](/Images/OutliningIndicators/InBlock.gif)
228
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
229
![](/Images/OutliningIndicators/None.gif)
230
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
水平有限,难免有错误,望能和大家多多交流!
例子代码下载:/Files/fxb248/ajaxtestaaa.rar