数学建模社区-数学中国

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

作者: 拉克丝    时间: 2015-4-16 16:14
标题: ajax对象常用属性,事件,方法大小写问题的总结
最近发现ajax版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。  V  Y8 k% \* c  h' S3 l
/ q5 M4 @6 X  M: k
  下面是ajax对象的一些常用属性,事件和方法
7 r0 n$ c, P, e) s( B, z  1)标准的ajax对象的属性有readyState,status,responseText,responseXML, i5 Z1 r: ?% ^" }4 W
& k( p) y: [" u% W$ p+ Y, J
  2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。  
, ]; O% D/ A3 W# U/ @; p# {[backcolor=white !important][size=1em]Visual Basic code, i$ F1 j1 `/ E% E( j
[color=white !important][size=1em]?

" }. r! i& G, U. o
[size=1em]1

1 o( Q" ]6 j' K6 P/ D
[size=1em]2

6 T2 x# G& c0 X" z
[size=1em]3
! B7 I  G# @8 h: c( E& a
[size=1em]4

: m2 O/ m( }: j2 L1 m# f6 Y
[size=1em]5
- Q- Q5 Z4 g& N- [; h: j
[size=1em]6
" g" F1 P# l+ g2 K! b
[size=1em]7
2 K! B5 F, U* i: E: t
[size=1em]8

% u9 f1 d& M# P7 A& P8 E
[size=1em]9

" x: z6 Y. h6 D4 v0 [8 D: \6 u
[size=1em]10

9 |! b5 b8 O' ^+ K, V
[size=1em]11
! P4 g9 \, t5 m9 m* s2 o8 @
[size=1em]12
9 Y; k1 N7 p" X% h1 N" N
[size=1em]13
/ D/ t0 F5 |6 q! i" x
[size=1em]14
) [0 G4 C8 }. t/ T  T  @
[size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串
' s) l- R# v% S% ^6 k! e[size=1em]     strreturn = ""
/ _0 @/ d2 M+ m+ e. I* e[size=1em]     for i = 1 to lenb(vin)3 z9 n, n! `; m9 j8 Q$ @( ~
[size=1em]     thischarcode = ascb(midb(vin,i,1))
) R  m3 N5 R. U5 x# J; w$ {) \' i$ Y[size=1em]     if thischarcode < &h80 then
8 c. Q0 S$ {& S% u  A[size=1em]        strreturn = strreturn & chr(thischarcode)
; F( G! d; k  g/ d9 R( v) n- [[size=1em]     else8 s/ ]( L& q% Q  ?% i
[size=1em]        nextcharcode = ascb(midb(vin,i+1,1))0 b3 Z* A5 N7 r. k0 A% a
[size=1em]        strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
1 }& i: }8 s3 U. D; I[size=1em]        i = i + 1
) R1 r9 `$ d( ~% @[size=1em]     end if; ^3 U. q% g# M  x
[size=1em]     next
- a) C& |& ^0 C& k6 y/ s* s[size=1em]     Bytes2BStr = strreturn
% D+ K. @: p# Y[size=1em]End Function4 U: ?- E& d1 R! L$ x  Z3 T6 ~  l

1 N! H( D+ T1 D9 t+ n1 p7 Z! y2 w
0 T, |8 B; b2 p' {% \0 X* H
( H# R6 c0 Y, j' @* y" U

2 N  u% K; }/ [1 |6 ^5 H
1 t2 g9 j+ V4 W: t2 N
4 P% A% N  C8 ^+ O  3)事件onreadystatechange,状态转换函数. ]' ?/ M) Q% l. |% }

* o) k2 j  T, @& z/ V3 {  4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。5 W* O; i, V3 {  c( C$ h, i
参考1 c$ b' X8 O8 n
ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容/ k; w9 \3 k* O! p0 i
2 w' s  h* F- U
  容易出现错误的问题, l% p  n7 r% c1 A* x0 s9 b# Z
1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。1 N) `' p' w2 x3 Z9 @* J
9 g, `$ n: }% h9 I* G3 E" P
2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写6 k/ s' F( J$ C! N
0 x) `- h) h4 K! V7 F( }6 F' ~" Z
3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写
- K1 W8 B, Z9 L- _; P: w
& P5 o! r+ s4 V; d4 n. W& x+ p3 m4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。
. `% P( K# ~0 Y* @- @* h! z! A4 m  特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。- u4 Y6 `( ~: G5 N9 ^) H, \& |7 x9 _

7 z/ W( p  R0 `' Z/ I9 f  对于手写ajax代码一些建议
. m# T& H/ _# i  a1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。) J7 q9 j- Q; E: }
参考webservice json
& X( n4 o4 A9 I) k* W
. m% c% r! D1 b8 c' C4 L; }8 d2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);. R$ b' F' b8 A3 ^2 j( a- k: G
+ S/ s: P# ]) O
3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded
! z& P" D& w4 R) B0 m6 G% V; {, e' t# @# _9 H( |. g
4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用
& _' c# y+ a/ [9 W' R7 g' P9 C" {' |% w% q& w
[backcolor=white !important][size=1em]JavaScript code
( M7 v, Q3 |8 W- {' N7 o
[color=white !important][size=1em]?

" ~, m. [( t& M% L6 V
[size=1em]1

6 k, H* C! u+ y& h; W* d  w5 o& |
[size=1em]2

! q2 F! `4 O5 {
[size=1em]3
* B; V! z& J. t6 C; ~
[size=1em]4

' }3 Q7 w5 k+ R! d& n
[size=1em]5
2 R- l$ O1 }- h! ~# b, J# s
[size=1em]6
0 T: _5 S! a2 K. u
[size=1em]7
* G1 p5 d; b+ X$ Y2 @
[size=1em]8

* [  r1 |- d- R  M% g( x
[size=1em]9
! t5 s6 A8 h' ~/ w, [7 n5 O
[size=1em]10

, b8 X7 j: A* C. U" g4 X# J  A
[size=1em]11
/ H8 g  l+ l# H" P. b* R$ n+ y3 r  A
[size=1em][size=1em]      var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");) v$ V2 p( [1 D" h) W  n% m$ u
[size=1em]      xhr.open('get', 'index.html', true);; `( B% {8 ?; w0 _7 r
[size=1em]      xhr.onreadystatechange = function () {
: O/ ^% V! P3 ?. d9 m: g1 A[size=1em]          if (4 == xhr.readyState) {
" Q+ ^2 a1 K2 N# d1 l' D  X[size=1em]              if (200 == xhr.status || 0 == xhr.status) {
; Z: |+ f% g1 h9 g! W, k; g1 ][size=1em]                  //=========正常返回后的处理代码  l- R, q$ S6 r+ x) n0 b" W% q; J( m
[size=1em]              }
( n: a0 F8 O9 l' k[size=1em]              else alert('动态页出问题了~~');
: i4 B) X/ S8 q3 ][size=1em]          }
. s( A7 b% o! h1 T( [[size=1em]      }
. V$ U6 G7 l7 V5 `  X[size=1em]      xhr.send(null);
: I; g' R3 }5 ^9 u8 v) v
6 c8 u& c* Y3 h1 a. s2 K
5 L+ N) D0 l5 h  E
. w% [7 V" i/ R8 {' V0 S
9 D1 s' a, M. ~# }
0 O; a/ ]3 N( O! C+ j

0 {" ^. P( H5 p: L2 {. h( u, m. b8 b3 a1 }, s. L5 ?
5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。
2 \0 Q8 ?7 k0 Q% M! a# O9 y如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。
4 ]  K) Q8 i% k& c3 f




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