在线时间 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 N7 Y" p. q) o# k/ d. E, F
2 v4 C5 N3 C0 r( m% a
下面是ajax对象的一些常用属性,事件和方法
3 ^7 `# `5 W& O7 u3 V. d 1)标准的ajax对象的属性有readyState,status,responseText,responseXML $ V9 `* m7 y o0 h4 n1 n% }
7 n3 z& ?& c) Z9 X 2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。
6 y7 s0 k2 v& X. u# F4 Y# P1 W3 J) x [backcolor=white !important][size=1em]Visual Basic code0 J1 W; G2 g* p9 j# z2 h( Q
[color=white !important][size=1em]
? - E- j5 T) i! [5 e7 T' x7 ]
[size=1em]1
# v7 T: Q/ U+ \+ w) `+ }* Z [size=1em]2
& x8 Q( n+ Y/ a' W+ W6 @6 b, v' E
[size=1em]3
: G/ a+ c! `, s0 Y% _6 d
[size=1em]4
/ [8 D% K; v# R
[size=1em]5
* C9 |, i+ j3 C" i+ X
[size=1em]6
0 e. a: U1 D" E, _& n J9 D6 j [size=1em]7
1 J$ T9 }3 h& t l
[size=1em]8
" |; P, E- o U# r& G' V
[size=1em]9
* ^) k, n- a! ^$ \* {2 x2 Y6 w
[size=1em]10
x8 A& M1 l, l2 z8 n \
[size=1em]11
5 {4 Z8 a' Z! F0 Q$ S N
[size=1em]12
1 }7 Q1 j3 P4 B& S/ v& t! V, l [size=1em]13
$ q& b& K/ {5 A
[size=1em]14
. J+ S( F7 F7 `+ k
[size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串
6 a9 |! L! F n) [ [size=1em] strreturn = ""
+ N5 g5 {5 V. X [size=1em] for i = 1 to lenb(vin)' @; m" q1 _2 W4 N
[size=1em] thischarcode = ascb(midb(vin,i,1))
, G( r" S# H0 N! o& |. G [size=1em] if thischarcode < &h80 then
/ t" F3 B( t6 q3 ~6 e [size=1em] strreturn = strreturn & chr(thischarcode)
: Q( o* B: \- W: V [size=1em] else9 s; N! K- C! @
[size=1em] nextcharcode = ascb(midb(vin,i+1,1))
/ M% b$ L( ]0 b [size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
! S- ~& u! x$ {; q; Z9 a6 l [size=1em] i = i + 1, ?5 k4 j9 y% L" v0 `
[size=1em] end if B) l& w# q: R0 ?: Z6 j
[size=1em] next5 p* U& m" B+ Z: t% E* g& b9 z
[size=1em] Bytes2BStr = strreturn
5 T; `- |6 E9 P: m [size=1em]End Function3 B2 a. a2 V2 d5 _: i" T
[# w6 K8 L" T6 w' Y' T
+ S- Q+ q0 d+ q1 U5 `6 R2 l6 r
/ ^4 M6 ^6 ]5 ~& a4 G/ Z
6 g/ j5 a7 i7 h) D" }
& q9 @! W" D8 R2 G * F0 I( G+ B" x
3)事件onreadystatechange,状态转换函数
, v- F; L2 `1 S$ B
+ S3 P- S" ]# _$ e# V 4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。 P& Q7 Z2 u6 y) I( m3 |9 `
参考
7 _0 H, A3 w$ G% l. U ajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容 4 B1 s7 v3 ^. i& b8 Q
4 `$ H* t3 J, x: p8 y6 R& _
容易出现错误的问题
( S0 p/ D3 l3 Y$ i4 V0 ~: J 1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。 : z# G% \3 O1 n+ C
: S4 W- F$ p5 Y9 e 2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写
# { x4 I$ a& Y; B; {8 Q / V/ H6 d' ]$ {7 Z; E" `) V
3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写
% W2 s9 v9 ~. [6 ^* u4 r6 Q
" X2 h1 G7 h' v: _* n1 S1 r 4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。
; s" I0 v6 g$ S 特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。 5 i5 x( i: N6 h* G' ?7 D( G# P4 |
; g5 L* H& o8 H( e6 d+ W% h, ?
对于手写ajax代码一些建议
$ R0 \( m# A" o# r 1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。
x( v' b; W0 C( Z3 k1 d( l, { 参考 webservice json 9 V' ^9 g& L* F4 L# @5 [6 b3 x
& u3 V. f' n$ m& n8 r; @ 2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null); 4 H. G7 E$ D3 w) e& d+ T% Y' d7 R1 G
# L: J+ m+ i5 c8 A6 V0 V/ z0 v1 j3 l
3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded # f' c9 Z& Y0 ]7 E" w' o, I
" R3 X, H1 {( t' A
4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用 & o7 _& m* y+ g' V
, H- [) r) B8 k8 G n! L9 k [backcolor=white !important][size=1em]JavaScript code3 x% u7 Q7 B1 T: |0 H# Z
[color=white !important][size=1em]
?
7 ` e0 y6 g( o. n. I [size=1em]1
" \8 Z; C2 I; b/ L
[size=1em]2
; S+ X, R. J! ?. ~3 ~ [size=1em]3
4 D( k6 B6 Z7 @4 {1 o% X; O7 L
[size=1em]4
3 g/ {, ?3 H* U, Y
[size=1em]5
; p A; f. v+ g8 G* L+ t [size=1em]6
6 j- Q8 v2 n+ E% D
[size=1em]7
6 m# z/ d% P6 V( e- M; F! i [size=1em]8
( }' R" A. c# q
[size=1em]9
6 u: L2 p% e7 d3 O
[size=1em]10
# ] w( _. v% _8 H% n4 Q
[size=1em]11
9 f: o5 o% q. k6 G9 x. a/ k+ E F8 l/ Y- \
[size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");
; D3 j" X" T" g [size=1em] xhr.open('get', 'index.html', true);' W$ H0 m; S% D8 E# b: t; H# @" d- S
[size=1em] xhr.onreadystatechange = function () {" V+ h8 Q: V, F# l
[size=1em] if (4 == xhr.readyState) {( Z# E/ c% ]) V' f
[size=1em] if (200 == xhr.status || 0 == xhr.status) {
# Y, |2 }( j2 x) _ [size=1em] //=========正常返回后的处理代码3 R5 k4 u& u" a i- }7 X1 x* ^
[size=1em] }, n8 V7 G2 n3 _8 x9 q# V! y
[size=1em] else alert('动态页出问题了~~');
, \$ g( X% c6 W' n# n- c5 g) y& n4 d [size=1em] }: f( |# ~* d0 y5 \) U
[size=1em] }
- m# u! O# H$ }3 a [size=1em] xhr.send(null);
7 z3 C( J: m+ z
- r7 F* @* Q( F7 T0 K
5 k4 z/ a1 f+ _; ?- j
+ b# H: {! u# H8 z7 X
! s2 v2 }( w' i
+ m/ E5 U& u7 f4 Q3 d; r
|8 Y4 h$ V7 h ` |( t # l. y0 v* ~+ m: ?
5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。
; W* l$ V2 q# B% N* r7 Z 如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。 ) T, F8 k+ H" p6 o8 J. j7 b/ }
zan