数学建模社区-数学中国

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

作者: 拉克丝    时间: 2015-4-16 16:14
标题: ajax对象常用属性,事件,方法大小写问题的总结
最近发现ajax版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。5 I' N( H8 h5 I! S0 `3 O9 U

# C+ U) c/ V! f" y' }  下面是ajax对象的一些常用属性,事件和方法
' a. O8 z* N" Z3 I8 C! K  1)标准的ajax对象的属性有readyState,status,responseText,responseXML
6 O% `6 D8 q9 [" ^9 S" P0 R# D$ M# C% I: a$ C* J
  2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。  $ U0 n. B1 R) f. E, B
[backcolor=white !important][size=1em]Visual Basic code
- d* ?5 a6 K0 H% ?9 @! E* u
[color=white !important][size=1em]?

! k# I# G7 K* T; X
[size=1em]1

: z7 R9 p- d7 a- `% H' v
[size=1em]2
# o! t! t2 s" u+ V" C1 T  R$ V
[size=1em]3

, J( U) h' Z- W' i+ ^, w
[size=1em]4

$ v# S/ I/ l0 e
[size=1em]5
+ s$ g/ `: h3 B- r' T. O5 c: j- ?
[size=1em]6
  z" E, S) R+ v6 F# w) z+ C
[size=1em]7

) y7 X/ k2 q5 J3 n8 K7 @2 \
[size=1em]8
' z, |2 W7 M# A7 W# N
[size=1em]9
( L: Y* [  Z6 `/ E* r7 F. U7 }
[size=1em]10
4 @* k$ L# l8 r0 ~3 E
[size=1em]11
: P& K) G0 p$ e% {5 T
[size=1em]12

+ s' `: u( n% c1 Y0 l4 K2 N
[size=1em]13

1 i4 Y2 K7 t( y, T# L: R$ V* [
[size=1em]14
6 P- G. l9 J' Q. ]
[size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串5 u$ \1 q2 d* X; Q
[size=1em]     strreturn = ""9 p3 K8 g( I2 H' l3 \
[size=1em]     for i = 1 to lenb(vin)6 H0 s: r" w  ^& A& l& ]
[size=1em]     thischarcode = ascb(midb(vin,i,1))
% D. p; t' P; f0 W* R[size=1em]     if thischarcode < &h80 then5 o/ L) G# K( r
[size=1em]        strreturn = strreturn & chr(thischarcode)
1 K# V# X# V* c( B  c4 [[size=1em]     else, r9 h0 F- Y, I- P5 f
[size=1em]        nextcharcode = ascb(midb(vin,i+1,1)): M: y2 ?" E  S9 V/ j
[size=1em]        strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
: a5 e0 E3 B* z; p% @) Y  i5 ~[size=1em]        i = i + 16 ^! R! S* U$ V  M. E' W
[size=1em]     end if
* s1 @; o5 g7 H[size=1em]     next: d1 K1 N& s8 A2 j& M3 [; I2 Z: q
[size=1em]     Bytes2BStr = strreturn6 b' K! e' k4 _, n. z
[size=1em]End Function. P: ]( V; j; ?' k$ P  d

: V6 [  K6 ^# \" I
6 m" @4 Z$ t- v. T9 [

# q( h5 B* [  ~2 g' B. d/ S3 D# a5 u. ?3 o! N' Z
" s5 h1 ]# C/ t

' k5 t, |1 l' N/ E  3)事件onreadystatechange,状态转换函数9 N0 Z: k; S7 O
) L  E0 C4 l5 C9 \# b
  4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。
) m: X: R0 b1 n$ M) U- f6 a7 ~( N参考# x' m% V: ]. @
ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容
9 B5 z7 }9 Y6 i6 L( C. b% m. {$ F! }4 |. ^9 G' W0 T
  容易出现错误的问题* Q; B4 o; r+ Q( k4 o
1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。
$ ]6 M/ n: X: R0 A( t9 `0 C0 D0 T
; r- J! t' c8 s7 N% d- v! h6 [+ E2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写# Q, d5 |  X$ o' m# [7 }  U! v

1 [" V+ G9 m( b5 ^1 Y+ R- A1 z9 ]3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写
7 X  l# d$ {; B, h) _( n* }/ }5 h8 y+ q
4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。1 k$ h& F& T  D5 N3 {5 g4 y
  特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。6 e. x6 W) K$ r+ O0 h

) K+ H% c8 P& w) B# m5 H  对于手写ajax代码一些建议! c' Y2 ?) [4 |
1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。, A7 H" _  x$ Q
参考webservice json4 A2 }0 `1 J; {! x6 H. z  p

+ P2 n: _  Y( |7 T( P0 C2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);
' _: [, b: e: z$ {5 `; W/ @% T
( A/ T" B  C4 m" H9 A, C3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded# A' L+ _* \2 V: x( r5 h) i6 E- k8 b
' E9 M( F6 g1 d8 D: `" D
4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用/ _& E; N4 h$ O; G0 {
3 d" L. I' f: r, l& g
[backcolor=white !important][size=1em]JavaScript code& T, t$ u; U$ d6 [" j
[color=white !important][size=1em]?

( D! v. W9 K% b1 F  [  I, g
[size=1em]1

% X& j3 Y! B: l$ [7 _
[size=1em]2
1 @0 V5 w  h( A' M) a! r
[size=1em]3
7 x% ^* u% U: u, r8 X
[size=1em]4
# Q1 F3 H5 E7 B9 S; H5 I
[size=1em]5

  ?' K) f9 A) c% V
[size=1em]6
- S, L% @/ _) v9 E; y6 g( \
[size=1em]7

0 a( [" i/ q, z( X8 x) H" K3 ^
[size=1em]8

9 b9 H4 j0 i" D
[size=1em]9

2 ?% q# g' V. ~
[size=1em]10

1 }' X! U8 _8 d+ ?( y$ a5 V
[size=1em]11

/ D! E7 \$ v4 R4 G
[size=1em][size=1em]      var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
" d" J, `! X& }[size=1em]      xhr.open('get', 'index.html', true);
7 R: @/ C6 C5 @  E  m. q- z[size=1em]      xhr.onreadystatechange = function () {
' g& v0 D. W( f) r* R! {9 H! g9 P[size=1em]          if (4 == xhr.readyState) {
% Z( z# k+ U( w$ V4 Z[size=1em]              if (200 == xhr.status || 0 == xhr.status) {# x. C7 X; h" f. \* y
[size=1em]                  //=========正常返回后的处理代码* U/ D" }) S; z
[size=1em]              }
" \0 y/ F7 q! [, w; K[size=1em]              else alert('动态页出问题了~~');
; u1 m/ R3 Q, p0 K4 {! E[size=1em]          }
  D& E# K/ \% {- i6 i& j[size=1em]      }8 W  m9 C6 ?. J3 K8 I1 A
[size=1em]      xhr.send(null);, w$ X7 E* a6 L8 ^$ _  L9 K8 F

6 ]4 F. D; V9 N  @' n" |; S
' C+ n- e% k; u

9 A0 s4 X6 G8 e1 D5 q: w# b% ^% [! H$ E2 g
, B, m% q% }, I0 }( I
) S$ d4 {1 a! B2 ^1 W
+ z" r4 B6 ~1 S- n: u/ G" Z: q+ ~+ Q9 d
5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。$ ^1 B- ~4 J$ k; F2 W0 b" P6 n" V( F
如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。
0 l/ r1 I, R! }6 e+ q( f




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