- 在线时间
- 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 B6 ]0 u# S5 }( @ i- y
5 v! [1 A/ N( d1 V% z4 `+ J1 C3 C 下面是ajax对象的一些常用属性,事件和方法
$ _7 d. E6 _' d+ H" r5 w& R: z 1)标准的ajax对象的属性有readyState,status,responseText,responseXML3 E2 P; t1 o0 t3 D& D A& m$ w4 ]
/ {( u! d+ k+ S& D
2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。 ; E- q4 @# ^3 V1 {0 u# W
[backcolor=white !important][size=1em]Visual Basic code
9 R W, J3 ~1 a: x/ Z* D( E# l1 j[color=white !important][size=1em] ? 0 |8 a5 Z# o; H. Z3 [) k
[size=1em]1
* n3 P6 K) g8 n7 N# z1 U& O[size=1em]2
* s; L$ O8 G1 n% u2 O1 Y+ h+ W[size=1em]3
# U: r- A) v1 s9 l[size=1em]4 7 H5 s y1 |" S. u8 f
[size=1em]5 8 @3 r8 @5 {6 V$ k3 o2 H; Y
[size=1em]6 ! P+ A) K! H K1 `
[size=1em]7 : @ U) ]- e0 t2 [' Z1 O
[size=1em]8
$ |* P6 U3 F+ \6 S4 S; {* v4 ^[size=1em]9
% u' G$ Z; _! J1 k* G6 r* m( Q# \[size=1em]10 1 U) U- F8 z4 z2 a" N: u4 D
[size=1em]11 * n% g1 _% `* F- u' ~
[size=1em]12 3 v8 |3 P' F: \& u/ _6 u+ P
[size=1em]13
h. ?' V: U5 a: H0 t7 v$ s[size=1em]14 3 ~8 ?9 y* f% i! O
| [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串
4 G+ n+ C0 C0 ] I4 N6 a2 y[size=1em] strreturn = ""
4 `5 c3 }6 p# [[size=1em] for i = 1 to lenb(vin)
" N x6 o* c/ h; ?3 {# z[size=1em] thischarcode = ascb(midb(vin,i,1))& k9 |$ m/ C8 u% a1 P% ^) W& ^3 t
[size=1em] if thischarcode < &h80 then
" d5 W9 H6 Q% ~[size=1em] strreturn = strreturn & chr(thischarcode)
: _$ C2 P0 ^# ?. ?9 e+ N0 }. o[size=1em] else
& F+ d2 a6 w# C1 L$ |: n- i[size=1em] nextcharcode = ascb(midb(vin,i+1,1))( x0 f' Q! i% q0 R9 T
[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))5 S# o- g1 o1 e1 b' K/ ^ c
[size=1em] i = i + 1
* ^4 h' Y0 g7 m# J0 |[size=1em] end if" m7 D4 K9 O/ G! ~' A, S9 @" U& f/ K- ~
[size=1em] next# X ]3 d+ }8 `& F0 B0 P& A* f) A( h
[size=1em] Bytes2BStr = strreturn; B# E+ k: O- D5 |
[size=1em]End Function
: k0 g9 @- v0 z6 @! w' K7 s7 U2 e
| ' `! E F- @( R( u. f) S2 z; Q
+ o2 v# q7 v5 h/ ~7 N! U
/ q' {! ^, y/ n/ z6 y
+ t3 s7 I9 d4 Y' \2 S$ O9 v
z( K9 I- N* I 3)事件onreadystatechange,状态转换函数( B! |) F I8 d# q, F/ D1 c
3 C# f( J% Z1 ?+ m1 a" Y 4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。
! {1 X a' ?4 X8 h7 }参考9 r+ b! o) o$ a
ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容
$ v; K3 T0 W( x- D( b) G$ i& u! u; m- @! M! b
容易出现错误的问题7 Q. f+ {% R% z- Y
1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。2 [- i* Y v& O3 ?# A
6 S D. D5 W$ a2 h9 k1 ]
2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写
5 P3 d' j1 J" S; J6 L+ d ^
0 u1 P6 r( w2 k4 ]# l9 A" {3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写
6 A/ ^0 H9 @& ^+ S! ~
" G/ F5 p: \: z0 Y4 o" b* S6 l- F4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。0 \3 X" t/ @0 @) o% K
特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。
; n/ t7 R8 i. m+ e. k9 v6 v
# |+ J" y1 Y/ |* C9 P' o( D+ Y. A 对于手写ajax代码一些建议
1 o+ N1 J R W/ D) Q1 M9 J, @! A5 |8 R1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。8 ~* [1 G( ?! ?9 i
参考webservice json) Y N$ V+ k2 n7 B/ f
4 \& i+ S" w6 v7 i9 C. w2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);" A2 S2 X! I7 ?1 L0 B
* ]0 D7 i/ d3 D( J% T
3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded, ?1 Y2 D; m7 A$ o4 Q8 i" l
% s7 ?0 l; u+ Z4 O3 ^4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用
( N! b6 p& x* J7 f5 G v0 A) o% e# {4 x) S& Q5 `6 j
[backcolor=white !important][size=1em]JavaScript code! e/ S1 N4 f5 h
[color=white !important][size=1em] ?
- d" u9 j, p8 x9 Q& v[size=1em]1 6 b5 R( x+ r p+ x
[size=1em]2
( j( ]3 o, ^+ F; S9 U[size=1em]3
. N: |" w, _6 d9 W' q[size=1em]4
" [& K0 B, I0 ]' ~[size=1em]5 8 a6 ^, G, }* E4 u+ D
[size=1em]6 A5 D( r8 b% T N' A5 U
[size=1em]7
0 |7 E/ ^- T% _" V' o9 |0 G2 ][size=1em]8 2 `' s1 S" Z. [% Y4 [
[size=1em]9
" w& ^/ n6 \1 a6 N[size=1em]10
, O, } P* _2 l5 c t ^' M" Y& U[size=1em]11
% c9 N9 T/ T, a- ~5 ?& S5 Y" E C | [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
: D$ T7 b, M3 w7 t6 ~$ i[size=1em] xhr.open('get', 'index.html', true);8 J( L0 _4 t$ d2 p% D
[size=1em] xhr.onreadystatechange = function () {
7 O e1 Y( K, b! j" ^: G[size=1em] if (4 == xhr.readyState) {1 ]4 j. W- E( r2 Q
[size=1em] if (200 == xhr.status || 0 == xhr.status) {
# Q. J t/ @; m( S& [[size=1em] //=========正常返回后的处理代码! H5 ?. m) {3 t& u0 j e
[size=1em] }
& ]. A' w! h9 F4 ]* J0 t[size=1em] else alert('动态页出问题了~~');5 H, o1 R0 _8 N! J: a% t3 P, E
[size=1em] }
! q: ^+ D( @7 B[size=1em] }
7 l N. A9 E3 B[size=1em] xhr.send(null);5 E* c$ h1 c/ X' N% E; Y, `
% L- B9 T8 I( d8 S$ x" o8 _
| 1 x( B @8 D' M" |4 X* v
% U6 O; q8 ?. g. i7 N8 H7 N
* I% w% P# T( w) }: S4 v2 H+ Q0 P; ~5 M/ L7 K+ W4 k' G1 O6 k, }
) @8 Z! k7 n% d( \
3 j* Q7 q1 e3 K5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。; G: w! u' V2 R6 O$ [3 _0 k
如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。3 r' p# Q; P; n1 E# X
|
zan
|