- 在线时间
- 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版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。
. t) e) B' w$ u; J- W2 h9 W. d; V" z* t
下面是ajax对象的一些常用属性,事件和方法
! G' {+ d$ E5 b 1)标准的ajax对象的属性有readyState,status,responseText,responseXML
2 k2 H. V# Z1 K4 n
- |0 Y! h# @& ~# M! X' V 2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。
5 v* V, s/ F7 w9 i* T' h# K- W[backcolor=white !important][size=1em]Visual Basic code7 ]9 o& ~7 r8 V; N' R5 {" U( Q
[color=white !important][size=1em] ? / i9 K. q, B# k" @$ y. f9 c* G
[size=1em]1 % f) A" p/ u( W' ]4 o) |+ s2 u
[size=1em]2
8 S x# @6 @- N, `& c+ |[size=1em]3 ' b+ ^, a6 w F3 E# A( \* b9 h
[size=1em]4 / @% J6 H0 C0 k& R* u
[size=1em]5
4 _. B! k5 B) o3 {2 k; l# O[size=1em]6 " t! a1 L* j5 _5 }$ g5 j' r0 w: ~
[size=1em]7
3 A6 J! @( R6 E z) y3 ^[size=1em]8 / ]8 @% M2 e' O8 f) J1 J& _! z+ O
[size=1em]9 + Y( _7 Q3 s5 e- D+ z6 G
[size=1em]10 " f" g+ y2 |* U; A' u5 A" C
[size=1em]11 & V9 @9 C4 y! b+ e, w0 Y6 A- }
[size=1em]12
6 M9 I4 K, }" f0 G8 {& ~/ f% U( P[size=1em]13
6 _% D' t o+ P H! r" E! M) o0 U[size=1em]14 1 b( \# h0 ^/ \6 w: z8 | a
| [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串
5 ^: ?, H* ~7 e[size=1em] strreturn = ""% e; u$ x& C6 V+ ?: M
[size=1em] for i = 1 to lenb(vin)
8 X+ S8 F6 X P: Q6 f+ t0 J[size=1em] thischarcode = ascb(midb(vin,i,1))
8 ^% v$ p) V: a [1 u4 k8 \: e[size=1em] if thischarcode < &h80 then
" G5 I) S$ p1 Q$ f8 V I[size=1em] strreturn = strreturn & chr(thischarcode)* K9 C6 O/ ^7 b, p7 O( M, Q: D- s
[size=1em] else
- u8 K* ^0 M: N7 l Q: H$ L[size=1em] nextcharcode = ascb(midb(vin,i+1,1))! R6 m N% O6 @- T& R5 v7 C
[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))+ {! J0 H/ \0 \2 s- J
[size=1em] i = i + 1
8 [8 @# e/ s! @- A[size=1em] end if$ u- ~5 O, ?0 i2 b4 j1 \6 C
[size=1em] next
/ {9 |9 a, o4 \( V$ z[size=1em] Bytes2BStr = strreturn0 _2 n9 X Z1 z4 t2 T( k
[size=1em]End Function
# E! l( ~6 z: t' e9 h8 p9 |- Y0 H# T3 J0 p; f& a
|
4 ] h- E0 q6 I
) y* Q* K$ Y |+ \
& l0 x% O% X5 C2 {( L
* V: k% m0 G0 l/ E- h
) B \; q0 q% g/ [% E" P" ] 3)事件onreadystatechange,状态转换函数
) }2 g: L9 \6 C1 S# C# {3 a2 h# x% ?8 G$ t
4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。
: t* w6 _7 y5 I; P" t4 m+ Q6 e8 Z参考/ ?- h( l( c4 V& T
ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容, g/ E# s% d/ ]) I* \2 Y
3 k5 j9 Z6 T; e
容易出现错误的问题
u, c# T3 H7 ~* k* | a4 A5 k% [3 i1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。) D9 k3 m1 Z* f
# w1 O ?* _: N9 t! z5 } T
2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写
) M0 ]9 ]5 h: s7 h# K5 P" w- J+ D
# g0 F0 `6 r1 r3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写9 a3 H8 W/ s# _5 _; }1 q1 y
9 ~. S$ z0 d7 P9 {) O" D4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。- K {# q- P5 x: ~; ~. ~# b
特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。
6 B6 u% x! a4 c
$ g' m: d+ q3 J! z 对于手写ajax代码一些建议; w' [2 s: ]0 }8 K
1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。
3 f. E. f. L! c; b2 x- I) S) k参考webservice json- d$ h$ v% t# n+ \ d8 D, K2 }2 b
% a! ~5 A0 W$ N) l
2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);7 L* K: @7 i7 b6 N4 ]% z; k
l1 y8 U% Y* b: b7 z% [3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded
( O4 G- y2 d( }+ p2 H7 H' y
& x4 @- c8 i$ z. P0 T1 ~( }4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用
( r& }% q1 }: u/ B1 i6 ~
d6 f; c% @5 y: X b- Q6 H* L[backcolor=white !important][size=1em]JavaScript code
. V7 `6 ^8 d/ M" V, K4 k* k: v2 V[color=white !important][size=1em] ? ) G6 y0 p1 D. H& {% z
[size=1em]1
, }7 u$ ^/ k O! g# g- g[size=1em]2
; m6 @ ?8 |4 V N[size=1em]3
- o ]8 O' \4 i; d& m[size=1em]4 r, y* U6 M4 D! E" r
[size=1em]5 5 `* p7 t& }6 J
[size=1em]6 ( E7 e. ^! D% d4 M! F
[size=1em]7 : B" }0 v! O P6 E1 F- _
[size=1em]8 . O6 p: N& `" \" g V$ X$ X4 y
[size=1em]9
- |; x! z! G5 \[size=1em]10 " z% R; l# O' n6 A2 F/ k$ {7 j
[size=1em]11 " J- `" y9 j7 J
| [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
( e: v7 t: \& R8 O, Q; Q. C# N[size=1em] xhr.open('get', 'index.html', true);
( D0 x( y3 P# P1 t9 z[size=1em] xhr.onreadystatechange = function () {
. a& r; V; ]9 f8 q[size=1em] if (4 == xhr.readyState) {
+ Z$ C6 _: i# r( [6 b[size=1em] if (200 == xhr.status || 0 == xhr.status) {
# |; F; K; H( `, b[size=1em] //=========正常返回后的处理代码
P/ c3 w4 d/ i/ m: K$ \1 c[size=1em] }
: J1 i6 X2 I. s' `% }) z# p[size=1em] else alert('动态页出问题了~~');
3 r: O6 R- j7 Y9 \1 Q[size=1em] }
+ S7 C$ {5 Q9 S: Q[size=1em] }
. |) r U% S; L5 |4 F[size=1em] xhr.send(null);
6 y4 C2 [$ N, ?
0 u8 K/ E6 F6 w4 R9 e | * F- v5 j. A8 R* C/ X9 i
, o4 _+ G J* }6 f7 }0 d0 ?
" j1 r p- d$ l( _+ m! l' W$ y$ ?# d- C
5 T7 {" d8 ]6 o1 M9 Y
9 c& s& ?3 ]) t5 J3 ~1 c3 G5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。
3 ~& Q0 x4 O, w2 N. d4 V6 }如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。
" f' T1 Q0 q6 ^& e7 S) P% j S* g |
zan
|