- 在线时间
- 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版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。
?/ r0 r0 m3 a$ H( s
2 e, p& r5 |( b2 ^& c/ I 下面是ajax对象的一些常用属性,事件和方法2 Y# h+ e* ~& w8 \6 A
1)标准的ajax对象的属性有readyState,status,responseText,responseXML
2 t5 ^9 `, B* }7 T( x/ u4 G: n6 @8 Q" d) r) y. `
2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。 # E& Y& p$ }" [0 K- b# w! s
[backcolor=white !important][size=1em]Visual Basic code1 y2 m, L7 Z5 z$ B4 a/ H
[color=white !important][size=1em] ? $ ?3 T* e* r' f# H& d$ G& C
[size=1em]1 1 X# L+ J6 s+ l! A' `! h4 q
[size=1em]2
$ f/ ^( e7 y( D- i[size=1em]3
( Y/ {& Z$ }9 d1 E[size=1em]4 $ |' Z5 Y/ w9 H5 e7 u# @6 W0 |
[size=1em]5
; f% m$ q4 O: D7 v' { L[size=1em]6 / ^' V: |! a, s. W. ]
[size=1em]7 4 }' E3 e5 V& J6 i3 ?% \
[size=1em]8 ) @8 q4 d n# r% ^: f5 }2 p T
[size=1em]9 ( Q) x! w; T; x: P3 ~4 ^ J: r# b
[size=1em]10 , }/ S* a! o( m+ r. t
[size=1em]11
; ^* y- m( Z! S3 Y" y/ X+ b[size=1em]12 . y6 ?7 _6 {( \/ T2 Q( t9 x8 e6 q
[size=1em]13 $ O/ O! k( x0 H# a7 |6 C& g
[size=1em]14 ) J. s1 P0 ~; o1 t8 _
| [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串
' p) @7 [1 H# C) L2 ~! o[size=1em] strreturn = ""8 N4 v! g! |' ]3 I+ p+ a
[size=1em] for i = 1 to lenb(vin)1 r: {3 y1 C4 J3 m: Q/ h9 ~5 H$ D
[size=1em] thischarcode = ascb(midb(vin,i,1))/ J1 S5 s9 T, w2 T
[size=1em] if thischarcode < &h80 then
+ R8 m" O1 U, @4 Z# m[size=1em] strreturn = strreturn & chr(thischarcode)
+ p% }. a; h4 k" J2 M8 g[size=1em] else' ~) E4 E( A8 |$ e
[size=1em] nextcharcode = ascb(midb(vin,i+1,1))* t4 s8 R! Q# ~4 j$ X' `
[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))5 V# B) c4 K3 M8 a' V6 v
[size=1em] i = i + 1
( h' b0 P1 t3 y, u5 c8 v7 m a6 F/ W[size=1em] end if4 ]; J. ^" S9 @7 ~1 I/ _
[size=1em] next0 L: I( @* v$ B# w/ v" S8 v
[size=1em] Bytes2BStr = strreturn) C$ J b9 L' n0 h" n
[size=1em]End Function4 l p- c0 B6 F
6 D+ M5 N, ^ V9 n1 I | ! |$ n' V+ ^- L- C* x2 a# Z
5 o6 O: m1 J% w Y9 D
, w: D0 [5 b" j2 k) I
# V. q) s4 i, y* W: {
4 U0 m: j' F* U! u' D
3)事件onreadystatechange,状态转换函数
& w$ r+ L, l% j( c: ^; Y! Q* J* J E
& P7 u9 G( W# B6 G0 z0 g' U2 V 4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。9 ^# R9 @4 ?! X0 o
参考# Z: g# J/ A8 X, C
ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容7 u8 G J& I6 [3 F) f
* s% B! I5 O8 e7 w8 Q( S
容易出现错误的问题* o( \$ R( v( ^9 `. D
1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。5 ?( H K m7 A
8 X0 Z/ ?8 H1 P) v3 T8 {' J4 I
2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写' z& T+ f* S* N: M5 Q, g4 } ^9 I4 Q
3 n( C0 M6 R2 c9 I$ o7 p5 u3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写
* Z3 I6 t& l6 D! b; f: w# C8 s$ I2 N# P/ T' y. g
4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。+ I2 o- A* |" y9 y2 ^
特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。6 p9 Z2 ^4 _7 H7 d% o
5 A, S i; ~1 f1 p2 p3 E
对于手写ajax代码一些建议
, l, a& D4 @- a1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。% F, h, g, t7 `1 }9 \( g. S/ r
参考webservice json
! I* d4 R& }5 c- t/ T& C7 M* @% R5 }$ ?! o, z+ @
2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);
+ m# F, I% G3 U2 u- U6 y5 j: s- F% M7 `/ V
3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded
+ y n7 Q6 m" h. s0 M% D5 u# y( K s* J: J4 [' w( v! J& n1 s4 I
4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用
( P7 E% n4 p8 O2 s$ S# b
5 _; l9 m6 t- N8 L0 c[backcolor=white !important][size=1em]JavaScript code
% ]* u9 w v C; \8 }5 G: K[color=white !important][size=1em] ?
, h) _; c) V- W4 |[size=1em]1
' d* b v/ o; w. R: d2 ~6 E[size=1em]2
+ Y8 _2 Z5 ^7 s2 y; N[size=1em]3 . c0 Q' z3 K& \
[size=1em]4 4 {8 g* ]/ s6 B, f
[size=1em]5 7 ` C- f5 y2 A) @/ {0 V# I* H8 R
[size=1em]6
! s/ A3 L) j+ t8 b- I[size=1em]7 5 [* M$ H0 Z) G: G. E
[size=1em]8 ; [* S% b/ d$ u) P
[size=1em]9
. v9 p% x; q( C! t+ ^[size=1em]10
! W7 L O! ^( [$ u[size=1em]11
5 N7 \; O3 [3 S3 L | [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
1 F; |; u6 ~- C2 ]! G[size=1em] xhr.open('get', 'index.html', true);
" o+ u# o5 P4 F2 ?( X( N* `3 |[size=1em] xhr.onreadystatechange = function () {
h: C$ {. h: C0 k[size=1em] if (4 == xhr.readyState) {
4 \4 w- j9 ?; ~( O1 S[size=1em] if (200 == xhr.status || 0 == xhr.status) {- I& `7 ?8 W$ p+ ^9 T; P
[size=1em] //=========正常返回后的处理代码
; B0 W0 f* w$ Q/ T! f[size=1em] }
1 g* j& S& Z8 f+ d8 j7 b, k[size=1em] else alert('动态页出问题了~~');
& [: u1 i' q6 l: h[size=1em] }
, P6 h) _9 ?5 p8 g+ r; l% W[size=1em] }
0 |( O7 ^1 p$ u3 @$ B+ i7 f[size=1em] xhr.send(null);" ]1 @: a6 f3 e# ?6 `* P
( f4 T" z2 n) ^' e
| 3 p: M: v5 _3 b, U5 ?( C
- Q6 s3 m& B! a4 j( X) \" h2 ?
( E( [! ?, ?2 ?# F9 d0 Q( k$ \) e+ {. b
4 ~1 ?% c# E1 ?* {7 X+ {4 A( I7 m$ p" J
5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。6 z! b( g9 ?. R2 O
如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。$ o5 Z& ~2 ^3 E! N# T& W& _' [; D4 \" I
|
zan
|