- 在线时间
- 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版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。$ F, S; n* X1 F) v
7 Z$ D- r% [1 x9 i" o
下面是ajax对象的一些常用属性,事件和方法
' X; [- N( ^8 t8 D% C1 q 1)标准的ajax对象的属性有readyState,status,responseText,responseXML# I# K4 j& [; S
|% w, @/ [4 {: d! y, [ _; ~
2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。
3 ^, z2 d3 y7 t/ a o- n[backcolor=white !important][size=1em]Visual Basic code
' i$ Z/ ^; ]- h2 U[color=white !important][size=1em] ? 1 x+ @. N, p* f# f1 p3 \
[size=1em]1
* j/ I+ L/ ?9 ^) Y) j' y[size=1em]2 / g. n' ~/ {- w/ `( k
[size=1em]3 + h+ N" v: A' m( b+ Y0 ]! @- f
[size=1em]4
% K$ N: {9 {0 }. i/ R[size=1em]5
7 F. _. T2 c, r0 [4 G[size=1em]6 6 C+ O2 K& A" E d9 N. L
[size=1em]7
4 D6 Y1 p& g! z) a2 t; Z[size=1em]8 1 Z$ u! {8 A! Y5 r5 f" h
[size=1em]9 + \' v. S3 S5 s- U6 l- s+ h! C
[size=1em]10
8 n3 l2 L2 X2 ?* p0 S[size=1em]11
% v( f+ |$ C0 i: R1 d' L4 ?9 q[size=1em]12
5 t* r" K' A- K' M' @3 q; l[size=1em]13
) z: V2 c# M/ l3 K: N' U[size=1em]14 ! {2 o" \7 u3 D% V
| [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串3 @1 i$ C/ Q4 H
[size=1em] strreturn = ""1 T& x6 U6 T; v4 l$ l
[size=1em] for i = 1 to lenb(vin)
# W5 j& X- a) x6 t[size=1em] thischarcode = ascb(midb(vin,i,1))5 G7 V: |0 s9 F6 b. C
[size=1em] if thischarcode < &h80 then
0 j; K# i }5 Y[size=1em] strreturn = strreturn & chr(thischarcode)
" X/ `( Z- ~2 W[size=1em] else w8 S* y6 o7 }$ z" S- S
[size=1em] nextcharcode = ascb(midb(vin,i+1,1))8 }8 D$ @% X2 S, {0 b% W
[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
: h' ~! r5 c6 d; N0 X7 M% a9 n[size=1em] i = i + 1
2 [% S, g6 i8 t S# c[size=1em] end if
' w# a% Z" e3 q6 c/ k( b[size=1em] next
L% c7 J o/ [; k" ]# L* G$ J: t) [[size=1em] Bytes2BStr = strreturn
i# V# B) t2 _- S+ }# x[size=1em]End Function
4 F& ~; v- ]+ o6 H% Q6 v4 j
7 R2 n, ~: a5 s9 I7 `3 R$ {, i6 U5 D C | 8 L. b: W3 g* _8 ]2 F; F
# O5 E" r! y! ^1 T
; a) G, i% a0 c7 g/ i
9 l$ j& k5 `0 n1 K
8 i0 |5 k. J+ @7 j. E8 J- ~ 3)事件onreadystatechange,状态转换函数 D4 z" Y; c, D# t- `2 b4 t/ q, l
9 D4 I j0 V. |" m7 A# S4 y/ R0 T- A
4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。' ~! T" p) ]+ N. l) a" J
参考( V8 L, ?& o" ^9 L( W- n! z, T
ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容
: l4 q# W5 A m4 w5 m* i R9 F( O) @: R0 I, ]! o6 ^
容易出现错误的问题* J" S5 ~: ?. z8 k% W/ t
1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。 {1 D& D- t$ E I6 d5 A7 d7 M
' b) k5 q1 s; U; i- w$ g
2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写 f7 z( x0 \( ^7 u! o, e
+ d4 b, b S+ M+ R& Z- s" X( c) j3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写
* J/ I6 {, W4 ]# K; s4 w6 J; R
# j; _8 V) G) H$ d1 D4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。+ M$ E( I! S& t8 {
特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。; U4 X$ [+ i1 y1 j0 Z/ o& \7 s
: B. r. C @6 \4 J 对于手写ajax代码一些建议+ ~. w$ @: U- n z* o8 T
1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。
- \1 `0 E8 t4 T4 A% \参考webservice json! t+ @- Z+ ?* y4 p; \" f* e% H
- h9 [0 N! }# p2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);: V5 b( I3 I- X% r2 m4 X" j3 U) U
% P3 Y! _) V3 _4 V$ W3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded/ s n& f5 c! a" S
* |. }( U# [$ m7 F9 W& W4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用
# x; p1 h# W- O( a8 u* |7 X6 T9 B R9 q8 z/ s
[backcolor=white !important][size=1em]JavaScript code
- d/ l3 i" Y, Q* z3 z; |[color=white !important][size=1em] ? 4 \, f7 T' r$ y. S& Z% E2 f3 y% k
[size=1em]1 9 d5 ?- j/ r ~: K; ~: i& U: R1 u9 D
[size=1em]2
4 C* W9 v" g9 N. M3 w5 P[size=1em]3 9 `% ]9 }) F4 P/ p* i. O" A
[size=1em]4 9 N& C4 b3 w* R. R% g2 q) s+ ~2 g
[size=1em]5
1 m: q/ u& v% Q0 E5 l3 p% H[size=1em]6 " s7 W' ?& i. j1 {/ p3 y
[size=1em]7 , \/ ?6 A" ^' L" E1 T# N& s
[size=1em]8
) {3 ^: M T) b) c[size=1em]9 b/ v6 ?( w+ u8 ?
[size=1em]10
2 y; C z Z7 i5 m7 M/ h& }: K, W[size=1em]11 0 }. j$ D- F; u. ?
| [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");7 a1 X, _4 O1 @' m. }- m% {
[size=1em] xhr.open('get', 'index.html', true);
|& u. t, A5 ] ]# Q8 s7 p[size=1em] xhr.onreadystatechange = function () {
9 W Y& q" V& p) P0 w' C+ T9 _[size=1em] if (4 == xhr.readyState) { T, L- v" W- n% Y+ ^8 K% B. R
[size=1em] if (200 == xhr.status || 0 == xhr.status) {! y; [2 M5 J. s
[size=1em] //=========正常返回后的处理代码
8 c' H+ l( ~2 M2 O[size=1em] } \' X0 W* L! t6 r! b6 w
[size=1em] else alert('动态页出问题了~~');7 P; |/ K% n$ f9 V+ }. q: c8 b
[size=1em] }
Z# }) k( l% c; K# U& @3 @[size=1em] }
( N+ ~2 T8 f* d" Q2 x[size=1em] xhr.send(null);
! n5 Q) m; \; Q3 Q
, w1 R* J. C2 ?" f | , U3 r! Z/ a( L0 p; w
' z5 E8 Y+ b0 s s/ |( M
. }+ y, }' V2 T& A6 u8 I/ n+ y
3 [% J! d N* I% G1 i0 k+ g; Q4 G$ ?9 l
: v% w1 J$ o; Q' C
5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。
6 b* l( l/ y I- X! I7 v7 v如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。
7 c$ V( t$ ]4 z) h( h% G+ N |
zan
|