- 在线时间
- 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 L- `* f: i/ ^5 ]$ C- s
- D) @. X* k$ a6 @: c
下面是ajax对象的一些常用属性,事件和方法
' i5 q3 G6 b8 p2 z. ~" v' S2 t 1)标准的ajax对象的属性有readyState,status,responseText,responseXML( }% H8 i \/ B! S. F" r0 F
; E L+ J @, T
2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。 " `+ _* C w+ T4 @" k
[backcolor=white !important][size=1em]Visual Basic code+ J* D% L, |$ V
[color=white !important][size=1em] ? $ \! F2 L, A8 f$ P" U
[size=1em]1 $ ~1 v, q$ R$ ]: p2 }
[size=1em]2
) P2 @6 |- `, u7 N2 N9 T[size=1em]3
" E. u9 r! i( N0 W% o, _[size=1em]4
& e2 J; {: p; ~7 L# x[size=1em]5 ' V# H3 W+ o2 H" o) S
[size=1em]6 8 u1 V1 I9 U2 j* `/ F( a
[size=1em]7
" g: [/ N8 W; a9 q8 z[size=1em]8
, c+ `7 Z7 Z* l4 |[size=1em]9
; t3 [3 Q3 \5 @) L9 H3 i[size=1em]10 8 U) }0 Q! K t+ n" }3 X+ M9 m5 b
[size=1em]11
. b8 o: O# J% d: T {[size=1em]12 6 V; Y' i" P" c9 F
[size=1em]13
% m& f6 x7 [2 |, F[size=1em]14 5 u' s; N1 V4 t. `8 X9 [% K8 ^
| [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串, G, s9 u- L! Q( b' N( l2 u2 h" m
[size=1em] strreturn = ""
8 w# e0 p- l3 y8 e+ G- z+ G[size=1em] for i = 1 to lenb(vin)
! f( k; p: V3 M3 G+ t$ `5 N5 F& A# N[size=1em] thischarcode = ascb(midb(vin,i,1)) e5 `& }. z- \1 ]
[size=1em] if thischarcode < &h80 then4 [) N0 D. ^6 n, K6 \1 u) e, ~, x
[size=1em] strreturn = strreturn & chr(thischarcode)
$ Y* r r5 Y4 g: q- w' W% Z* Q[size=1em] else
0 |. g: s/ m4 N( e6 F: {* n5 U[size=1em] nextcharcode = ascb(midb(vin,i+1,1))6 \2 p. B) Q/ \8 j! o
[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
% {2 k9 x x! T. B u$ P[size=1em] i = i + 1
; ^% E0 p) X. C% ]9 A[size=1em] end if: Q7 j, x2 ^1 d
[size=1em] next
! M0 L/ I O( p$ I% @ x; [[size=1em] Bytes2BStr = strreturn6 E; F. u7 O% Z
[size=1em]End Function! ?$ ^! ^0 U5 n& ~
y5 `+ s1 e: L2 h
| / [. A* M: d1 P
: G# i- g2 N5 v3 W- A) N% U$ W1 H5 K% p
% n, Q" f- ?; W G2 A8 R. c4 m
4 Q3 t9 O8 }/ A0 t
. N V [5 S8 j- a L1 s: a7 Z
3)事件onreadystatechange,状态转换函数1 u: j* g8 X. U" i
" Y; ]8 V* H. ^; t2 ?6 s
4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。3 L6 Q# _& N& A
参考
0 G+ N! X1 s. w$ Wajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容
" ~' M+ c7 P( E5 A; T0 f0 F. [
: Y1 d/ r- Y) z3 T& {) s 容易出现错误的问题
* G6 Z% I: n; i+ s" y6 L1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。5 ?' y4 e* H' m( E; R; d* @
: t& o; A P" }! i- M" d# f
2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写
, a: d9 r9 M% w1 ^
# ^. E$ a/ \, Z7 k$ J- C7 ~" x3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写9 \6 {2 C p- V' i* x% z* Q* _# w
0 S! k1 k( q. J; A5 P
4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。; i1 d- {2 q7 S7 g* }* L8 ~" i v
特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。
$ D; k: ]8 k( F& @- }6 a; w- ^& A" G& b3 v: `4 S# A$ K9 O# P4 u
对于手写ajax代码一些建议
' E& [9 n/ R' [1 ]1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。
, P3 m1 O4 E( O4 W3 B3 l' Q参考webservice json
. `/ J5 Y2 B; {' g" Q
* ]# N% o: N; z" k2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);
% p& S* p; _$ T* r) C( `# ?/ M9 a# o9 i2 X" r
# k w2 J/ |4 ]3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded* p5 l) ~) \/ E f) L: s9 l p
% M* G6 B9 X' \( i1 a- k4 B2 ^
4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用
7 M! C9 y! q. F2 q1 X1 Y# ]6 Y" N! t6 [. _, g
[backcolor=white !important][size=1em]JavaScript code
, S) |$ b8 S0 O: _7 j* }" k2 Z5 m: K[color=white !important][size=1em] ?
8 e9 p0 I' F0 x4 y5 H/ _2 X; g7 O' @$ R[size=1em]1 6 n9 L9 C( j9 ]* i% T( a
[size=1em]2
3 |6 B* Y- t/ W( ^7 A[size=1em]3 Q% o9 C* I- c( b
[size=1em]4 ; S' J! h: @! Y2 Y
[size=1em]5 / o# z0 |, r" ^+ Q; s
[size=1em]6 . I; l8 e1 Y& ^
[size=1em]7 ! \4 W. n) o- l' u
[size=1em]8 ! L0 }! M' G1 ?8 @: i5 c8 }1 v. w: ~
[size=1em]9 6 V/ n9 ^% P' ^
[size=1em]10 E$ \0 G5 F ?
[size=1em]11
2 O1 l4 _6 k& }3 h! _& s | [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");: Y- X! D) G5 }5 E6 I$ t1 ^5 w/ u$ r9 ?
[size=1em] xhr.open('get', 'index.html', true);$ J x4 y0 `' Q7 w; e3 T
[size=1em] xhr.onreadystatechange = function () {/ M) S6 A L4 M& m1 {3 I3 n
[size=1em] if (4 == xhr.readyState) {$ d+ V; ~, @1 z7 J
[size=1em] if (200 == xhr.status || 0 == xhr.status) {$ ?9 H( K2 n: B, ?
[size=1em] //=========正常返回后的处理代码
! x4 S$ Q8 k; c0 e[size=1em] }
3 O! z& _4 `7 M# L[size=1em] else alert('动态页出问题了~~');
" k$ m& S# E& E1 M[size=1em] }
M$ U1 A4 d7 t$ L[size=1em] }
/ `4 U+ j2 u+ @3 w4 G8 M[size=1em] xhr.send(null);8 b: R' a* U. i( \
0 K; @7 T* i& C+ {
|
4 ~ J9 q4 A/ C
: S# s1 l4 }( U: F3 o7 C- n
, a. O) w. u) c4 J' k6 j
& ]; W u2 c) f! q: }+ x3 z+ r' n* V$ r* R) h) t
2 y2 ^4 [4 J2 d, r* o6 v
5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。0 [, K: L! W2 l8 d& E
如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。
' U# o* F2 s) w5 K& l |
zan
|