- 在线时间
- 5 小时
- 最后登录
- 2015-5-13
- 注册时间
- 2015-4-8
- 听众数
- 9
- 收听数
- 0
- 能力
- 0 分
- 体力
- 96 点
- 威望
- 0 点
- 阅读权限
- 20
- 积分
- 44
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 31
- 主题
- 31
- 精华
- 0
- 分享
- 0
- 好友
- 2
升级   41.05% TA的每日心情 | 擦汗 2015-4-30 14:17 |
|---|
签到天数: 3 天 [LV.2]偶尔看看I
- 自我介绍
- 德玛西亚
 |
最近发现ajax版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。( R, v1 ] y2 k% A g9 Q' `
/ c) u5 T- f0 Q# Y, R5 C% f, \ 下面是ajax对象的一些常用属性,事件和方法& l* G1 |2 R) C# _
1)标准的ajax对象的属性有readyState,status,responseText,responseXML& u$ `+ z6 C4 v: V
. W7 e- F. M' b 2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。
' J q9 l; o. P0 [) P) z1 R[backcolor=white !important][size=1em]Visual Basic code( g3 V' \- U& G9 ?! Q
[color=white !important][size=1em] ? ' u- i1 I" p0 G5 O8 L
[size=1em]1
1 `! U" u4 i1 l" [# n[size=1em]2
( w6 E/ m, W6 _* O: R[size=1em]3 # a- S7 H; H/ N: V: i! C
[size=1em]4 # I' y$ `3 |1 T D @! }6 V0 U: c
[size=1em]5 8 z- ~( L" R' z
[size=1em]6
! A! j. A& H' b7 P# m/ O) h[size=1em]7
4 E% y* Z1 y0 `9 q[size=1em]8
- o3 W2 p# z. R2 x! |$ U0 X[size=1em]9
( a2 \$ B# f3 { Z3 O[size=1em]10
9 Q% A4 ~8 r9 @[size=1em]11 & V1 G! K/ u, E& q; Z }9 m
[size=1em]12 % @! }- w/ \3 }; M; c) o7 b
[size=1em]13
/ N& w( a& o) b9 L0 I, X/ }[size=1em]14
) n; U" g5 F4 x | [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串 I9 N, W. [. W' K( K
[size=1em] strreturn = ""
; u; ^" O8 G1 V! b+ {4 Y3 l[size=1em] for i = 1 to lenb(vin)
. v0 s6 s4 E: |- B/ ^" p$ i: g[size=1em] thischarcode = ascb(midb(vin,i,1))
6 s: F# i% V- L: O/ }' @[size=1em] if thischarcode < &h80 then* k: M) Z. O1 h m E( X
[size=1em] strreturn = strreturn & chr(thischarcode)% o/ ^: y0 Q$ E. }! f/ A" @6 q x
[size=1em] else& s( v- i: R' f5 i
[size=1em] nextcharcode = ascb(midb(vin,i+1,1))! S# B0 c3 Q* U1 p
[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
0 T [5 |+ h' R9 X- x# y[size=1em] i = i + 1
& I9 c5 I0 k# f& ~) m x[size=1em] end if o3 D' m9 |3 L( J! p& k V( |7 c# D/ [
[size=1em] next
8 d F& b0 [8 Y9 k# R[size=1em] Bytes2BStr = strreturn4 c# e% P' h- S( m/ |+ J
[size=1em]End Function/ @/ L: E. K9 r8 [1 C
1 r' z$ {5 ~$ ^% t% O9 ?: F | 2 ^8 l$ m& B/ n% n/ q$ ]
i+ N; \; x* k
/ H/ D g8 _+ N% t) y8 \' r9 U9 D; @( C% X, m5 d: C$ I
- C: B. z2 G/ z5 l/ E7 L
3)事件onreadystatechange,状态转换函数
0 A$ y7 F, B9 C( G1 A' _
) f/ ^* J3 G- n9 B2 b1 ? 4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。( U" z( K9 I# j/ t
参考( ` R$ H$ I4 n' ?
ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容
, q- G; _( q: X" T3 k
* `* O9 k2 r1 i 容易出现错误的问题0 I; t2 y; F W5 V- v
1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。
3 } J3 o$ h' i. G! K& z3 a6 I. c( g9 M* |/ H
2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写
! S$ n) H, g% @! f8 a1 T
/ D8 P$ J, x3 X" z7 A3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写 \" X. _) k. S9 Z2 A, `& L9 F
6 |9 Z8 @7 l; G" @8 U9 n" c4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。+ L4 b6 K: l0 O% p" j
特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。9 l7 b, w$ r; |4 J# ?$ y9 [' ^
5 n5 C' G% g5 t 对于手写ajax代码一些建议8 E- m# u7 H- @$ i
1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。
]( a. S5 M! P& Q$ V! H9 U: `2 J参考webservice json# ]+ J: ^2 C1 q' X: {* u% @
7 F6 {! e+ x0 b( I+ c. p' k
2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);; [! E% }( y* [6 R* N. W
( j- S) ~9 q2 B* K6 M" }& B( S3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded0 y; E' t* C* i( Y' _1 C5 G% b2 p
- f5 Z, x% e* Q' C* y4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用1 i g+ ~" ?4 x# _9 |) h
" B3 i) v* R- u' ^[backcolor=white !important][size=1em]JavaScript code( m! p7 L% w$ T! m
[color=white !important][size=1em] ?
c2 m4 n. R5 S0 J3 y[size=1em]1 $ n3 O+ c8 P/ K* I9 Y4 E
[size=1em]2 9 N/ l& \! Q* ]8 [3 e( n# P- g
[size=1em]3 % B* `3 p% v8 A) d" k
[size=1em]4 ; K4 D( p9 z5 `( G% ^, ]
[size=1em]5
3 X1 @7 U1 S. M% J+ v" ?0 D[size=1em]6
3 Z0 _7 D8 S2 e& U[size=1em]7 0 ^: c* o7 N& G* X' J# I
[size=1em]8 ' F' _+ [ T! Y3 e4 W
[size=1em]9
3 w2 m: N) t) v/ u- U" l: G& y$ s. j[size=1em]10
+ m9 W S# o9 X( N7 o! h[size=1em]11
3 ?$ q# A: _ u- q6 X x V1 X* i | [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");" \2 n* `+ F( l9 P: f
[size=1em] xhr.open('get', 'index.html', true);
# ^9 u/ a7 d* a: H[size=1em] xhr.onreadystatechange = function () {
5 v4 T" S N6 G( p2 w[size=1em] if (4 == xhr.readyState) {+ L: f- G+ A" T3 C. b# L
[size=1em] if (200 == xhr.status || 0 == xhr.status) {
* p) J: w: x( K4 \/ Z7 c- |[size=1em] //=========正常返回后的处理代码
+ i; K( D9 |+ n& N7 R% g9 _0 Q# C[size=1em] }
) i7 I% s+ _! W1 Z1 B! p+ Q. r( e[size=1em] else alert('动态页出问题了~~');) r3 `% G; j9 `+ C2 J1 a. V( [
[size=1em] }; Y2 Y9 t" F) e/ F
[size=1em] }
0 p# [' m3 p% d3 h3 T; y. F! U[size=1em] xhr.send(null);
1 Z# i; H2 q' }% Q5 }
; L9 a4 B! S+ ]; a | 5 ^4 h9 f5 t( G$ X; \# _
8 ~" z0 ^2 a; L8 i& a" ~: m) e: h
, u E2 q5 {0 A! o' @* e9 A
7 q" s8 O( W! [, b2 y, @- P( a3 K# u, u4 {: B
3 Y: P+ W b) E8 ?5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。
: q* O% }& J4 l/ o) b如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。" E6 P" r9 x3 I3 o0 T- P% h
|
zan
|