在线时间 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版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。 6 _# A6 v; |3 j: l: i
4 L E' L: d0 P$ z 下面是ajax对象的一些常用属性,事件和方法
8 f$ Q, `, ^/ U4 [1 @: Z4 L' ?) B. ] 1)标准的ajax对象的属性有readyState,status,responseText,responseXML ; u7 B% ?, ?$ R z
1 o9 \5 }6 z1 ?# K. G4 h
2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。
; T6 y# n( V. t$ Q* w/ { [backcolor=white !important][size=1em]Visual Basic code0 P- Y# m1 `- H: [ U; r% u! I
[color=white !important][size=1em]
?
. ]$ M6 p- B3 ^( F [size=1em]1
# x, S9 i d1 W% m9 R/ [ [size=1em]2
- X$ L1 f, V9 O q9 y7 ^1 \
[size=1em]3
9 g& P2 K3 x* p9 `$ R3 F
[size=1em]4
$ e$ m+ {3 e) ~ N' R/ n( t
[size=1em]5
# N# i$ t1 c5 [; @, p, { [size=1em]6
+ }8 ~* y j* ^/ U
[size=1em]7
e& i* z+ P" p3 w+ h5 X
[size=1em]8
3 X* b, r. t4 Y% M1 h1 W [size=1em]9
, o8 H1 Y7 u; m, v$ C M, U
[size=1em]10
/ b; i% p1 f5 n* ~3 V: w2 d
[size=1em]11
3 i3 g! `; l* U# O! }/ M7 y7 ^" h
[size=1em]12
# B- {8 t Q% i6 { [size=1em]13
9 x; J4 \* b: E9 p: O# E
[size=1em]14
( w4 Y& K, h( J3 m [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串: [0 T6 \" J6 I8 W& g
[size=1em] strreturn = ""& E9 }/ G; d. ?5 Y
[size=1em] for i = 1 to lenb(vin)# N* a5 ?( P1 {, V, R y. P
[size=1em] thischarcode = ascb(midb(vin,i,1)). G$ }: v% |" F) K, Q
[size=1em] if thischarcode < &h80 then" }: v; ]/ ~9 D( k/ k' `+ h' w, C6 q
[size=1em] strreturn = strreturn & chr(thischarcode)
" I) N' M, S- K5 a! t6 I [size=1em] else
/ }/ ~/ b1 ]. M g% V/ S2 r [size=1em] nextcharcode = ascb(midb(vin,i+1,1)) k U5 d/ ]8 c `2 X% f5 E5 j, c+ S
[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
/ d3 o( p* o6 s/ z9 h9 }8 x [size=1em] i = i + 1
4 i+ x+ v/ n; i8 f# O [size=1em] end if
) `. {- e5 t* F( }0 e& U [size=1em] next
7 j3 O- t- n0 V; \" \1 V6 r [size=1em] Bytes2BStr = strreturn+ L; M' X9 I% @2 g2 N* B
[size=1em]End Function3 T6 J3 R6 e$ x% Q: K+ _
- ?7 ?8 j# A, S3 K5 k5 f5 m2 _
7 f, J$ b( z* Z- N& J, P ; }( F1 n& @% l3 i+ _6 Q2 p! N
# Q7 R' t) Q/ |- x: k7 y. b . ~; K0 ^/ ]9 N1 d
& V3 w6 V$ M0 v3 ^
3)事件onreadystatechange,状态转换函数
) _5 ?3 F6 U/ N3 g$ l$ B |+ F
; x6 i+ ~" X% |* p0 v 4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。 2 K J# W5 S1 s& y9 X; X( @
参考 7 c$ u. W/ q$ u' f
ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容 2 \6 U! h7 Q) {
& T) w8 h( C" }3 Z/ s- ?5 @" l" d
容易出现错误的问题
" g% i( E* z& y+ V8 m& F% x$ }$ F* X7 P 1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。
$ d( X% Y$ h$ \8 W) B7 j7 P+ L
) H& @& R3 P! A 2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写 # q; X0 J9 Y& V$ e
- w1 _# u& I: {; X 3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写
! P2 _5 m& ]' \0 [
; |) | K( v) b& w1 H5 t# O 4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。 " X" M4 `, ~/ A' Q$ b# L
特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。
8 _2 @: R. H5 z3 z* ` 3 N: ~+ o- l5 i" ]7 t$ z
对于手写ajax代码一些建议 3 W, G& O' m+ I
1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。 . n4 D3 }: ^& T; K8 z
参考 webservice json
1 Y" t& o0 n! W t* F% x' U
6 n8 I& V7 A9 X, s& ? q% f6 B 2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null); $ l( G6 M8 L; ?8 F
9 s3 R4 X! i" B. @6 [2 P. x' O
3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded
9 m2 e" L4 S8 S) S " Q8 r) G' U. x" `! R3 J. E: j9 F# ?
4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用
. g0 N! \% c. R, \* U! {
O# ^, P% S+ s0 _5 n; Q" h+ f9 I( i0 p [backcolor=white !important][size=1em]JavaScript code) s/ M3 G* ~7 x m
[color=white !important][size=1em]
? ; o! V8 i4 z8 Z, E( Z
[size=1em]1
1 p9 V! s4 R& p1 A2 p5 m f
[size=1em]2
6 G6 G# U6 q, ?* G; x [size=1em]3
- r \5 _) y& `! ? W7 y0 {! q. N [size=1em]4
5 p* ]$ u8 N* o7 |3 r. i9 @ [size=1em]5
. x3 h7 x8 d0 W) Q* {
[size=1em]6
: f/ p6 I, z S+ m% J4 J5 J4 l
[size=1em]7
; D6 u \& O4 l/ \4 J [size=1em]8
) ~8 {! P' F/ H# n1 y' G [size=1em]9
5 T* Q( `2 E( k: k0 k5 d
[size=1em]10
/ j( n& E- o3 w( d- R! R [size=1em]11
; K9 h1 T' {2 I( X [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
# e( e0 Y+ |4 o% i+ x [size=1em] xhr.open('get', 'index.html', true);
+ i( L$ E' B8 q [size=1em] xhr.onreadystatechange = function () {
" ~& K0 o- @) o/ J% l% a! f; o [size=1em] if (4 == xhr.readyState) {
2 O6 N! X- m- r" H* t [size=1em] if (200 == xhr.status || 0 == xhr.status) {
2 ], D: a- J2 {+ k2 J# M: i4 X2 R [size=1em] //=========正常返回后的处理代码! u! e% |* J: K& [% e
[size=1em] }
7 {7 ^, d4 h) C- Q1 d4 c [size=1em] else alert('动态页出问题了~~');
/ @5 w4 L2 i" D3 U* k! j [size=1em] }
& H) D0 \" Z( x1 X% `0 r- ?7 R [size=1em] }9 J7 E& N+ n [# n
[size=1em] xhr.send(null);* X( X* M, ]4 u9 d$ h* W- Y( E- }
6 H% k% r/ K N. d$ \: y, y7 F9 f |
2 `4 ~5 F4 j5 g: o! t6 O4 ~
- Q p* I3 [/ R. m . _! `! d! [9 F5 W2 C
7 l! K. [" i: f! A$ D2 d 7 B( L2 R$ w; n+ J8 ^
4 h# n1 l) T( i* E& @% h
5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。
; N. S* P* m% ]7 [ 如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。
' j2 W$ o K+ U& s1 {& _
zan