数学建模社区-数学中国

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

作者: 拉克丝    时间: 2015-4-16 16:14
标题: ajax对象常用属性,事件,方法大小写问题的总结
最近发现ajax版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。* u0 |5 g+ d1 X) S

" `  V, b- F5 D% \  h1 I  下面是ajax对象的一些常用属性,事件和方法
$ |$ }7 ^+ `% u& K. W) ]+ y! V$ g  1)标准的ajax对象的属性有readyState,status,responseText,responseXML
8 [$ c" p6 p5 _7 j/ z/ y' }
# U4 u( u9 O- J, f  2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。  ) a, w# X& L6 D! }
[backcolor=white !important][size=1em]Visual Basic code
& V& v/ a2 W; l  m
[color=white !important][size=1em]?
% h% F0 B( ], H9 z
[size=1em]1
5 s/ K, F8 ?7 c( q
[size=1em]2

7 g- d( X2 c3 O, b: }( G1 N
[size=1em]3

2 g* c& D" j- z
[size=1em]4

1 |" W* j0 c" s2 J; T. ^2 I- \
[size=1em]5
7 n% X. w- N  K/ r+ M2 X
[size=1em]6
4 ^! {) b& q$ c8 [
[size=1em]7
# j. o* d8 c: @! d- u
[size=1em]8
: X6 ?4 J& M- U1 r
[size=1em]9

& x' V$ l- |' ^
[size=1em]10

1 O" f5 z3 c) z. t/ H2 |, p8 L9 I; D: @
[size=1em]11

- |) j( [0 t9 u1 J, P: I
[size=1em]12

3 ~  G; W/ [9 ~9 ]# S( }# r
[size=1em]13
# L7 I* @& T0 Y4 k
[size=1em]14

: g! I" b6 l' d! v" N
[size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串
& i1 U" K+ X8 T' f9 r. I[size=1em]     strreturn = ""% U3 Z* o3 k( }
[size=1em]     for i = 1 to lenb(vin)- M  s& M3 L3 D  G1 \' }, W
[size=1em]     thischarcode = ascb(midb(vin,i,1))
- _% w9 Z5 z7 Q% {4 S6 |, E[size=1em]     if thischarcode < &h80 then
8 \# n8 e5 u$ Y' W4 Y- F[size=1em]        strreturn = strreturn & chr(thischarcode)
+ J7 b* V; O- p4 d& b3 Z* v2 p$ i[size=1em]     else
* y+ h4 M; K/ L1 _8 P' d2 V' g[size=1em]        nextcharcode = ascb(midb(vin,i+1,1))
( D" a* l1 U, t7 _0 v[size=1em]        strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))' V5 \4 U" U  \( T6 {5 U
[size=1em]        i = i + 1
3 h4 S9 m! ?5 ~3 \2 K$ a' ~# A8 ]; L[size=1em]     end if
$ D7 r+ y) u! X7 B, m3 Z# y[size=1em]     next- I% Z7 {0 ^; U" \( t, [  Z
[size=1em]     Bytes2BStr = strreturn
" o1 H; z0 Y" z1 Y# C  P[size=1em]End Function( N3 L3 K1 o* z2 M) |2 W8 R1 [
, P" A8 d# P( [/ {4 P6 H

7 n; b% C/ s: Y( P, @8 T
+ Y  h3 [6 l$ o+ a' `2 w
2 p% M* T- q4 p- S1 L* y$ Q6 \; ?; \
% r, l* h( m0 T0 \
  3)事件onreadystatechange,状态转换函数
1 _2 \' Q% Y# }2 W1 k( Y" G- t3 U: e8 o6 D5 l
  4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。
/ X. I  ~! G3 R: ?" Q9 z参考
+ [) s* ^/ f6 S# g1 R% U/ O/ S, majax指定为post但是未设置content-type或未指定键时时如何获取提交的内容
" q& u3 j' M! g% s3 {( i; A) y& a/ Q: W! \
  容易出现错误的问题0 `3 A1 u$ j, j" W0 F7 [  V
1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。5 O& X3 S5 x' w2 r
1 o( ?! Y3 p+ a/ Z. L
2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写
1 F0 H  Z6 A8 Z& G+ m7 U9 f) e* q7 ?6 S3 ?. g5 V9 ]
3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写/ ?3 A+ Y# |% Q' k# w" i4 j& i" [

+ v  @8 J# f6 r/ Q# t8 s6 O4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。
/ b' M7 h& Q5 T; K  特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。6 z$ N* d2 r1 e

6 @: Y+ n6 v$ K9 _- a, I  对于手写ajax代码一些建议+ i9 [8 e! F2 e
1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。/ T0 H7 a  D* o" x
参考webservice json4 s& _8 z# y+ G# f: J

3 `# y* ^3 w$ ]8 {8 Y5 v7 G$ X2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);
* f9 o0 \8 [6 Q+ B" w
3 f2 Q: f# d- V' P3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded
9 |8 u  u% H7 R+ q+ f; d% H1 I* [5 A/ ?1 L6 |9 `/ F
4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用, F$ G3 V7 {- F1 ^/ C
2 D7 ]) ~4 R# a% O
[backcolor=white !important][size=1em]JavaScript code
4 d9 b. _% H/ T) D5 m; @! ~5 \
[color=white !important][size=1em]?

4 |- W' S( u8 Y* J( a: |- H
[size=1em]1
# h# d! K( p& t
[size=1em]2

0 [- v- ^/ l6 M6 e: W
[size=1em]3

; |6 D& ]: d' y' L
[size=1em]4

' M! z5 G" k( C5 K; o$ G7 }
[size=1em]5

0 X, y! r% I* d2 v% Y" Q4 N: q
[size=1em]6
% W# E/ c, A. K% n* D' u% Q
[size=1em]7
, W4 k1 K/ Q4 I: g, S
[size=1em]8
( \5 m+ L6 j" t+ y
[size=1em]9

5 i$ t' S1 h8 ^" `6 `
[size=1em]10
& \& C, y6 C' S$ ]8 K
[size=1em]11

2 ^5 |4 L" h* J' o% X$ t
[size=1em][size=1em]      var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
- D! ^+ o: X1 ][size=1em]      xhr.open('get', 'index.html', true);$ J( N3 n( o. T9 J: e8 F1 x
[size=1em]      xhr.onreadystatechange = function () {% `: q  M+ x3 O; j+ \1 T
[size=1em]          if (4 == xhr.readyState) {& L( z$ k( ~9 n3 j3 t
[size=1em]              if (200 == xhr.status || 0 == xhr.status) {6 q  ?0 A: s( y6 G" W( g% K0 _9 [
[size=1em]                  //=========正常返回后的处理代码8 _4 a( X4 g: n% {, C
[size=1em]              }2 S8 S2 g0 [3 P
[size=1em]              else alert('动态页出问题了~~');
  L  T9 q6 I- Z[size=1em]          }
  c. D; \4 }( S( p[size=1em]      }, ]4 }+ D- B- X
[size=1em]      xhr.send(null);4 O  j: ]; v6 Y8 ?
* o) D8 A, o  ^9 o/ E$ ^
; M& q5 E/ u2 j7 [# y* a, _
' c" D8 A! S2 C+ R) R6 E8 V

  _1 M) }8 g% N0 v- ?& R; }/ m
; P& j, x3 V* y4 V# u* `5 r" @( y0 n( d0 S2 f
% R) ~! G, _: Y2 {2 S
5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。
+ b" A; c# Q1 {8 U; [" a3 H如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。
# @8 ?/ k3 C! S* V1 k8 o3 K; \; A8 a




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