- 在线时间
- 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版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。) x; n$ I9 m/ E0 c' c X) p# _
& ?3 S7 x, A4 v" e 下面是ajax对象的一些常用属性,事件和方法
" m6 T) C' o4 d/ }1 P9 B5 ~( W 1)标准的ajax对象的属性有readyState,status,responseText,responseXML& _) c' q$ ^4 J' @
6 q- J* p3 O9 |' k 2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。
2 c! g( [6 T) Z8 m" w[backcolor=white !important][size=1em]Visual Basic code
! c0 r. S% E, x- j7 N& ~[color=white !important][size=1em] ?
6 X6 S2 B ?$ Z( p[size=1em]1 . s+ c2 w6 w: N# j. E/ z& L0 @5 C
[size=1em]2 2 t0 B6 Q3 @# n/ c- a2 O
[size=1em]3
: u* N9 w4 h" e6 _! f! |. p& R[size=1em]4
, r6 o% c$ G% C1 K: G: _0 n[size=1em]5
# y! _$ S! q$ t( @' b w0 s[size=1em]6 9 L$ L; V5 [" D) u
[size=1em]7 + z8 z5 C% Q2 n
[size=1em]8 ) N, p$ O1 A4 P9 x; l
[size=1em]9
( C" f# P+ i% r/ L0 f8 y[size=1em]10
4 B3 G& a9 D9 R[size=1em]11
; z/ Y! n- D) z* N" e[size=1em]12 & t1 \- R; V1 \- }$ L
[size=1em]13
# D& a! e2 Y, t0 C" v( K+ ~, `0 p[size=1em]14 ' G" J! S& _- [& s2 D4 z7 E
| [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串3 L5 \' A5 Z9 m& }7 s5 ?: K% M. ]. _8 r9 z
[size=1em] strreturn = ""5 G$ k4 ]) P2 s w) U' B
[size=1em] for i = 1 to lenb(vin)
* l/ X8 q, S- a, [3 b& f[size=1em] thischarcode = ascb(midb(vin,i,1))& N( N6 v* f4 ]; N$ X% k
[size=1em] if thischarcode < &h80 then
' o/ Y5 R, z M5 |1 A# v7 f$ k[size=1em] strreturn = strreturn & chr(thischarcode)
3 P" B3 O2 m7 @[size=1em] else
E- p* k1 R3 I, @" B[size=1em] nextcharcode = ascb(midb(vin,i+1,1))0 G" C7 r' b, E+ m3 Z X, h) l+ z
[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))2 ], ?' E4 P% Q2 b" [. H( F
[size=1em] i = i + 1
* z/ b4 y; G& V2 P) y[size=1em] end if
! ~! t, d- F! N& R7 {[size=1em] next
" A7 I) K7 ^1 Q& k) D! [/ D7 V[size=1em] Bytes2BStr = strreturn
8 v ~# G1 o, Q[size=1em]End Function5 C+ w x( ^; C0 O, ^
8 {2 d+ ]" y6 z# [3 P
| , Y" {) k7 u1 X, x% `0 Y! ~
8 O* @5 l6 a4 u, F- c8 N* |% k2 F$ ^
' S8 T6 Y: }! J% S; a
" s( D6 y, ?3 q
$ U( p9 I8 r3 H2 F8 d. ` 3)事件onreadystatechange,状态转换函数
H/ u. V2 @- D6 _) S# t+ y7 y p+ n2 Z1 d3 X3 B
4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。9 u( K- n7 _2 _* f
参考/ I% S2 f, Z9 R7 M8 D% x4 `. d
ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容$ I" a3 y* D% N, y
% D: h. s+ _- S+ c) V
容易出现错误的问题
1 d. q5 T2 W# X3 ~# U$ X2 T: w; H1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。: U7 C3 W M9 }. Q
8 d6 D8 @" o" I: W2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写
3 ~% F2 b! f, ^3 T/ n# x; `" K. M. O
3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写
3 Q' K9 Y" f; ^: e% m' K9 k* O2 g7 y+ U: V$ s( |% L2 J5 \- P
4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。
/ {" _/ f# i! L6 m6 |( K 特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。* M$ \4 R7 n4 f; u2 S) d
L$ C9 o6 Y9 b0 d! C 对于手写ajax代码一些建议( j9 M$ d# J- k7 p# v$ X1 i# z
1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。 V5 Q: ~! v4 v# L
参考webservice json
, D" `8 l6 w9 [; N5 D/ J; O1 C' r c9 n% s1 ~: Z
2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);
7 c& g& z: a2 c) ^4 Q$ y4 Y3 n
+ p, B5 D$ S8 ~4 n3 B# h/ [/ B, `3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded
) {1 e, `0 W e9 b6 w0 {# |* w4 K1 b( [4 a. O( ^$ m& d8 T
4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用' h4 ~2 z2 u9 j0 |7 J* ~6 J
2 Z7 t/ Y5 p8 J[backcolor=white !important][size=1em]JavaScript code! Q( ^5 t6 ^" B! ~( A3 m; g, m. T# Q. k- e
[color=white !important][size=1em] ?
0 m- ]. t: \: p6 E- P. W, n/ m6 I[size=1em]1 $ C: |2 c: E- C0 Q) J: C0 T3 [9 k
[size=1em]2 - G+ i5 @5 l3 s+ c6 t! |3 F
[size=1em]3 : c0 X$ h# ? C% h3 \3 ?
[size=1em]4 , R+ H7 B( W& ]- o9 d" E
[size=1em]5 , P, |/ z* v6 Q; O
[size=1em]6 9 C8 c- w7 [4 G
[size=1em]7
' R; P9 A% n) ?* P& @6 d[size=1em]8 # Y, [% z6 Z3 |. x& H0 q8 p$ A; i
[size=1em]9 U6 _. H" X5 b5 W. l
[size=1em]10 + K( d; u* D) J% K5 D
[size=1em]11 4 s! R2 G4 n. O& g; h2 F
| [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
. Y% B; {0 h* Z" M8 M9 Q7 t[size=1em] xhr.open('get', 'index.html', true); @# }) J ]( k6 h
[size=1em] xhr.onreadystatechange = function () {. o, i+ J1 E5 R3 a
[size=1em] if (4 == xhr.readyState) {* _4 E4 i$ M, U2 }( w
[size=1em] if (200 == xhr.status || 0 == xhr.status) {
' t0 R ^; }5 K& t8 `: l[size=1em] //=========正常返回后的处理代码
+ Z, c3 v3 u: G- R7 t7 I[size=1em] }
# c. G' Q% a5 Z4 I' Z[size=1em] else alert('动态页出问题了~~'); K _* O& W. f, q2 q& }6 r
[size=1em] }! s/ S) b4 K3 O" P
[size=1em] }* ?( l% }0 g7 H1 E# X( r
[size=1em] xhr.send(null);
6 I. [ k7 \" A2 m
$ _. h% \; l1 D# x& o |
" Q: u8 {. A% m1 E! a
) O$ x2 z* a+ E0 W/ M- d/ a. d0 _( G0 F) s7 O1 P k
9 _: z& C3 q) o, c" c& v' T5 G& V8 O0 w) L5 d! y9 l# N
/ b. B& p; `& [( J) R
5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。
' E% x9 J- w' d1 i$ v# c) e如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。
# ~/ D* y+ f% W/ q' M! i |
zan
|