在线时间 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版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。
7 f, H* {( h, e* X: b9 [ , h5 E" q' y' W2 u6 B$ R
下面是ajax对象的一些常用属性,事件和方法
% ~5 f2 x- R8 l0 E. f4 B: m$ O 1)标准的ajax对象的属性有readyState,status,responseText,responseXML + A K K% A6 r% X9 A; j, j% @
8 p: L# I8 l9 x7 F; u; E 2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。
& I2 f1 j! O+ v1 R X [backcolor=white !important][size=1em]Visual Basic code: b+ \/ N5 f! G. `& H3 m, O
[color=white !important][size=1em]
?
; ^+ a- [( Q% \+ e [size=1em]1
& |9 y( v: t0 z* T) l [size=1em]2
6 v, V5 ]+ p; H! H* L' C
[size=1em]3
( k4 {$ ]2 A7 M. l# j) ~ I( C
[size=1em]4
5 l4 {0 s, a' C# N8 s1 `, x [size=1em]5
/ J9 P, P N: \# C7 O' K% j
[size=1em]6
" C; S$ a/ e. O* x% i
[size=1em]7
! C% Q A: y. j! p# _3 c4 D
[size=1em]8
$ B% Q7 s$ F6 N, I' ^2 r
[size=1em]9
* t8 K* J! a: P" t# s! P: U [size=1em]10
; s+ d* X8 E% C4 c [size=1em]11
' B* E R3 u1 b+ r: P1 w [size=1em]12
y* M3 C+ e2 b5 B; T
[size=1em]13
! P1 o) O" J5 I4 U [size=1em]14
6 a3 U) v4 p7 w4 q- q [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串
s( t, g; ^0 r0 u8 O [size=1em] strreturn = ""+ T1 ^0 E7 l- S6 t! C$ u
[size=1em] for i = 1 to lenb(vin)8 V: d1 R9 \! r1 Q, t
[size=1em] thischarcode = ascb(midb(vin,i,1))
6 X3 ]) M, G7 M1 a [size=1em] if thischarcode < &h80 then0 I( `) Y# F- c R
[size=1em] strreturn = strreturn & chr(thischarcode)
8 k. Q* o( |- M0 C, w [size=1em] else
' L/ U% x+ [+ H- [! E [size=1em] nextcharcode = ascb(midb(vin,i+1,1))
5 S4 Y$ I q+ i4 |: V [size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
& [( |# e+ A* ^2 X V7 O5 ~, R( S [size=1em] i = i + 1
6 N- g/ N% f5 e3 C [size=1em] end if
# o. l2 U: z8 [9 K" w [size=1em] next. w1 Q; _2 g9 w. E5 b% W7 l
[size=1em] Bytes2BStr = strreturn4 n1 B& \8 W- [
[size=1em]End Function4 k A* x& T1 K% L. M
2 T4 x# M2 j% |$ k3 ?) r
6 ?% ?8 C7 I; c8 c# D) ?2 C
9 e; J/ c6 ]. C: {
# H% x) ]; v8 ]% `+ N4 ^ # t0 Q" T. z& x/ p1 j' Y. Z, ^: x
; w% e/ n8 o5 _2 Z3 l! V) p
3)事件onreadystatechange,状态转换函数 * g2 ^) A. @5 I6 P7 d2 Q% p
( y H& V X T6 o6 Y2 A9 K0 { 4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。
' F: e+ x9 P9 Q/ w6 _: d 参考
5 [& d2 S/ o; A# i ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容
; p, m- N3 B; X + i7 `0 `/ i# m& ]4 j
容易出现错误的问题
* }& j7 K1 z: t- S# x 1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。 0 {. ]8 E- H; @8 b$ u- s
$ e( W( ~% D5 R* t
2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写
( v; H* h$ H. p + [% k. B6 m" z
3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写 % V7 i$ K8 Z2 b. L- ]2 R
5 ?5 z9 g- p+ x: f; \3 }2 h& |
4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。
( \( {% V/ {* X8 S& D' ^6 k0 U: H9 z+ m# s8 X 特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。 8 L) d( i" w/ z3 z" ^+ r$ Q6 B: m' m
) b, _. V6 `& ?& L 对于手写ajax代码一些建议 ! k, D4 N# J( Q* ~- J- X$ p6 B( H' e( w
1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。 1 f5 _/ b& P) X: k4 V/ o4 _
参考 webservice json
/ Z- W1 V9 K' l* B. l ( P+ b X6 ], v ^
2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);
, a3 }% j* a) b# Y; u5 ~
0 U `. t8 W2 Z 3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded
w! @5 i( x: E' K2 Y$ z/ a 3 g7 c0 W! P! ]7 H! `$ T& h4 a
4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用 ! R& j: T8 ^1 D, s& A2 @3 n) R
# R, O1 ]4 p+ M! ?/ Z! o+ `+ l
[backcolor=white !important][size=1em]JavaScript code, g& H3 }9 D' T; q
[color=white !important][size=1em]
? . c+ W& {: B' B$ f/ p
[size=1em]1
9 E5 l2 O/ X! B7 U4 q. }
[size=1em]2
3 p: p: w, `3 O* O! B2 e [size=1em]3
' g2 z0 l/ G2 n6 Z [size=1em]4
7 B5 r8 w, W, j" [% N- _- _
[size=1em]5
6 A8 Y0 \. [: f6 i [size=1em]6
* z+ y1 L3 j0 w5 {/ J
[size=1em]7
! i6 ]2 T$ \; |* @% U" D/ J+ z
[size=1em]8
k/ j b; ?# w; N4 S [size=1em]9
4 d3 s0 C& T9 z2 b
[size=1em]10
' D. w, F0 B# R, G
[size=1em]11
l$ ?6 Q+ g! |. `+ {1 p) ]
[size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
2 x Q" N ?2 w- E5 U( [ [size=1em] xhr.open('get', 'index.html', true);
" m. e3 g1 C6 s [- V [size=1em] xhr.onreadystatechange = function () {
5 N1 h0 p2 ^4 l, v [size=1em] if (4 == xhr.readyState) {
! N6 S" i, |$ U. r) L* ^ [size=1em] if (200 == xhr.status || 0 == xhr.status) {5 J" t) W9 V6 h1 s
[size=1em] //=========正常返回后的处理代码8 V4 r; A, |/ Z, ]* R' E
[size=1em] }1 o& j) I+ {) g0 a1 W! _
[size=1em] else alert('动态页出问题了~~');
. \; e( T- l- ?% s [size=1em] }
. G: G9 y! Q8 k! j [size=1em] }$ {/ d* B0 e& ?6 O/ z
[size=1em] xhr.send(null);
" e, v: `% E1 D5 d+ t
' X2 U4 n' _$ w5 B1 s" i4 H2 w
2 y+ Q7 y: t1 z& }. [9 P
$ Q7 r9 ?! d6 ~
Y# H9 w0 l& ^% B8 { R7 J% l; r" \* p, x# L' R
' j" E% [/ S" J
9 V( C7 ^1 r! U; @7 f, J 5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。
2 O1 h0 ?& ~; b% D& [% k( f/ T2 {- ~" L 如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。 9 |2 l6 `1 ]& C" X
zan