数学建模社区-数学中国

标题: ajax对象常用属性,事件,方法大小写问题的总结 [打印本页]

作者: 拉克丝    时间: 2015-4-16 16:14
标题: ajax对象常用属性,事件,方法大小写问题的总结
最近发现ajax版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。
2 p- u5 N5 U- z9 G# v
: f" N; A, x' Q  下面是ajax对象的一些常用属性,事件和方法/ D2 E) n* b8 x- }3 D
  1)标准的ajax对象的属性有readyState,status,responseText,responseXML
" f0 ~& R* L% d! w9 T) [9 Y
3 ]! I! A5 z/ q8 I7 H  2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。    g9 u- C% C# D- m3 O# S
[backcolor=white !important][size=1em]Visual Basic code
$ F( F( C2 S; O5 Y
[color=white !important][size=1em]?

7 P/ I8 n$ X* l6 j& D* \
[size=1em]1

6 ~+ g$ A) h, W5 F3 r% ]4 m
[size=1em]2
2 W/ j; ?5 _8 _  F) A5 y1 l% ?
[size=1em]3

3 r* q4 K" B2 S2 M5 Y) [
[size=1em]4

& \  W3 F% O7 x7 e
[size=1em]5

: q" S8 W" t) W7 t7 V( _+ C
[size=1em]6

. q& K! c9 _* R. {4 c' C6 o1 R3 ]
[size=1em]7
" @( D6 x2 N: |  @) h4 P# y& Q
[size=1em]8
0 V1 K3 t  Q9 ]( G7 E4 |
[size=1em]9
* v, J& I6 ^" G8 B) ]% O% y
[size=1em]10
( D# F0 o2 X6 p1 \
[size=1em]11

7 y: i2 L3 S& z& G! a
[size=1em]12
( K% m7 e4 S) y) R3 p+ q4 r
[size=1em]13
7 l: a0 e2 k. {- F$ G" m
[size=1em]14

& M( I* v$ K6 Q3 ~2 D6 m
[size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串2 X4 g$ J& J2 ?/ x
[size=1em]     strreturn = ""- F# Q* D) \7 A
[size=1em]     for i = 1 to lenb(vin)2 A2 l/ X1 u0 [+ L7 j- [6 F, J
[size=1em]     thischarcode = ascb(midb(vin,i,1))
+ q7 G$ P& a* Z5 C6 W7 l[size=1em]     if thischarcode < &h80 then
, u# c& o) q: `5 d+ p' o[size=1em]        strreturn = strreturn & chr(thischarcode): B4 `5 ?$ G3 S1 r+ E3 h
[size=1em]     else
* N5 T0 z- b  H- K! x2 _[size=1em]        nextcharcode = ascb(midb(vin,i+1,1))
- O7 W! H6 A$ a8 l5 L3 b[size=1em]        strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
" a4 d7 U- {3 I( |5 O! U* e[size=1em]        i = i + 1
. L8 ^& Y1 p" U1 X[size=1em]     end if* \+ [# m& j" }4 L. W+ v
[size=1em]     next
: s" H9 W  j" Y- N9 a' U8 e[size=1em]     Bytes2BStr = strreturn
. P9 g% F1 V. o[size=1em]End Function/ l! g  m& c& M% f9 M

/ r1 N6 T- i4 C9 L
7 i" @/ B5 ~. B  U* n" Q: V5 |2 T
' H2 ]( S. J4 H) l
. ^7 F4 N2 F2 _- U" ]" I. k$ p/ {

% s: Q0 p$ k1 [; H" B0 n1 U: e" r6 |% @# Y6 V* k3 W+ {2 b$ L
  3)事件onreadystatechange,状态转换函数- r$ H9 M8 y9 C

7 j2 R: b$ O( A" k' Z4 }* J. E: p  4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。0 j' E* Q2 x  g& k5 `; [/ d
参考; y1 q  j+ B+ I$ I
ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容) ^0 Q0 J% d* A, o
9 W2 {8 p1 j0 Z" s# E
  容易出现错误的问题# K6 ^: C8 M. L+ y' o' T
1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。3 y. z/ ]* g; p* p3 t8 j3 l. t

# y8 P( ^  b0 _2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写
/ k. B  a5 U) t- K) l6 ]* B) C2 B( K4 y6 F. m
3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写6 M9 A* C8 l/ D* _) H& p
4 {" h' o" K% G
4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。
  y4 S: g1 Z7 t5 ^2 c  特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。9 g/ k  |# k# k8 D
7 T: \2 b% n1 d% E" L5 z: j& s% O& z
  对于手写ajax代码一些建议) F6 n4 u" l" E* |1 k! C. [) y  A0 L- I
1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。
# ^$ P3 Y6 {9 _  h0 t& I' p8 D参考webservice json' x8 ~# I( |' V% U, A
' O& z$ Q0 c! i$ O% n
2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);  \) j% d7 S' R9 H+ ]$ q& ^

5 Q% [: s8 t/ Y4 }0 l& ~' H3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded
& s9 n- S3 H7 P! K0 K1 j0 n, e& k  G& h/ Z0 t; ^
4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用
, h/ t. T" S$ z6 b/ C$ w' f) B; Z1 |0 @: R& \6 P
[backcolor=white !important][size=1em]JavaScript code4 o2 }, k# T4 W9 T/ e; X7 v
[color=white !important][size=1em]?
6 q( b" s- B. @  t- Q3 X! j7 Q4 h
[size=1em]1
8 Z+ `& m7 N. S: v) P0 E
[size=1em]2

3 D8 s" |. h1 |' i+ b$ }# E
[size=1em]3

/ ^8 \+ a7 T6 G2 p, P
[size=1em]4

% J8 b; ^) o  x1 n+ W& s+ `, H5 ?
[size=1em]5

) K& @  F/ d( ]: @
[size=1em]6
7 v, m, A5 D7 i, E( x3 ^& I, W+ p
[size=1em]7

' Y7 [1 e' t1 @& s% d0 X2 w
[size=1em]8
4 T8 C5 l( B) r& C6 d7 n
[size=1em]9

5 f$ F0 U" u% B
[size=1em]10
/ v* l5 m1 r. A; j4 k/ L
[size=1em]11

$ I5 Z7 F. f0 Y! I
[size=1em][size=1em]      var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
7 n- S4 U$ N0 G[size=1em]      xhr.open('get', 'index.html', true);& }- j. x2 T* s/ V' B  i3 U
[size=1em]      xhr.onreadystatechange = function () {( k: ]" b5 \2 y$ ^4 G
[size=1em]          if (4 == xhr.readyState) {
- K' S* ?  u3 q# m. Z* ?  B2 {[size=1em]              if (200 == xhr.status || 0 == xhr.status) {
9 ]% C1 M; r9 I* U[size=1em]                  //=========正常返回后的处理代码" Y( F) S7 H  r, K7 C- w5 ?
[size=1em]              }
* L( D6 p9 G! V) a1 I7 h% V9 Z" V  K5 F[size=1em]              else alert('动态页出问题了~~');# F# U9 H" f! m! T
[size=1em]          }  E4 h: g( g4 C* K7 u
[size=1em]      }
, n& e; ^- s' ~" s[size=1em]      xhr.send(null);7 ]5 U& [, `: o' K, s  S
9 ~) I% t, A# |; v4 Y+ ]
- T- j4 A9 W/ n! ?5 k
4 N1 A; v2 x0 h6 ?! s
% y  V6 W6 @) x5 f5 b$ m+ F% H
7 O* H7 R, b4 u' \' [; X0 f! \

* L* X: ^$ Q+ Q! n3 T4 D! Y# X, ?( D* ~5 A5 C
5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。  b+ n# ]% s- W* o
如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。
0 n2 V# O5 x+ O2 X9 b" }




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5