- 在线时间
- 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版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。9 o8 F, u# j9 V ]8 x* k
5 |+ g. @' M3 P2 |8 t 下面是ajax对象的一些常用属性,事件和方法
" E- x! z& C+ Z3 s 1)标准的ajax对象的属性有readyState,status,responseText,responseXML
1 F9 [& o! b/ a; C2 \* [
5 t* k2 i. p: J1 i 2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。 3 A: l& R; z2 f: C
[backcolor=white !important][size=1em]Visual Basic code
9 M2 V/ O h$ }4 v" m3 t[color=white !important][size=1em] ?
% e( o2 M/ U* [[size=1em]1 " Q, d+ {" J) w* T/ _! O3 g+ C& D
[size=1em]2 8 h. @/ C+ O+ {% t+ r5 x7 M
[size=1em]3
2 o) [' ^6 k k, r$ c3 c0 e( R[size=1em]4
% z. D6 S! {# f& \9 q( f$ Z[size=1em]5
- O/ ~- {. ~; F- _[size=1em]6 W) I9 @8 e* n
[size=1em]7 & J. c J$ P0 B) k5 l
[size=1em]8
' w, }; ]$ {! f, l8 u[size=1em]9 : n% o3 z1 M+ U* f
[size=1em]10 * u/ V! ]/ z3 c8 o
[size=1em]11 , A2 G1 b# s% D+ i7 i" T& A( Z
[size=1em]12 , b. ]. j1 ]' r
[size=1em]13
0 ^/ ?" A, Q6 Z5 Y" ^& @, E[size=1em]14 , q0 \# v* d7 [ v
| [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串* I2 ]0 b, F% ]: Y/ z
[size=1em] strreturn = ""9 M4 {5 k6 J w- ~: R
[size=1em] for i = 1 to lenb(vin)+ ?( t- s* Z4 t( g7 {3 n
[size=1em] thischarcode = ascb(midb(vin,i,1))1 T5 ~9 `$ w8 T- [" W0 r
[size=1em] if thischarcode < &h80 then
3 h+ V) D' X W. [& a) s[size=1em] strreturn = strreturn & chr(thischarcode)
7 j( M: T- N* V[size=1em] else
4 }# b: j, M. i( n& X! D/ G! k[size=1em] nextcharcode = ascb(midb(vin,i+1,1))5 |4 v% q' z# Z& D4 C
[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
5 g" ~" r* V8 J" b2 M[size=1em] i = i + 15 {! D4 I: X7 ?, |- m8 I
[size=1em] end if, f( l' M! x" O* y
[size=1em] next" c1 @$ [( P, A' J+ s8 w/ l* J
[size=1em] Bytes2BStr = strreturn
* w& E" c; ~/ \6 h" G# [- v: q# v[size=1em]End Function
. V e+ S- [ ?
/ k- p+ g6 E* p |
v1 c, D0 ^( U3 U* i
4 h/ `/ a' X& W0 e4 T
7 z* W, |' d6 T2 a: f
0 C( I& \2 L# g [0 u) V1 i1 ^+ z
' c' t9 N% |, g- P) s9 T 3)事件onreadystatechange,状态转换函数. \- e) |6 X! I* ^! ?8 f
% M, y( ~8 b- x 4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。
. X. ]6 `* e8 @3 D% Q! ^1 Q& I' }3 J参考+ h C2 e4 b3 t. ^; B
ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容
2 [' j0 k% s. ?, N9 ^8 S
& L, t+ N$ R9 n+ M3 A$ F6 K5 u 容易出现错误的问题
7 w" k$ { T! Q& g: n% k9 O1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。
$ Y$ r1 [: m! U/ z8 u1 w: k+ J
) i' y* b0 G7 a* P0 _( N) z2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写
2 Z( L( M! t' ^$ k z3 T: }" h: A1 z" _' G2 S- R
3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写1 m6 U8 Y$ @# F8 |% o# e
* U) M) ^5 D2 b2 \4 [. J0 u4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。
4 z/ v1 e/ m. `$ |7 Y 特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。
: T0 V% {7 l! h1 R$ N
: V2 `+ C; o. E. D$ ?, s" {1 f) G 对于手写ajax代码一些建议7 z A6 c% t6 r6 C$ P/ X% R
1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。7 [. ]$ @2 O5 b
参考webservice json
- ]: R, H, p, w3 i, w, }/ {
! Y# ]" D9 o9 Z) Q. R* _) f, M2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);5 g; z# G6 a' F
' Y7 x3 c5 b9 |7 p+ {% `0 d
3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded
( R) i1 d. }! }" T. _( k4 Q; k E5 r- i
4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用
1 _( n1 v9 p" x2 G3 P+ H: m3 L' }* f& ~0 p: Y4 f
[backcolor=white !important][size=1em]JavaScript code
4 ?6 j' c7 m z: ]& J5 h[color=white !important][size=1em] ?
1 z3 d8 z0 Z/ f4 w' P- B! n6 t* V. h3 H[size=1em]1
; w$ ?6 c/ a% l- |[size=1em]2 ' Y* c, {, b& B+ P7 F' M0 i. [) T
[size=1em]3 9 ?- f r" t. q
[size=1em]4
8 x2 e( L' @4 A! c[size=1em]5
0 ^+ s) S+ ]" [ m" y[size=1em]6 0 J$ ~5 g+ w! {. v: N* G
[size=1em]7
) a) F6 S9 L9 K: n; y3 X1 W[size=1em]8 / E! {) K& L2 }
[size=1em]9 7 y' ?* K* U# k4 Q
[size=1em]10 * d) t# {- B; M7 S3 l" Y/ b
[size=1em]11 % t* V* U j3 g) g
| [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");( q3 Y$ s8 A) C' P5 l8 D8 q
[size=1em] xhr.open('get', 'index.html', true);
3 ~' H) H7 O2 o' T9 `[size=1em] xhr.onreadystatechange = function () {
' \0 J9 d7 k' i9 Y6 _0 ?6 B7 ~ W[size=1em] if (4 == xhr.readyState) {: H1 `2 t9 ]* B8 E
[size=1em] if (200 == xhr.status || 0 == xhr.status) {
9 K" v, A4 L8 Z9 V. @9 J[size=1em] //=========正常返回后的处理代码& g8 }8 f3 S+ J3 j$ {
[size=1em] }
. ?; J N k/ Z[size=1em] else alert('动态页出问题了~~');
# o: F2 p P! v[size=1em] }5 ?- Y% T: I( Q& S
[size=1em] }6 q3 ?9 G) C) E5 p% ? ?1 N% {
[size=1em] xhr.send(null);
, x& c! l' ]$ |' x2 O) Z! n) R- l& J" ]
|
9 |3 ^& {/ g1 |( j1 T, E+ x7 N) N) p9 x! p! E
! m1 U% z8 R7 Y
) q) |- v ?: ~
) M* r6 m! T y/ p" |3 E0 O
2 d; k6 Z4 ], `. Y; g. {% M5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。
! f" }8 a* ~0 ~& c) Y如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。
e5 @) j$ I( b+ M( ~% R C |
zan
|