看下面的代码和执行的显示结果,思考一下为什么会出现这样的结果,为什么 onreadystatechange 会执行多次。要回答这个问题,我们先来看看 onreadystatechange 的作用。
“onreadystatechange 是一个事件句柄。它的值 (state_Change) 是一个函数的名称,当 XMLHttpRequest 对象的状态发生改变时,会触发此函数。状态从 0 (uninitialized) 到 4 (complete) 进行变化。仅在状态为 4 时,我们才执行代码。” 每次XMLHttpRequest 对象的状态发生改变时,会触发此函数。一共会触发 4 次,从 0 到 4。
1
<
script type
=
"
text/javascript
"
>
2 var baseUrl = " http://g " ;
3
4 var divObj = new Object();
5
6 divObj.url = new Array();
7 divObj.url.push( " /index.php/Service/Salaallot " );
8 divObj.url.push( " /index.php/Service/Salaallot " );
9 divObj.url.push( " /index.php/Service/Salashelve " );
10 divObj.url.push( " /index.php/Service/Sbch " );
11 divObj.url.push( " /index.php/Service/Servicesend " );
12
13 divObj.name = new Array();
14 divObj.name.push( " Test1 " );
15 divObj.name.push( " Test2 " );
16 divObj.name.push( " Test3 " );
17 divObj.name.push( " Test4 " );
18 divObj.name.push( " Test5 " );
19
20
21 // 创建DIV,DIV1....DIV5
22 var ajax = createAjax();
23 for (var i = 0 ;i < 1 ;i ++ )
24 {
25 var bDiv = document.createElement( " div " );
26 bDiv.setAttribute( " id " , " div_ " + i.toString());
27 if ( ! [ - 1 ,])
28 bDiv.setAttribute( " cssText " , " width:98%;height:15%;float:left; " );
29 else
30 bDiv.setAttribute( " style " , " width:98%;height:15%;float:left; " );
31 document.body.appendChild(bDiv);
32
33 var tDiv = document.createElement( " div " );
34 tDiv.setAttribute( " id " , " div_ " + i.toString() + " _t " );
35 if ( ! [ - 1 ,])
36 bDiv.setAttribute( " cssText " , " width:100%;height:20%;float:left; " );
37 else
38 bDiv.setAttribute( " style " , " width:100%;height:20%;float:left; " );
39 bDiv.appendChild(tDiv);
40 tDiv.innerHTML = divObj.name[i];
41
42 var fDiv = document.createElement( " div " );
43 fDiv.setAttribute( " id " , " div_ " + i.toString() + " _f " );
44 if ( ! [ - 1 ,])
45 bDiv.setAttribute( " cssText " , " width:98%;height:80%;float:left; " );
46 else
47 bDiv.setAttribute( " style " , " width:98%;height:80%;float:left; " );
48 bDiv.appendChild(fDiv);
49 ajax.request.open( " GET " , baseUrl + divObj.url[i], true );
50 ajax.divID = " div_ " + i.toString();
51 document.getElementById( " test1 " ).innerHTML = document.getElementById( " test1 " ).innerHTML + " ---- " + ajax.divID;
52 // alert( ajax.divID );
53 // if(i==divObj.url.length-1)
54 ajax.request.onreadystatechange = updateDiv;
55 ajax.request.send( null );
56 }
57
58
59 function updateDiv()
60 {
61 // alert( ajax.divID );
62 document.getElementById( " test " ).innerHTML = document.getElementById( " test " ).innerHTML + " ---- " + ajax.divID;
63 if (ajax.request.readyState == 4 )
64 {
65 if (ajax.request.status == 200 )
66 {
67 document.getElementById(ajax.divID).innerHTML = ajax.request.responseText;
68 }
69 }
70 }
71
72
73
74 // 控制事件按顺序执行,托管
75 function ajaxQueue()
76 {
77
78
79
80
81 }
82
83
84 function createAjax()
85 {
86 var request ;
87 try
88 {
89 request = new XMLHttpRequest();
90 } catch (err){
91 try
92 {
93 request = new ActiveXObject( " Microsoft.XMLHTTP " );
94 } catch (error){
95 request = new ActiveXObject( " Msxml2.XMLHTTP " );
96 }
97 }
98 if ( ! request)
99 {
100 alert( " createAjax Error! " );
101 } else {
102 this .request = request;
103 return this ;
104 }
105 }
106
107
108
109 </ script >
2 var baseUrl = " http://g " ;
3
4 var divObj = new Object();
5
6 divObj.url = new Array();
7 divObj.url.push( " /index.php/Service/Salaallot " );
8 divObj.url.push( " /index.php/Service/Salaallot " );
9 divObj.url.push( " /index.php/Service/Salashelve " );
10 divObj.url.push( " /index.php/Service/Sbch " );
11 divObj.url.push( " /index.php/Service/Servicesend " );
12
13 divObj.name = new Array();
14 divObj.name.push( " Test1 " );
15 divObj.name.push( " Test2 " );
16 divObj.name.push( " Test3 " );
17 divObj.name.push( " Test4 " );
18 divObj.name.push( " Test5 " );
19
20
21 // 创建DIV,DIV1....DIV5
22 var ajax = createAjax();
23 for (var i = 0 ;i < 1 ;i ++ )
24 {
25 var bDiv = document.createElement( " div " );
26 bDiv.setAttribute( " id " , " div_ " + i.toString());
27 if ( ! [ - 1 ,])
28 bDiv.setAttribute( " cssText " , " width:98%;height:15%;float:left; " );
29 else
30 bDiv.setAttribute( " style " , " width:98%;height:15%;float:left; " );
31 document.body.appendChild(bDiv);
32
33 var tDiv = document.createElement( " div " );
34 tDiv.setAttribute( " id " , " div_ " + i.toString() + " _t " );
35 if ( ! [ - 1 ,])
36 bDiv.setAttribute( " cssText " , " width:100%;height:20%;float:left; " );
37 else
38 bDiv.setAttribute( " style " , " width:100%;height:20%;float:left; " );
39 bDiv.appendChild(tDiv);
40 tDiv.innerHTML = divObj.name[i];
41
42 var fDiv = document.createElement( " div " );
43 fDiv.setAttribute( " id " , " div_ " + i.toString() + " _f " );
44 if ( ! [ - 1 ,])
45 bDiv.setAttribute( " cssText " , " width:98%;height:80%;float:left; " );
46 else
47 bDiv.setAttribute( " style " , " width:98%;height:80%;float:left; " );
48 bDiv.appendChild(fDiv);
49 ajax.request.open( " GET " , baseUrl + divObj.url[i], true );
50 ajax.divID = " div_ " + i.toString();
51 document.getElementById( " test1 " ).innerHTML = document.getElementById( " test1 " ).innerHTML + " ---- " + ajax.divID;
52 // alert( ajax.divID );
53 // if(i==divObj.url.length-1)
54 ajax.request.onreadystatechange = updateDiv;
55 ajax.request.send( null );
56 }
57
58
59 function updateDiv()
60 {
61 // alert( ajax.divID );
62 document.getElementById( " test " ).innerHTML = document.getElementById( " test " ).innerHTML + " ---- " + ajax.divID;
63 if (ajax.request.readyState == 4 )
64 {
65 if (ajax.request.status == 200 )
66 {
67 document.getElementById(ajax.divID).innerHTML = ajax.request.responseText;
68 }
69 }
70 }
71
72
73
74 // 控制事件按顺序执行,托管
75 function ajaxQueue()
76 {
77
78
79
80
81 }
82
83
84 function createAjax()
85 {
86 var request ;
87 try
88 {
89 request = new XMLHttpRequest();
90 } catch (err){
91 try
92 {
93 request = new ActiveXObject( " Microsoft.XMLHTTP " );
94 } catch (error){
95 request = new ActiveXObject( " Msxml2.XMLHTTP " );
96 }
97 }
98 if ( ! request)
99 {
100 alert( " createAjax Error! " );
101 } else {
102 this .request = request;
103 return this ;
104 }
105 }
106
107
108
109 </ script >
运行结果,注意红色框框部分。