- 在线时间
- 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版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。
& c! r+ G+ ~& c* n! a
; X/ J( O* w# r$ R: p. t 下面是ajax对象的一些常用属性,事件和方法3 h2 U& y- R8 t) u: H7 a. ~! Y
1)标准的ajax对象的属性有readyState,status,responseText,responseXML$ I2 p" C# S3 \( K
7 F" q7 P0 a+ ?9 G. K' w. B! P6 `
2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。 + G" V' m& X8 G! N$ v; v/ K
[backcolor=white !important][size=1em]Visual Basic code; t- L2 g. v' i
[color=white !important][size=1em] ?
. |) J6 V. y( S" M# I) I) K[size=1em]1
' I1 [& ? R( v[size=1em]2 + D# d: @. J+ H" P! _. l: x
[size=1em]3
- ^/ ]% w- ?' ]- }[size=1em]4 : b$ T$ Q# D4 M# p; s# S7 E2 O
[size=1em]5 $ F+ ~% n7 \/ ]$ i0 A! d
[size=1em]6
; P; c3 i5 X2 s3 h[size=1em]7
' e; I; Z0 i; \( r' a2 D4 A, y[size=1em]8
" q7 i4 z9 q. U* ]5 x. W[size=1em]9 $ w2 ~' [( z+ N6 Z
[size=1em]10 3 v* n$ ~% t3 A" h- {
[size=1em]11 ' ~* i6 G& T" g) \5 {, E* K6 O
[size=1em]12 ; x* h* G5 ]& e& \" U
[size=1em]13 , {4 a3 }9 P9 J3 p2 Y' q! q ?4 U6 M$ D
[size=1em]14 / `& O, g/ j* f! |. f$ ~$ l
| [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串
' D, l- a4 z6 M C4 f[size=1em] strreturn = ""7 }3 n: w3 h% V2 B9 g
[size=1em] for i = 1 to lenb(vin)
8 |# d) h' a2 g4 g1 \" q9 y[size=1em] thischarcode = ascb(midb(vin,i,1))
3 J# [5 s! X2 g8 k[size=1em] if thischarcode < &h80 then
! J* a. O- Q1 n[size=1em] strreturn = strreturn & chr(thischarcode)
3 K/ l( } C; Y2 _- x0 V1 `8 Z[size=1em] else9 { W/ G5 c* c
[size=1em] nextcharcode = ascb(midb(vin,i+1,1))
9 k2 G8 R. t0 S3 ~9 C6 [[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
2 k# g: ^0 S2 E" {; G0 r' s[size=1em] i = i + 1, Z) I8 \$ S/ |% f1 r' t1 c) [3 ?
[size=1em] end if
( p; E7 q+ L% E. L[size=1em] next% ? e. f; z* \ V7 y
[size=1em] Bytes2BStr = strreturn: O( T$ q) ^. Q N0 K
[size=1em]End Function
/ {# q4 p* H; ]. m* @7 W+ G4 a6 S! q1 l& m2 g z( L/ {! `
| # D* D; O$ T. c! ]3 j
6 B! z6 F) Z# _) G
9 ~2 G. i& ]$ r) C1 f" {# S0 X+ H) b6 w1 y: q/ \* J
: N" Z$ l- v" |& B# y: f 3)事件onreadystatechange,状态转换函数
. w; B( f) ?" U3 I) J) a
9 L% y; u1 m% B! R+ } 4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。
, x4 S7 d8 W: @/ {5 W参考. F {0 ~( y) o& B
ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容
/ S' } A) f9 P1 r* \9 K$ g" G' ~; x' J; S# ~% L4 p
容易出现错误的问题2 K* }" Z( {! c4 W
1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。
6 K6 i/ X5 ~* R$ R3 S
. |+ C6 k- Y- ]9 [9 v* U- |: _$ `2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写
9 O* Q7 H* K% z; L. @9 M9 O+ ]+ f2 L! A' K4 R2 J+ E
3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写
" a% p# D6 }, J' g$ g4 S( J3 q
' f) m/ t1 }3 H7 i$ U0 K0 h3 B4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。- K, J! {0 k* K- ?& F
特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。
0 m/ W# e" [: v9 s/ |. r) |: I; B: u
对于手写ajax代码一些建议
2 h6 y$ H$ h9 w$ I9 T1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。$ X. s Q( K1 x
参考webservice json
, }7 a+ j* y* `5 T) X
' z9 g6 D+ G; M' ^6 D+ b( u, l$ f2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);! G. B3 c) i0 N
7 ~% p& G- H! Z S3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded
t7 v% U4 ^9 a3 x% Q. e( t" x/ J) r: V# y- ^: [/ {! }$ \
4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用
7 N, u& ?0 x! E- P$ v% u* h+ N9 W, I+ ~
[backcolor=white !important][size=1em]JavaScript code
0 Y+ G- }- m3 f8 I- Q# J/ L4 b[color=white !important][size=1em] ?
0 S, R9 u/ R" G2 e N( G( s y[size=1em]1
! [1 y* C S, z( H2 F0 L[size=1em]2
9 _0 a. Q A' B! [) T5 o[size=1em]3
0 a5 _2 o# { g3 C+ M[size=1em]4 7 L2 _" x" O# S* u
[size=1em]5 - u5 |' j* v8 N' {
[size=1em]6 ! Y0 Q2 p2 A9 E: o# I5 p6 L
[size=1em]7 o0 K) R. f' I7 m: L
[size=1em]8 3 T2 ^4 M y0 w+ Z- [
[size=1em]9 2 m6 Z5 H5 Y6 \6 L/ L5 c4 V) J
[size=1em]10
# s" m `5 O M5 A, \, I[size=1em]11 9 ~* Z7 E& ~7 q/ o
| [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
0 U+ H) l) |1 @: Q[size=1em] xhr.open('get', 'index.html', true);% _# ]2 T4 b: A7 C8 C$ p* s3 A
[size=1em] xhr.onreadystatechange = function () {+ {& V M( S+ H" z% l
[size=1em] if (4 == xhr.readyState) {
9 j& y2 L! ~/ J' M1 ]( F[size=1em] if (200 == xhr.status || 0 == xhr.status) {( g3 W, k* K }
[size=1em] //=========正常返回后的处理代码
9 z2 w+ s, q1 M9 T& r[size=1em] }( ~5 R8 p; e+ p$ z
[size=1em] else alert('动态页出问题了~~');0 d) e2 r2 e* @, {$ ?( L& G, k) W
[size=1em] }8 L7 K S" i) Y" p7 f
[size=1em] }% v' w8 H; _6 V/ ?, V
[size=1em] xhr.send(null);' B' i4 y4 G$ q* S! O
) W# A3 v! T+ j( w4 @: s+ u4 {7 B |
% X" r9 d* Q+ {& K# Y6 g2 @* G9 _/ {5 u4 N' R; N" {
9 T7 \: V' W# E" J
2 b2 _% r* b% g! a: ]# I; V
5 x+ B- w( ^6 \
% m: N0 z- l4 K( m2 E+ J/ A5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。2 f- a; X2 f! H I$ j
如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。
" t0 u" Q0 k4 y% H |
zan
|