- 在线时间
- 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版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。
+ k+ Z5 m: O2 U$ P/ f! M) W- J0 T9 w" B4 n5 Y
下面是ajax对象的一些常用属性,事件和方法" N( e9 _/ _. `& g8 F
1)标准的ajax对象的属性有readyState,status,responseText,responseXML
$ j5 Y8 L4 t6 r7 }4 B8 V" B
, d! N6 v8 G6 G5 _! k 2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。 . S0 d/ b; ~/ V) A1 u# z7 P9 v
[backcolor=white !important][size=1em]Visual Basic code
`8 r( a" \- w u2 X2 o[color=white !important][size=1em] ? + B: K" _* K2 K5 k* \
[size=1em]1 8 q+ v: j& i4 u% K
[size=1em]2
" B& x0 R/ Y0 |' [( ?[size=1em]3
, u- |( d7 y0 Y; r- `[size=1em]4 : {7 A9 w# q# ?9 y, s/ V+ N! y
[size=1em]5
4 Z- R3 G# E- K5 x[size=1em]6 4 l8 Q1 l/ Q: y& S+ o, c1 }" P5 J
[size=1em]7 , Q6 \6 I6 \3 s4 ?1 ]
[size=1em]8 9 h" y e5 [6 ]
[size=1em]9 ) B, H8 V4 ~8 J+ n; k" ^8 }
[size=1em]10 % @4 N3 i; i7 H5 y5 a
[size=1em]11 2 q' ~- Q0 B+ k6 C. L" v; b5 ~
[size=1em]12 ! \$ `# \/ b1 @4 X( o$ E
[size=1em]13
1 S% ]9 l. V$ k' y. B9 q7 G1 j! y" K[size=1em]14 . i( Z& ^3 @# N5 u$ F
| [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串) b6 l5 B4 T; J* Y! _" Z& O. }+ z
[size=1em] strreturn = ""
" [0 V* T: k, W9 ^! Z9 i$ w[size=1em] for i = 1 to lenb(vin)
) K5 {: ^. z, D[size=1em] thischarcode = ascb(midb(vin,i,1))
7 f ?8 h$ E& \[size=1em] if thischarcode < &h80 then% \# ~; |/ c) S, \8 _2 S
[size=1em] strreturn = strreturn & chr(thischarcode)# L) E; Q9 Y- T! F- e+ V. T
[size=1em] else, C: R. }7 Y( \1 C, S, W! K+ f. C9 ~
[size=1em] nextcharcode = ascb(midb(vin,i+1,1))
, O+ t, t' c; }0 R S( A1 C f[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
' Q- ~6 \2 F- t1 u[size=1em] i = i + 1
( T2 p6 s h% h7 C9 O W[size=1em] end if- J4 g, f2 n0 R
[size=1em] next( E* Y7 O5 K$ z) \( Z9 Y3 W9 ?
[size=1em] Bytes2BStr = strreturn
$ p @$ Y7 G; c/ J* A[size=1em]End Function& c, s; X0 Q4 K. q) }- Z
, O4 t) d% [( ?3 f9 l) g
| * F6 {0 N) O: T1 q! k. _
2 X: S' E. y5 m: U2 z- }
. U# r! m% O2 }: X9 Q. f* x
4 |: }. p1 j2 r7 u* j
' T. U$ C; `/ Z 3)事件onreadystatechange,状态转换函数: A( A4 N/ {- o& i
) S3 H' @/ t W# ? 4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。( s7 Y; }% R% L# A8 h
参考
( a* b( d2 o0 B* S2 P- c( ~/ @ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容
! U) O8 n8 m3 J# ?% N% z
4 V9 |8 f! F2 z6 J0 x; ]2 W. F 容易出现错误的问题- n; G! G/ N0 U, _/ d$ N5 {
1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。
% L, x* V+ m5 Y' d& j* n
7 ]/ h0 V" ^( L. a% R' Y1 o2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写! {+ e/ u, W- @# a) ]& L4 { F
; ^1 ?# [- ~( D# G% @3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写
9 l, `5 W( M' R5 T7 M$ `$ j7 R8 }% W- j5 q( d% S
4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。
: F! Q# p& {/ b8 I( U& W3 f 特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。
* N. o% A/ n! I( B5 I, ^* b# ?# G( V5 O# P5 N+ r/ n2 b
对于手写ajax代码一些建议
, x9 r7 h7 t) H1 `: d1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。( a% ]0 H I5 e, T& k, s
参考webservice json
* x5 ?8 z4 ]/ F3 L# E% e% C8 f. _: E! ~$ U. h6 d2 Y8 {% d0 M
2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);
5 d& j6 ^ C6 @( l' L1 n- @4 F( @
3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded
4 p- {5 F- j, L% q: m+ V) _
: _6 r* J: h. L) s) u4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用- c4 Q& m. ~" @1 M$ I1 m( F. \& \
9 t) b/ H' r- ?0 A8 B* B& i, q
[backcolor=white !important][size=1em]JavaScript code1 t0 Z2 k& }7 F3 L+ M
[color=white !important][size=1em] ? + ^) b. s Z6 r/ c/ M
[size=1em]1
( y% N+ L/ j5 w0 [3 \$ A: _[size=1em]2 $ S) n, v. Y* w; K
[size=1em]3 9 Y; Z3 A; Y" b( e# I( N
[size=1em]4
! o# K; ?. G. u[size=1em]5
8 J, i4 p! _) D. [9 P[size=1em]6 ( `6 _ _2 t. i k
[size=1em]7
9 R% j$ x4 h& t[size=1em]8 - [+ ?* l, |# g3 S8 U& l i$ O+ e
[size=1em]9
' S3 y! G0 N. @$ T[size=1em]10 7 J3 X4 _7 U6 P' w& n) n+ n$ G
[size=1em]11
9 Z# ] `1 n/ t( Y | [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
- V2 A1 e3 V i3 d7 d" t[size=1em] xhr.open('get', 'index.html', true);
+ N6 ^# h( L! _9 D0 s) p3 |[size=1em] xhr.onreadystatechange = function () {. Z8 X' t( O/ g6 k7 K& L: V+ s" ?
[size=1em] if (4 == xhr.readyState) {8 }/ K% l% V {8 d$ h+ I, k& R
[size=1em] if (200 == xhr.status || 0 == xhr.status) {* h, ~/ ]5 |1 q; M1 B# D
[size=1em] //=========正常返回后的处理代码
/ S/ p$ X6 Q1 i% y4 R3 }4 z' @[size=1em] }, o9 w8 |4 F( k( _$ v5 n4 u
[size=1em] else alert('动态页出问题了~~');
' v5 K# |$ L) \8 y$ g[size=1em] }3 K! r) Y$ B- a+ p1 T
[size=1em] }) `9 Y, `) k, Z6 {! K! Z8 Z! j
[size=1em] xhr.send(null);
( A, _) Y3 E7 y8 k4 s( d
$ \7 N) {/ ^2 A4 [( n& R4 t | * {: i1 ?# f0 l3 s2 u7 R
, ?( r4 d' Z) T- P1 T
# n7 P0 D2 s+ b! `& q7 M0 n1 w7 l [* Q$ H* s! k+ J
0 C! l. V4 w: C* r4 q
: X+ _# j! W; `, a# G- L5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。# d4 C: l1 c* C
如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。4 v: B( _# `, Y8 c" J" N
|
zan
|