数学建模社区-数学中国

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

作者: 拉克丝    时间: 2015-4-16 16:14
标题: ajax对象常用属性,事件,方法大小写问题的总结
最近发现ajax版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。
1 X: O$ F* t; D( y. D  M  k* A7 G6 \, Q7 L* [/ s6 r0 O
  下面是ajax对象的一些常用属性,事件和方法
6 J. G& r+ S6 n  1)标准的ajax对象的属性有readyState,status,responseText,responseXML
# m+ e4 o. F: V0 i0 h0 t2 L) x; o: k& X5 o
  2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。  5 X3 i) z9 C" a
[backcolor=white !important][size=1em]Visual Basic code! \: L5 i/ h% \, m
[color=white !important][size=1em]?
& k- a! ?4 S! w) x" k
[size=1em]1
; D8 s, u) a4 I6 [+ }, D! d
[size=1em]2
) ^2 U% d5 C, k7 Y4 I) R+ O; s& G* E
[size=1em]3

" Z) P- n7 d& b1 U, a
[size=1em]4

5 G" s# a! D3 U3 t7 e/ [6 ~
[size=1em]5

. j5 f- W% ]; }- E, S$ k- ^/ d
[size=1em]6

( k/ U- T7 t' F
[size=1em]7
6 g, Y' m1 O. v
[size=1em]8

3 z. [9 o$ y4 P  a& ]6 v9 j2 m: U
[size=1em]9

6 Q1 A# E( v% _( v; L
[size=1em]10
/ f% I' ?8 o' @& d; E
[size=1em]11

' \# P& O! p7 c" y* ~  C2 H! z# M6 A
[size=1em]12

% x. e: b$ S: O- K9 F5 D
[size=1em]13

' k- R1 R4 T! Q: _" ]4 P# n
[size=1em]14
% ^( X& w5 W$ g% @, Z1 Q% _2 ]) Q
[size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串6 x, h0 \% L# C$ c
[size=1em]     strreturn = ""
8 p! `8 [# ]3 f; ?+ B3 Z8 U[size=1em]     for i = 1 to lenb(vin)
' O6 q- U3 \2 R' B[size=1em]     thischarcode = ascb(midb(vin,i,1))
' z3 K* y9 P5 e# Q! Y/ f) r  b) V[size=1em]     if thischarcode < &h80 then
* P1 F: I* E: A3 X* n3 J' i' x[size=1em]        strreturn = strreturn & chr(thischarcode)
! T2 _. U5 C: \2 W# n[size=1em]     else# ~) j+ M* p0 s
[size=1em]        nextcharcode = ascb(midb(vin,i+1,1))
: c1 Z. q4 ~' M5 }[size=1em]        strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))' C+ e3 v- E( T9 U0 X
[size=1em]        i = i + 1# R: X4 k( x$ b5 c$ X. \
[size=1em]     end if4 G: E: A8 w/ H$ _: N
[size=1em]     next
4 o. x; `6 l9 S[size=1em]     Bytes2BStr = strreturn* @. s" `3 m6 G  v6 w4 i7 P
[size=1em]End Function' S  A9 ^( p  s( p2 k, R

+ Z! r- ?& Y* m4 g! X  H

1 l: s! N3 `5 ~2 Y/ a  D1 L, r  ~, d- Q* n- c
+ E! Q% a! e- K, q, j6 f* H

% Q" H; e3 p) t7 O( @" y" N# a5 F, Y9 @
6 X2 c3 ]3 s) E  3)事件onreadystatechange,状态转换函数
) S, ]. J$ O" s) p1 _4 C3 F' q  ~; B, \' `5 f% ~+ B
  4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。
3 k- A/ p7 E; @' f参考+ Q2 M! G7 R  B! }  p5 O
ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容
( _. a( d7 e1 v6 H- M  ^% a5 K
! G2 s6 [- N( W& m2 f  容易出现错误的问题
5 M% D6 D6 \# ?* j1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。
  x9 ^2 p" I- {2 r0 e1 E& i3 H0 [! m" y0 a# O; p
2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写& D' l5 R- ?4 N# F

( ]7 a" G: R+ M3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写: t0 q8 Y" G5 N) j7 I7 b( L

- C: j, k' D. ]9 d" }' M$ L4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。
* C3 S5 h6 m. c: ^  特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。4 O8 w, J6 a% R' ?; Y1 A

1 N! U. i3 J( z! b+ y/ {! Q8 O  对于手写ajax代码一些建议
! S5 n3 E4 H$ r" E$ r$ G( x1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。7 l' b7 S- ]& h3 ^& C1 [  Y6 A
参考webservice json
. M" l8 K, S; A8 n; x( }3 P. ]
5 N. C7 }, o- p3 B, W0 a2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);
+ U6 u% x! {3 O5 b! i+ A! [; t- v( [
3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded
- s* p) Z) T' b  P: ~% H1 E  J
4 ]2 q" j4 C0 M* E# y$ J: N) i$ \6 E4 t# t4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用
5 Z. L3 v8 [) }% f$ j! m
, M& Y3 P6 }+ O& ?[backcolor=white !important][size=1em]JavaScript code- I3 T; o  K; [" f0 f: M6 t
[color=white !important][size=1em]?

7 L1 S' F+ q/ e7 o$ Z: B
[size=1em]1
: @( A  d% w3 L8 |
[size=1em]2
4 J# f$ U# }5 q3 `
[size=1em]3
) G0 @; N2 i4 C. `
[size=1em]4
" ?( h" U% S7 s; ^+ j3 X- k* O: D* l
[size=1em]5

/ Y6 b3 v. M8 t4 T
[size=1em]6

0 z" L9 v  m4 ^2 `( ~+ }5 s3 R
[size=1em]7
0 M2 w$ m4 a8 c: i7 n
[size=1em]8
7 w8 r6 n- P6 F! \! Y: \& r
[size=1em]9

' D0 X1 A7 H( S7 q; ^+ h, P6 Y( n% c) H
[size=1em]10

6 Z. w- T/ v/ g5 q) p
[size=1em]11
; ]( R! l$ K6 b
[size=1em][size=1em]      var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
* Z: z$ a+ ?/ b! A; J# I. g" P* C[size=1em]      xhr.open('get', 'index.html', true);
2 |9 T& o+ C3 f9 h[size=1em]      xhr.onreadystatechange = function () {% `# T1 H2 n' ]" i# b7 i# q6 G9 w
[size=1em]          if (4 == xhr.readyState) {
! A$ ^4 C( F3 V/ d; @3 ][size=1em]              if (200 == xhr.status || 0 == xhr.status) {
$ |; @) v" q+ j! s[size=1em]                  //=========正常返回后的处理代码1 z$ s: m4 ?3 z8 `) r
[size=1em]              }
0 M/ c4 W9 l( t. f: M3 E. A- e" m& g[size=1em]              else alert('动态页出问题了~~');* K" N2 ^8 `% ]
[size=1em]          }
% r" a( l) K9 Y* r3 a, Q[size=1em]      }2 C6 q: E2 P' D6 [  k+ q
[size=1em]      xhr.send(null);5 L9 [, F) \+ B: K/ t4 p
; p& H4 P8 N* z' d8 F

3 j6 T3 ]- \/ |# ]$ D( I! W* D  b4 |% t
) ?+ x6 E8 ~; l$ A8 S- D
" F6 m+ M. Q5 {+ r; _6 X7 ?; Y
1 `$ p% O9 G0 u" ?+ e

% D4 B! o* i: ]$ j9 J+ y5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。
  t" E1 z2 O  e$ R: i; t如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。1 g" _5 U" ^& d0 C* }/ P7 E* r





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