- 在线时间
- 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版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。
2 j W5 d0 N: y% x i1 E3 j3 W& e
. F* g5 ^; v. ]! h 下面是ajax对象的一些常用属性,事件和方法
' [: K! Y' X! E) v& I. y 1)标准的ajax对象的属性有readyState,status,responseText,responseXML
6 H! A7 L. C" h1 `- G, e4 k/ L( c
^3 J s+ b9 G- R* o6 e) x3 [ 2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。
; Y1 S4 a7 K- T) @( ?/ r$ G[backcolor=white !important][size=1em]Visual Basic code) Z3 i( Z4 H0 X. L8 }
[color=white !important][size=1em] ? ' c& J. n! F# W; {" K& c
[size=1em]1
' x- s+ k1 ]1 c/ b& ?! s: J" J! q[size=1em]2
; u1 k; _7 H8 r) T[size=1em]3 1 c: M: E' M/ A) a9 q
[size=1em]4 1 O* v' e* k$ n5 C3 K' g
[size=1em]5
8 ?8 p& h! q* f: Z6 r- J- ~ O[size=1em]6 5 e% s U! u" }1 T1 {* L
[size=1em]7 5 ?; Y8 e0 a* U: Y4 N
[size=1em]8
* a+ U% y& T6 n y8 o[size=1em]9 7 c* w- @/ \. u8 _
[size=1em]10 ) A' Y# X$ G/ ?. L; \
[size=1em]11
* w [& s* h, ~7 R: d$ A* A[size=1em]12
4 c8 q8 ]5 b& [9 x[size=1em]13 ; P# M% t( ^' k
[size=1em]14 - X0 U) ?5 l; a
| [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串
1 }0 t1 p- y: t5 M1 ?[size=1em] strreturn = ""
0 p3 r; H7 Z9 ]# {7 i n4 y[size=1em] for i = 1 to lenb(vin)
; y4 O4 r& A3 ]2 {/ ]4 A[size=1em] thischarcode = ascb(midb(vin,i,1))
6 Z$ o4 d* S7 t1 t[size=1em] if thischarcode < &h80 then% T; c7 W( J4 _: `% ?5 C, h5 @) J
[size=1em] strreturn = strreturn & chr(thischarcode); d* P/ G9 J0 H, }
[size=1em] else: F- B; l* f! W- i
[size=1em] nextcharcode = ascb(midb(vin,i+1,1))$ j% F$ S O# ] I8 D, Q0 J4 l i
[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
/ H1 [, l3 d1 k4 V ~- _[size=1em] i = i + 14 k* H/ {) J9 g( R
[size=1em] end if
. Z7 D& K5 O1 L' Z& y/ t- o$ V[size=1em] next: A- W" E: a/ k# p+ M
[size=1em] Bytes2BStr = strreturn
; O( ] f) M! V1 @! n[size=1em]End Function
. I0 p- N# ?/ b4 w
5 P' k9 ]( O7 N1 o |
4 n. W- L6 r7 [$ o% h$ T# H; K! P) i& t0 \4 }. g& O2 g5 E0 }! V
3 L- b$ E7 W* X9 h4 i" x+ |% {( d" ^) k* B% d4 {
T$ O( k, i- n 3)事件onreadystatechange,状态转换函数
& T' c' Q2 }; U0 Q
% @: M* t1 ]5 x+ \ 4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。
3 l- ~/ K$ }/ ?% h/ L参考
( k: `' f2 v( A. t% h' a, z6 D @ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容+ Y9 L& m, X3 Y0 H
4 t8 e8 u* ]3 V 容易出现错误的问题
/ _- C( }9 J' ]' a1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。
0 @; J/ D7 i& t+ K) J5 C, Y& Q5 ?/ ? ]; u& k0 J
2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写 [6 K p% I5 ?2 J$ _
( C) p; p7 j; k# o6 I
3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写& \# R7 ? [7 L* Z# J
5 K! e9 N) I$ L0 L# I- K O
4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。
, {: E3 |$ b1 R$ \' ^ 特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。' b4 e" [6 `' _% ]- U. k8 j
3 H c% _7 q! Q. Z
对于手写ajax代码一些建议
0 E0 r, w! _. b) q7 o7 D/ W+ r1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。
6 m; }& w5 p4 `- J/ D参考webservice json0 g2 P: G* i. a" U$ j
' m# b8 J8 w: U, W( g& E
2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null); u, h; k5 e ~! F: {
3 {. Z) N4 [& a3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded, f8 t: r1 ?7 {! U' q0 f$ G6 v/ q. Z" q
6 _" E& v# ^2 x8 v+ N: T$ U
4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用9 R8 {9 H# M: c2 u3 [
0 z" n7 r) m5 Q4 z8 ~
[backcolor=white !important][size=1em]JavaScript code' x& R- O, k# n0 |( r1 D
[color=white !important][size=1em] ? & |. p4 S8 j2 o2 }
[size=1em]1
) t/ k) Y7 H1 M[size=1em]2 3 n4 x0 I3 d, F0 m5 k2 O# I
[size=1em]3 2 u& I, ~0 f F8 R( E
[size=1em]4 5 b& c8 h9 e1 b" c1 _4 K
[size=1em]5 % c- r# ~# }& K" F
[size=1em]6
" Q$ P' k8 J, d! y[size=1em]7
& g9 n6 \% P) k3 _! G7 d% n0 ~[size=1em]8
& b3 ~# J3 G& u[size=1em]9 & ~6 E. u/ a# o% v4 C, L) a7 p
[size=1em]10
* G! ~* O* [8 j7 v& G: k! |[size=1em]11 + n. S- ~- Y9 H N* s
| [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
7 \" d4 T2 G0 n1 P7 f[size=1em] xhr.open('get', 'index.html', true);: q9 h) z) [" |' y; U) l) l
[size=1em] xhr.onreadystatechange = function () {
. W5 d! S) K- m, p/ G[size=1em] if (4 == xhr.readyState) {
1 W& Q: ]1 m0 H; m/ t[size=1em] if (200 == xhr.status || 0 == xhr.status) {7 `1 p: E4 m6 `! Z. {
[size=1em] //=========正常返回后的处理代码
: A& I2 Q6 y* ~, D5 ~2 w) k[size=1em] }
5 T& o5 ]; M% P) z% r: Q[size=1em] else alert('动态页出问题了~~');
- F+ r, p& ?+ b4 e9 f[size=1em] }. B: x+ y7 U$ ?8 R# ~1 c
[size=1em] }, p* @1 F3 `! {) U; s
[size=1em] xhr.send(null);
4 y6 F- t+ x; l/ A' e& B6 Q# J$ R7 U! m' M9 A# G
|
5 s: V: Y7 p" p( c: c; n6 D% _, r8 V
- M, v4 [. K5 e
0 V7 G% J: {' y8 s/ x1 T! h
: W8 V( O0 Y5 u4 T
/ a8 w7 |7 D, v1 A# z: @# [2 ]- h5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。
3 t9 [: y- z9 M5 O2 y+ W! l如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。
7 Z) A9 s& A2 q' T& L5 J3 r |
zan
|