- 在线时间
- 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版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。
$ f; p E0 K# J- H; ]' L7 ~* T
+ f! H; l# Y& r 下面是ajax对象的一些常用属性,事件和方法
0 o& ]' o/ d' Q' f4 X 1)标准的ajax对象的属性有readyState,status,responseText,responseXML
) [# s: B) S+ B5 T n: L
; z/ C4 Y* x" Y8 l N. T. A0 r1 ` 2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。 : B. S( H8 b5 O1 B' Z3 }
[backcolor=white !important][size=1em]Visual Basic code
- W7 Q1 I% h4 O% N0 O+ U) O[color=white !important][size=1em] ? ) Q& M8 U5 q* f" a4 ^& f7 K
[size=1em]1 1 j) G/ G5 o$ {4 i; M
[size=1em]2 * |% s2 |- I! Z- j; `( y
[size=1em]3
D" v4 ? e6 Q' u4 d[size=1em]4
5 G) a) n2 C% A% N4 Q6 m[size=1em]5 4 q' O! [: ] j
[size=1em]6
& A, E8 h9 L+ k) h% X0 e; b[size=1em]7 , }7 u+ Q" W; ?# r, }. O5 `2 j4 W
[size=1em]8
/ U) v7 H# g* B" x[size=1em]9 ( ^/ O1 V# m- }4 v- S
[size=1em]10
( `' T f6 v }0 w+ Y1 G[size=1em]11
; V* c7 F+ q6 E[size=1em]12
z$ X& m6 ^2 V6 P, Z2 L. d, X[size=1em]13
3 B* E, Y& `/ z6 r( g7 k4 _, T[size=1em]14
3 U9 B3 b. A2 k0 n | [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串
1 O- e' m) ]( v8 W4 s+ L& ?7 y# c[size=1em] strreturn = ""
0 s9 q, o3 G5 B# b[size=1em] for i = 1 to lenb(vin)
8 y& A% o: \9 N% T2 I$ }3 f U[size=1em] thischarcode = ascb(midb(vin,i,1))1 u* V- V& @) Q
[size=1em] if thischarcode < &h80 then
1 W8 Q. \( B: C- H s[size=1em] strreturn = strreturn & chr(thischarcode)
1 M- |$ H+ k V4 i" B[size=1em] else
! C% |( o' u% F& |7 U[size=1em] nextcharcode = ascb(midb(vin,i+1,1))' W& S4 x+ z4 F
[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))1 B/ o, D. k$ O
[size=1em] i = i + 1
/ z0 U9 v6 Y3 ^3 L( Y- k[size=1em] end if
0 L' {3 j" X' I. i9 R[size=1em] next6 _- |6 s0 W# g( c
[size=1em] Bytes2BStr = strreturn
% G# r8 m3 g. ]$ {; K" V[size=1em]End Function
0 e+ o: O7 j3 @) S K* ?4 O% N }+ G. y& Q# Z
|
( r2 b5 D5 Z5 Q; _3 B0 V
$ L+ Y2 i' j/ S3 P- }) C# U2 K8 _ D9 n+ ~+ B$ j
& p* w% V) i" `% S* c. z" b
5 O B/ W6 O' [
3)事件onreadystatechange,状态转换函数3 K. Y% ~: O3 r$ m! |7 e3 |3 w" `
( ]$ V0 Y, i; o; ]& O
4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。# O! i; ~; ?9 [5 k. }
参考
+ q( S9 X* V( q8 a4 S, [# m* V* {ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容
8 y! D' W6 u9 o- g6 Y! e
' D& T5 U, V% B8 \) X0 P: Y5 s; G 容易出现错误的问题
$ l6 b& Y7 x2 r |+ O% Q1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。
9 \0 z0 W" t3 \+ M% e+ ?& ~4 I% _& f ?9 Z, [. z b# @
2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写* V* U+ V% Z$ m( G% V( v2 i
9 q' d/ P9 X3 R! F3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写2 S, \! j- |* v3 X8 Q+ Z1 _9 J
( M% Y( C E+ ^
4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。" ] [7 T$ j9 p& E: \ k$ b
特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。2 m i- N! ~' m7 G9 p
, b3 s2 n, }* G" i4 @! F! z
对于手写ajax代码一些建议
# |7 ~1 }- f" B3 d* ^" o1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。
4 q$ E0 Y3 o7 y参考webservice json
0 m# A$ @" \% Z
) W: b; u8 u( H% y' w9 N7 [* g2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);
+ d1 K8 u/ f* t& _8 q$ u3 N+ n: v
5 I5 [0 a I" C. R0 g3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded
8 B+ P8 l) }* z
# Q: M1 D6 ?2 D+ n* ]3 p4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用
- F( [9 ^4 C7 b+ g9 v6 k
* l/ h$ t- K: Q4 t/ w( M[backcolor=white !important][size=1em]JavaScript code( G( N5 e1 A' S1 Q' S, |( s# o
[color=white !important][size=1em] ? 4 o7 o( K2 K+ R5 x; U6 V( L% U
[size=1em]1
8 F8 I5 b: X, b X( X[size=1em]2
9 s4 a- m/ E W' k( S$ m) A: A[size=1em]3 : n }! X7 p# D% p9 f, e+ m8 e1 N3 z# q
[size=1em]4 ! Y& J$ V0 |, _ [+ v$ n
[size=1em]5
6 W9 h1 p4 G3 v. \; S. F[size=1em]6
, i/ G# H3 F; T0 ^[size=1em]7
' ~) K' {- f s# }& X[size=1em]8
1 f) @$ Y. e8 \. T[size=1em]9
6 Y$ F: Q4 X) D' Z: J[size=1em]10
: b3 g9 [! `) d9 h; Z2 l[size=1em]11
9 j+ |0 y6 } o S& D | [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
4 ^9 C0 N1 \% a1 A0 V' {[size=1em] xhr.open('get', 'index.html', true);
7 H; B& ^ X! b[size=1em] xhr.onreadystatechange = function () {6 m; e. d9 h/ U* m+ G; @1 b6 M
[size=1em] if (4 == xhr.readyState) {
. x3 _# K1 @5 j* A[size=1em] if (200 == xhr.status || 0 == xhr.status) {* e+ s; S6 a# k
[size=1em] //=========正常返回后的处理代码
" z" U8 S9 y5 r; x[size=1em] }* }2 H: B7 T, S; V, c& C0 Y0 D. T( P
[size=1em] else alert('动态页出问题了~~');9 A1 V' ^) P/ g- w" |) G! J$ ]6 {
[size=1em] }
: `8 O v2 [) q# L1 d[size=1em] }
, ^7 ?3 n5 A. E; p[size=1em] xhr.send(null);
* f( d" @8 f0 a O
" w/ |+ B/ ?7 c9 C1 E" j, I |
: H A p( G2 f; c) P
5 p7 u& o: @% X& e' i" j' C8 `( J$ O. S' R$ `$ S `9 R" @, Z
0 M, m" a: _. A9 K! }# B, F8 S
4 ^$ {# r S: ?
2 ^; k6 B, e# @) x5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。5 Y: {* r% l( o
如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。
9 e) i# a9 b7 _2 p" N: c, M |
zan
|