- 在线时间
- 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版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。4 I2 C: P# r9 b/ b6 @/ n
2 r3 i* p( E4 Z+ }& S" @: z. T: T4 s4 \
下面是ajax对象的一些常用属性,事件和方法$ i) a' f1 _& x6 S0 R, t! i7 k
1)标准的ajax对象的属性有readyState,status,responseText,responseXML
4 |0 v; Y9 u. M7 B! j9 O1 u" [$ }9 C! Y) s
2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。
. d7 }+ R: s1 C; b+ r[backcolor=white !important][size=1em]Visual Basic code9 [! ^. {6 x: A! _2 B8 Q3 |
[color=white !important][size=1em] ?
1 F8 `' a: d+ o) t[size=1em]1
. s+ g9 {7 O% h[size=1em]2
& Z' {( W, |5 n& }$ D; P% n! F- ?* W[size=1em]3
* d( H% X% k8 {[size=1em]4
% z1 q2 l% t% L8 ^[size=1em]5 4 n& n0 U9 e$ ~" c! J
[size=1em]6 . g U7 A" R/ e/ K! y
[size=1em]7
! M2 S9 A) I8 d8 E T[size=1em]8
( i2 H; I" g0 J: n[size=1em]9 2 a6 T, h4 M" X
[size=1em]10 % A: K' }1 p9 L- \
[size=1em]11
- \- _+ O" Z0 H$ ^# I7 B[size=1em]12 2 K7 s* ?( ?% _1 ~0 t
[size=1em]13 / \3 S! w( x& `3 Q6 B. q
[size=1em]14 4 S( ^5 Z" x O* ]! B
| [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串
/ N( t- S# n; `4 y8 T5 Y[size=1em] strreturn = ""0 f. Z* D4 G6 o) x' k9 t
[size=1em] for i = 1 to lenb(vin)
+ K0 y, n3 {3 I, _* s" C[size=1em] thischarcode = ascb(midb(vin,i,1)); ^1 x: _0 P1 e& I4 Z
[size=1em] if thischarcode < &h80 then" m7 V9 |1 M g* j4 x
[size=1em] strreturn = strreturn & chr(thischarcode)( m q. z" [ G, C3 s, @
[size=1em] else
1 m0 L |2 W1 E4 B[size=1em] nextcharcode = ascb(midb(vin,i+1,1))% p9 w; y7 f# A8 _% O6 h
[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))5 ^, f R/ g' y3 e( N+ j
[size=1em] i = i + 15 H* I( F) J- S; R F2 {4 J
[size=1em] end if! E% Q: a0 |; ^) v- {5 K% K4 `
[size=1em] next5 K1 E5 {: g" \ R+ V: l' L
[size=1em] Bytes2BStr = strreturn
\6 Z- d4 I% Y* Y3 @# F9 p[size=1em]End Function
+ ]6 }- R' E- g' v" V% l2 G
7 K6 n) ^6 H; Y, L9 \) ~$ Y | ' F( x+ i! }; t1 X9 }; f% V2 @" ?
) u5 n- {& _- o1 H
' P7 N z# L3 o0 O' s! ]7 Z
, ?- D7 D: t/ l; I9 Q+ c; u3 D& |, H! }8 _$ j
3)事件onreadystatechange,状态转换函数0 V) \) z5 c* V3 c5 Q- m" T
Q6 x" Y) Z+ u- p; K& c9 L0 z
4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。# X* j+ c4 x O) c
参考
4 c% I) |- N) y% z% R0 Jajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容. v, e" A, f# |8 [
& C0 N3 J. F. _& F
容易出现错误的问题
5 l1 K* W& i7 G1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。- l) [9 ]0 q. R
. p: L% r+ i! ?: l: o. S
2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写
2 i$ F; G9 }1 s& m2 s8 i4 l# `
3 {! r6 B, [0 B3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写6 Z1 w/ a& ^& ~* n% H5 w4 f. ]' f
$ |5 \ [* r1 [/ `9 H4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。5 }' u2 P5 f8 K- y- B
特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。+ s+ N, J, s4 _& p& B
& h7 b) R' ?4 m. o# S 对于手写ajax代码一些建议
7 B) @3 l5 R8 Y5 Y1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。: N; `- T& C8 i Y+ j2 w$ D6 Y
参考webservice json. @( J: t1 W4 \ s- B7 ~
$ t) x* z0 b8 C0 f7 P2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);
5 f# M# L @' q5 j! _* e7 o" L- x/ q$ b$ z/ u3 N
3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded/ |; u7 }2 K. U0 V: u
4 m+ i1 U8 G' x9 i" I; @7 t! I% l4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用1 C7 o+ |8 E' z3 A
# M2 Y% \ r5 n[backcolor=white !important][size=1em]JavaScript code2 }1 N3 C* t" J% [5 U+ i: ~
[color=white !important][size=1em] ?
0 [. g- x8 Q1 i6 ^2 v5 @! ]. |; X[size=1em]1 ' V4 c4 z+ o3 J a
[size=1em]2
( F1 a; {0 Q: b[size=1em]3 ( Y' m6 v# t) `( h# v2 D
[size=1em]4
3 P8 ?2 q* F+ W1 T# b1 `[size=1em]5 % c* G0 @/ U6 J; Q0 U, Q/ { @% |7 W
[size=1em]6
% Q7 E' d9 v& J# A. Z- S[size=1em]7
* |, x! |, |" Q1 d& B* b( K9 F( x! S3 |- Q[size=1em]8
s( y+ P1 b$ l7 i" L[size=1em]9 z& r$ m7 Q) b% L! F: ?3 C
[size=1em]10
4 ]& g9 [1 V: Q/ ]& p, z" v/ q[size=1em]11 8 l1 c* ]4 A" K# i+ d( g
| [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");' q- K3 c% ^; c& p1 J/ M$ ^6 F9 n
[size=1em] xhr.open('get', 'index.html', true);
0 L! N) p7 N) a[size=1em] xhr.onreadystatechange = function () {
% M+ J/ }. i& f; C[size=1em] if (4 == xhr.readyState) {
. g- I& Z" @% o$ w4 K[size=1em] if (200 == xhr.status || 0 == xhr.status) {
4 L0 ^9 d8 g( M[size=1em] //=========正常返回后的处理代码
% L# M1 n1 T" U) j$ A[size=1em] }
5 u7 f6 Y; K3 _ Q: `3 ^[size=1em] else alert('动态页出问题了~~');9 C$ t1 Z$ L/ F% p" H1 c# P
[size=1em] }8 j# L& L& j1 }5 r, w
[size=1em] }
# G# f% ^/ T; \- ?( N" b7 Y[size=1em] xhr.send(null); y& _2 f1 \5 s/ q- i
7 z4 c- ]2 i& x# ^6 A1 ^. n) F$ j
|
' E+ ]! c1 h: @- i, \7 @4 A0 Q
( F& V3 o8 {7 m6 T1 W1 I
0 ^% ~) k- K0 o( L
r5 o# n* o7 _( g. v2 V: E
. B( ?+ i! N ^1 Q- j, K, d: V T# X- X1 b# E
5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。
& b! q9 K$ q5 }: }! ~4 R% g1 I( D如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。
@' a! z" I/ ?$ N) F |
zan
|