- 在线时间
- 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版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。5 ?6 P! b8 p/ p, y7 G9 ^- @
# o0 S7 n: {3 l% z' D, n: G0 M 下面是ajax对象的一些常用属性,事件和方法5 M! B" f, H* j6 o
1)标准的ajax对象的属性有readyState,status,responseText,responseXML9 P0 V, v4 D! r% e
, A% ^! Q+ B% G' x) ]) \
2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。 % K/ K; W+ s$ Q5 v. U+ d6 h
[backcolor=white !important][size=1em]Visual Basic code! z, D2 s- J, ~" N
[color=white !important][size=1em] ? }8 c! i0 Q1 Q+ \2 [2 F
[size=1em]1 ' I. G3 ]; @8 L# u' z, y. F5 C
[size=1em]2 ' o' G1 K- G1 R8 U0 q# B8 f
[size=1em]3
9 F4 H; C5 _" B6 i* ?7 |* a h[size=1em]4
% y, [3 S( S4 c! m[size=1em]5 : X M9 C7 U! J! y3 u" j/ e
[size=1em]6
; F$ H5 p% E4 [+ j[size=1em]7 . A: _/ r" m+ O# ^% X
[size=1em]8
4 j+ D" f; u/ V3 o& ?[size=1em]9
$ N: h* E6 I1 d* T- i4 ^[size=1em]10
4 @7 \- k$ q- R[size=1em]11
0 l1 j+ G+ N6 ?5 m" l: N[size=1em]12
( J; f, D q2 ]: g[size=1em]13
' X- ^4 I+ N1 D5 g4 h9 b[size=1em]14
3 \2 `( k; m2 o | [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串' Y9 P( z8 ^3 W& S. O! {
[size=1em] strreturn = ""( r1 }4 X/ K; `) x3 U* k
[size=1em] for i = 1 to lenb(vin)
" e& N4 u- ~6 |& v[size=1em] thischarcode = ascb(midb(vin,i,1))
4 C, r) }. A9 W+ S) W- y[size=1em] if thischarcode < &h80 then
* v, E5 T6 D9 K; h[size=1em] strreturn = strreturn & chr(thischarcode). ~3 m$ ^4 w3 g" A, c$ f
[size=1em] else
& @* Z+ V2 D8 U0 o% v[size=1em] nextcharcode = ascb(midb(vin,i+1,1))
% u3 ?) E7 d. z& @ @- \1 M[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
7 N3 N) H6 V- ?2 B! M[size=1em] i = i + 1
( c/ x8 i8 X, G) m$ d) Y[size=1em] end if
7 h3 W6 B& q5 ?4 i4 J0 u[size=1em] next3 S4 v9 r% ], N) W0 V' S1 h
[size=1em] Bytes2BStr = strreturn
: F6 M* l* R( H/ L, u[size=1em]End Function( u" l$ v, ^! H6 B4 h
4 m6 y$ a" ]. ~' Q | & b9 M: [) X( V/ L- ~
( u1 }+ W# h O8 C8 S p. l( J7 @7 \6 V4 c6 @" J
5 v5 n; i4 H, F4 c0 [9 Q' K# P$ o. T7 T, ?0 k% I7 W
3)事件onreadystatechange,状态转换函数6 k# B! a2 V% j/ l! Q6 C6 M! a
5 r3 |. F/ i7 D) Y! M" ~ 4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。" a1 t: z! c( B7 u$ K4 I$ j8 I
参考1 _ m5 S! {# G# a: x
ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容
* d4 U% n& j$ R: ^
9 D3 @: B- V- D9 n& A# D1 v 容易出现错误的问题
+ n/ S8 D1 n! z- t1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。
$ [$ B9 {3 b Q
; d3 H, s0 Y' J, t2 C2 G( `, [0 T2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写
" T" W5 a( k/ ? d7 J0 t
, F; i z/ @3 P P4 e v# w3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写
, f y) Z4 Z/ O# T' _ c# z. G* D# x8 U* g
4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。
) a+ n% c' E o5 w, s: T* \, [" ~ 特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。
3 D, v9 o$ r5 @+ Z7 v$ T8 y9 z& L0 T/ ^
对于手写ajax代码一些建议
; u( [8 J3 R% e7 g6 q% g% l1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。, K; i# X3 u6 N' K
参考webservice json
, m) N0 ?+ c6 |, E: v/ v# | d. [4 T
2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);& ^2 r _$ x4 \5 g; x4 `0 |- Y; N' C2 b. y
* n: V, U z w+ x9 ?3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded$ r5 I R" O6 } q. X( D. Q6 A. C6 l
; p$ x6 N E. z: J+ \: G4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用
: K3 y$ v. l4 ~& ]' c0 A
1 R6 u5 |9 @1 ~+ g2 y9 q[backcolor=white !important][size=1em]JavaScript code
) r1 E2 ?" z x, f[color=white !important][size=1em] ? ; K, u0 ~. x. R( q% L- M6 e# e9 W
[size=1em]1
0 @" c$ v8 u4 m3 d[size=1em]2
) g4 O5 L; R5 b# D9 h+ R: n[size=1em]3 3 U. a% k$ e5 U; n, O
[size=1em]4 5 s" l$ T- ~- s
[size=1em]5 ) G6 B' ]9 t: G# \" a
[size=1em]6
$ z' m& P4 R( z8 Z, h[size=1em]7 & b4 h9 W6 o% _. ]$ T% U Q
[size=1em]8 6 F5 S3 z8 K9 Z3 D6 F+ E
[size=1em]9
% Q x/ {4 s* u/ b6 Y4 Q[size=1em]10 0 b# i( S; m8 C9 s% _( c. _
[size=1em]11
$ q2 U7 y7 Y, R) t, a | [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
0 Z$ _# t- F% A[size=1em] xhr.open('get', 'index.html', true);
" D3 R5 [3 f- x9 V; O& Y1 F1 j# j[size=1em] xhr.onreadystatechange = function () {/ s) g% L+ G: f9 v4 _) c
[size=1em] if (4 == xhr.readyState) {
# |; i: T* e6 k& F; D5 E0 c1 s[size=1em] if (200 == xhr.status || 0 == xhr.status) {
2 T [" Y5 T$ J8 v9 v! o5 ?[size=1em] //=========正常返回后的处理代码
% D4 s( N' J- e4 b& c& r" _[size=1em] } x% T- n2 J& i* T
[size=1em] else alert('动态页出问题了~~');
# L. f# w8 A1 q. Z- w: ]! F[size=1em] }
. p- I! v4 H8 S3 W; P8 s[size=1em] }
9 h: V) }' f$ @/ R4 i% }; f[size=1em] xhr.send(null);
5 j! i4 ?3 Q$ d M8 I* W
3 ^' |) [5 m2 u. Y7 ?7 x | ' K% f1 ]3 x- N" ^& j6 _; k3 I
, U* o$ J D5 l
+ Z( d+ h* x! C' c2 a$ D& d- i
7 s6 ` `# ?1 [" H0 [( p/ g! D* [2 G4 V( e+ x
( D; T1 d9 O/ b! C
5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。! r0 X9 L* x6 H
如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。& x H7 O* w( |
|
zan
|