- 在线时间
- 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 W. j, _) q' n- o- z
. M& \! m) e7 ]$ O0 A/ @ 下面是ajax对象的一些常用属性,事件和方法
4 g- W( C4 J- m8 p6 t8 y 1)标准的ajax对象的属性有readyState,status,responseText,responseXML
8 Z {) W: \4 H/ O: Z/ ]
$ d2 A0 u+ X N% T0 z6 c6 a9 ] 2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。
" S3 ]9 W6 H( V[backcolor=white !important][size=1em]Visual Basic code' N( i7 C" s {, R' k& o1 q( z
[color=white !important][size=1em] ? 9 e6 }* E% d4 e$ }, @$ L
[size=1em]1
: O" V1 E4 N/ x7 W0 r* o! @* k[size=1em]2
: }& o# {/ u: W* g. w* m) m, ^[size=1em]3 : ^: B- U3 o1 h: z0 T/ U
[size=1em]4 " i) N) z z- s; m# I4 y: O
[size=1em]5
' @* ~" ^. A0 ` p4 b+ \. ?* Y* t[size=1em]6
, b+ G3 F" K9 {[size=1em]7 3 _# f& ?0 Q1 V( l- O1 |
[size=1em]8
I8 [1 G( s6 o+ \( h' d[size=1em]9
, g3 T4 \5 ^* l! E* X9 |[size=1em]10
% R6 _* }8 i" Q2 Q) Q( V3 W[size=1em]11
1 t( X( v2 s% E+ q+ z0 P[size=1em]12
+ M& I; G- J* m! R/ B9 A0 J[size=1em]13 9 f' S# `' v( Q- n
[size=1em]14
# y9 N+ l/ a! t1 S. m. J( e | [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串
# A' Q; H6 }5 Y1 Y9 F. Z[size=1em] strreturn = ""
+ ^5 l6 X) e+ _6 K7 L$ d) ][size=1em] for i = 1 to lenb(vin)
1 S9 i. A4 T. {- d* X; i& f3 Y4 V[size=1em] thischarcode = ascb(midb(vin,i,1)) L0 g% p# B1 b
[size=1em] if thischarcode < &h80 then
, r" A2 W" F. |[size=1em] strreturn = strreturn & chr(thischarcode)
& G/ X% W/ c& Z; ~/ [0 N4 k) U2 ~' L[size=1em] else2 ^1 r" {6 t, s- Z6 W, ]
[size=1em] nextcharcode = ascb(midb(vin,i+1,1)), {" i7 R) p, P% ]: |+ P P
[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
; P" [6 C& J- Z[size=1em] i = i + 1$ R- L2 v+ ~# @0 w$ \& ?7 h C- I
[size=1em] end if
! l" |; {5 H7 r4 v3 @[size=1em] next5 k2 p! v4 N! q/ q- F
[size=1em] Bytes2BStr = strreturn7 L' z4 C6 r: f: i5 m& J" e6 I( E$ l
[size=1em]End Function8 e8 l* n Y: s; z
# Z- L+ H: Q( \& O1 k, ~( z |
4 f, \4 n9 ~/ J. |8 _ ^
( `4 A! y5 y9 {& Z' B, o6 m! V/ j0 V( C
" t# }- O+ f! `( `4 M! r( k) k
4 j {7 S% }' @4 r' N; E# x! | 3)事件onreadystatechange,状态转换函数
8 {8 b( b$ v3 R$ o* I3 F1 n3 |9 _1 ]* _8 B" B, o4 Z1 \2 h. `. z* u
4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。; K- t7 j# g# B5 a: X9 J- ~. ~
参考
" u$ K c, d3 J5 Q0 ^ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容% \6 S- ]; ?! ]1 t2 a) \
\( {3 J# @# O* G7 d 容易出现错误的问题. Y7 o% g3 j; s0 U
1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。
# S1 B) H; Y5 a' e8 @5 x; U8 M- j
2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写
; O0 P5 `. [. w( u# B( D3 N/ `* E
3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写, k" p+ Y- D' N! g! _$ F
: p6 E6 x. m5 h4 k4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。
6 c+ D. v( o3 ~# o7 V5 v 特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。) `5 I8 \1 O5 w9 y( w! S) A
0 \) W6 B) @1 u) z, H
对于手写ajax代码一些建议4 Y6 z+ U# O0 n. P7 P
1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。
/ {/ m( `% f6 i1 p( p' {6 H& U参考webservice json1 \4 ~/ h$ r7 s
! N1 ~- `" O/ h5 l' X( Y
2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);$ o: ?' a0 j0 {* P# o
6 I4 q$ v5 }6 }+ j* p W7 ~2 q
3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded% D( @% D$ I1 P& u u( j* N
* p+ {& D& f" O
4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用
, x' f. y8 k* f/ d. q( a# q3 j$ C: b+ x6 [3 I6 ]! ^: y5 W$ E) N/ I
[backcolor=white !important][size=1em]JavaScript code, R0 Y( ^+ i2 G( b; ^
[color=white !important][size=1em] ? 2 s& c( Q/ T. e3 p: x
[size=1em]1
. l; u0 X" Y' v[size=1em]2 1 f( Z' d- K7 G9 B: ]% H0 t* C5 P% l
[size=1em]3
' o3 U# u4 B$ M. c9 p[size=1em]4 ; ^. p! X: o) i$ Q N7 @
[size=1em]5
; J6 ~1 H* @$ a* v, g9 c[size=1em]6
; @0 l$ l2 f" l3 J0 g[size=1em]7
) @ W; S$ r; J" `: n: F[size=1em]8
5 R' b4 O. k; v3 g& w* X! q[size=1em]9
( V# ?; D; A& I[size=1em]10
: w( T1 d$ q) i8 ^1 ~[size=1em]11 `. D; K* J$ {# s$ {9 ?: n
| [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
2 c* K* E+ J1 y[size=1em] xhr.open('get', 'index.html', true);
6 k) b/ h' M9 L[size=1em] xhr.onreadystatechange = function () {/ P. l4 h, ^4 }) R6 ^# v- R
[size=1em] if (4 == xhr.readyState) {' h+ r3 W# @+ ^) R/ y' U+ c$ X
[size=1em] if (200 == xhr.status || 0 == xhr.status) {
# @" A- u* x1 n* o+ \' `[size=1em] //=========正常返回后的处理代码
* k- N2 x1 J: L5 t/ R% r[size=1em] }
8 }" \( M7 B1 j- a8 I8 N[size=1em] else alert('动态页出问题了~~');
* U; E, T0 ~* H+ o. t[size=1em] }
) y! v8 o/ N1 a; Q2 r1 G[size=1em] }6 x/ t; g/ o. m$ y$ \* A
[size=1em] xhr.send(null);) @5 Y; V+ Z q! F6 I% r m l" f, z
% }" [+ B9 {1 i$ _
|
( F9 d: R& m8 T) q" y# G/ r7 ~4 U& X G2 x& c; ]+ Y
) S+ s. ]& f" p5 h
7 h/ \8 S' G; G, j. s: k) a9 m1 \6 B9 b# z1 |2 O
) U D9 g+ r2 J0 ]
5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。0 L9 O# h# z3 n) W: n" N
如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。8 H/ m2 a7 q% g$ H1 z, }$ l; F p" k/ n
|
zan
|