- 在线时间
- 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版块好多问题都是属性,方法,事件大小写不区分,导致程序运行出问题,或者在不同浏览器下效果不出来或者出错。
- s1 I1 V( ]2 @2 a3 H$ w4 C3 h' [$ k1 V! Q
下面是ajax对象的一些常用属性,事件和方法
( m P ~9 J. p- L 1)标准的ajax对象的属性有readyState,status,responseText,responseXML& V+ ?+ e0 g" E8 Q
% s; L' g$ N- l! R1 W 2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流。如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题。 ( I& R: V& w5 R6 n9 X
[backcolor=white !important][size=1em]Visual Basic code
" m. U- A* `7 Q! m/ m[color=white !important][size=1em] ?
" n1 a+ D: u g G6 |& I[size=1em]1
# [# R* W8 d' H[size=1em]2
/ \2 N, {& u, X8 K[size=1em]3
( X3 [" w6 D3 ]& @[size=1em]4
W0 e5 U" ]; D7 x5 L( W$ r[size=1em]5 & k, e* @! K6 _5 H0 C
[size=1em]6 p) h- X: @+ n& n$ D
[size=1em]7 . o) N( {, k" j U0 L/ h+ B
[size=1em]8 + _; \3 F+ x5 G5 W' U$ z9 Q- f
[size=1em]9 / V& ~ _7 [2 |, l4 A# |
[size=1em]10
. i8 `; ]: J7 f: }% R[size=1em]11
! F$ M/ F" y+ L. U- |[size=1em]12 5 t x: i9 e8 e A* s
[size=1em]13
1 d- m, R% W# H5 h9 Y, z0 G[size=1em]14 3 C7 @. a+ T( r- i U
| [size=1em][size=1em]Function Bytes2BStr(vin)'二进制转字串 V0 Y7 m# E( g; v7 M# N* J6 s
[size=1em] strreturn = """ P1 ?4 q9 |8 c- w) z5 w8 E1 D
[size=1em] for i = 1 to lenb(vin)
% j7 C5 P& S" {[size=1em] thischarcode = ascb(midb(vin,i,1))1 r5 A8 \! z% t$ ~% E$ P$ P* ]
[size=1em] if thischarcode < &h80 then
: x: g8 y+ y; k" T: T$ ~$ o[size=1em] strreturn = strreturn & chr(thischarcode)/ x) N4 m/ Z9 c9 Q% f
[size=1em] else
) G! V# @0 e, L( T% B" G[size=1em] nextcharcode = ascb(midb(vin,i+1,1))9 t. V/ M4 u F ~' n. j
[size=1em] strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))$ \! B" j3 z; O. f X
[size=1em] i = i + 1
3 c4 f% t: J" y[size=1em] end if4 s/ r8 V+ p; Q B" y6 G
[size=1em] next
9 {( d) {( @& V[size=1em] Bytes2BStr = strreturn
2 S2 C0 ^6 K2 O7 C[size=1em]End Function' Z. R2 o3 |0 u( Z
' R+ T3 ~; @7 u& [' U, F, D | + s, J7 Y; R2 \& E0 {. m7 _$ |% G
: f; m0 I& z/ N/ s' Z, d# K. t
* m3 w: i$ A+ R5 e4 p9 C* e6 R) Y; t/ a7 G
+ L, M7 V! v* q, s4 W 3)事件onreadystatechange,状态转换函数* {0 G1 O8 n0 s! |1 w3 @
0 _7 Z' V1 B8 |( T% m) x2 d" Z 4)方法有setRequestHeader,open,send,用于设置响应头的,当指定提交方法为POST的时候,需要设置content-type为application/x-www-form-urlencoded,如果未设置这个响应头,请求的动态页无法使用键值对的形式获取到值,不过可以从二进制流中生成提交的数据。7 S) q1 Z. G- O) U6 {
参考
2 s& }1 i8 r8 R. \( s5 d: A5 Aajax指定为post但是未设置content-type或未指定键时时如何获取提交的内容. m: V9 K' _" v* c' d
' E" {, g: J7 J: D
容易出现错误的问题
- p0 {0 g+ i! y4 o# U1)对于使用XMLHttpRequest创建的对象,包括IE7+,属性是严格区分大小写的,一定要注意大小写的问题,要不不区分大小,属性值就是 undefined。如readyState写成readystate,responseText写成responsetext。
/ N3 u3 h2 h8 |. k* \, G) V4 a6 ^$ b) E# B; t8 V8 y$ s
2)对于IE浏览器,如果是先判断activexobject,那么会执行activexobject创建xhr对象,使用acx创建的xhr对象,属性,事件,方法都不区分大小写
4 n% |3 A' k! `1 @- T# S, \( `* G
3)使用XMLHttpRequest创建时,onreadystatechange一定全部为小写,要不相当于给xhr对象赋值一个自定义属性,而不是实际的状态转换函数。这样永远都不执行回调。对于IE使用activexobject创建的xhr对象,不区分大小写
+ p% F* z' U! y5 T+ z0 C
2 ~) ]! q2 Q3 f/ k$ u/ a4)同2,3点,XMLHttpRequest创建时,调用方法一定要区分大小写,要不会出错,提示找不到方法。IE使用activexobject创建不会区分大小写。, h- B+ {) d0 {9 J
特别强调的是,一定要调用open方法后,才能执行setRequestHeader方法,要不会出错。+ S, G, u7 F3 n8 S1 }* k+ n1 y7 ^" @/ f
' Y# a8 _0 \, \9 `/ ^+ Y 对于手写ajax代码一些建议
' g' @# W( ~, h, g7 }( ~1)为get提交时,不需要设置content-type了,除非请求的是一些需要检查content-type生成一些对应的数据格式的文件。如 asp.net的webservice会检查content-type,如果指定content-type为application/json,会生成对应的json格式的字符串。2 B% i$ d5 \# ^9 m+ h
参考webservice json7 V6 E' M- `5 D
: S% S' u" K: q
2)为get提交时,如果没有数据,调用send方法时最好添加一个null作为参数。xhr.send(null);& q* f+ ^! E) Z. w
1 d4 q) e0 h Z4 d" s6 F; y' @3)为post提交时,一定不要忘记在调用open方法后,再调用setRequestHeader方法设置content-type为application/x-www-form-urlencoded
6 C% [5 u8 h2 L3 b7 T# J$ m7 M, A5 S8 \" d/ H/ T5 l
4) 在使用responseText,responseXML和responseBody【IE only】,status属性时,需要在readyState==4,status状态==200【在线测试】或者status状态==0【本地测试】时再使用
" C6 i. c& |9 l" c# F% d0 M, T! @4 L
[backcolor=white !important][size=1em]JavaScript code8 F9 J. n5 J1 B0 i$ o
[color=white !important][size=1em] ?
6 L" ~) Y9 Z% f3 h, W& ^[size=1em]1
/ f+ q! x5 \! p+ }6 l8 I! Y[size=1em]2 ! r; q) [2 E, t; ?9 i1 V
[size=1em]3
8 v4 s4 [; y% X `) `4 W- C; G[size=1em]4
: z; V$ S) [+ n& _- ?: Y0 z[size=1em]5
) B1 `: t9 W* P% X8 Y" y[size=1em]6
# ?2 {4 f% N- J[size=1em]7 2 P, j6 k+ W+ R- I/ n) S' q$ W3 N
[size=1em]8 2 U' e0 j! h6 c& ]9 E; O; I( b+ s9 J
[size=1em]9 ( E4 [& G) [# v
[size=1em]10
& ]% F8 E, J. H2 q1 x& X[size=1em]11 & n/ A ^3 j# u1 E) p$ h. O
| [size=1em][size=1em] var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsft.xmlhttp");2 R; E2 g- @# F+ g
[size=1em] xhr.open('get', 'index.html', true);
4 v+ H* Z( G8 b: o+ _[size=1em] xhr.onreadystatechange = function () {* N% R: Z O* {8 e3 O. n W/ m
[size=1em] if (4 == xhr.readyState) {
9 I8 x( Z0 ] _5 C0 b0 b[size=1em] if (200 == xhr.status || 0 == xhr.status) {
0 |9 p% Z2 C1 S2 q[size=1em] //=========正常返回后的处理代码
7 k3 Z8 M. k6 G[size=1em] }. O r, Q+ A. [# `
[size=1em] else alert('动态页出问题了~~');: v' q x) s5 u! R+ h
[size=1em] }8 F* ]+ b2 {2 G+ B
[size=1em] }! r7 ]4 d. t( ]; e3 [* u: q
[size=1em] xhr.send(null);6 R9 J4 x ]+ D: H
1 c: s# D9 l2 m4 M8 {6 S& c9 I6 |; Y9 u |
( }( G G2 C2 m2 g) N6 Q6 y) \8 o8 h0 n' n8 y: T3 O* L1 o, D
/ {( O( X, M1 b0 c# Z
1 Y0 `7 R$ N6 f7 I* F! I" j. M4 ]) y8 d) J6 [/ a$ O8 g; `% h) I
# v! @6 |2 K% o9 Y( y( P) S! O) Z) a5)如果为异步执行时,需要添加状态转换函数,然后在readyState位4时使用responseText或者responseXML属性。$ r4 q0 U% W2 B) c, D9 r- I! j. c
如果为同步执行时,可以在send完后,直接使用responseText或者responseXML属性,不需要添加onreadystatechange状态转换函数了。不过为同步时如果网速慢容易造成浏览器假死,用户体验不好。
! t, d4 B# t1 q" P/ N8 W, { |
zan
|